From 6b3b83073e18cc8bc06d9bbcbbf4be0e1a5481a2 Mon Sep 17 00:00:00 2001 From: Thomas Walker Date: Wed, 25 Aug 2021 11:45:26 +1000 Subject: [PATCH] Update master from website live (#6402) * Update index.tsx (#6278) * Fix updates bit on the website (#6287) * Content management update (#6282) * Add Wes Testimonial. Cleanup. * Typos * Fixed whitespace (#6283) * Update Header.tsx (#6289) * Add CTA block for Web Box eCommerce Course (#6273) * Content update (#6290) * Style fixes (#6291) * Fix styles: CommunityCta * Fix Styles: Homepage * Stylefix: Wes CTA block * Style fixes: Why Keystone * Style fixes: Content Management * Style fixes: Developers * Style fixes: Organisations * Style fixes: Prose lite Reverts text color to default `--text` var per Figma * Style fixes: Docs Home * Stye fixes: examples CTA * Added new content to /updates (#6300) * Update fields.mdx (#6304) * Fixed typo (#6322) * Added top margin to docs page component (#6301) * Added styles to table (#6315) * Added styles to table * Update prose-lite.ts * Update prose-lite.ts * Update prose-lite.ts Co-authored-by: Thomas Walker * Un-nest tags. (#6327) * Fixed link value (#6328) * Update `website_live` (#6336) * Update patch dependencies (patch) (#6253) * Update search config to match new DocSearch config (#6255) * Update dependency/apollo client (#6259) * update apolloclient dependency to latest * changeset * Update dependency @graphql-tools/merge to v7 (#6246) Co-authored-by: Renovate Bot * Rename first to take (#6266) * Expose stacktraces from exceptions thrown in before/after hooks. (#6263) * 6268/next typescript config error (#6269) * add typescript ignoreBuildErrors flag * changeset * Updated /updates with new things (#6272) * Check exceptions returned from GraphQL (#6271) * Lock file maintenance (#6277) * Allow bearer auth in header using sessionToken (#6276) * Use Next 11 in the website (#6256) * 6223/custom pages guide improvements (#6264) * update example to include helper components * update docs and examples * update docs and examples * update to docs * more updates * changeset * correct incorrect props in README.md * update smoke test * update images * update example * update tests * remove next dep from package.json * updates * re-add schema.prisma for admin-ui-navigation example * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Update docs/pages/docs/guides/custom-admin-ui-pages.mdx Co-authored-by: Tim Leslie * Apply suggestions from code review Co-authored-by: Tim Leslie * update docs * revert change to next-env.d.ts * Apply suggestions from code review Co-authored-by: Tim Leslie Co-authored-by: Tim Leslie * Update dependency eslint-plugin-import to ^2.24.0 (#6285) Co-authored-by: Renovate Bot * Fix updates bit on the website (#6288) * Include stacktrace flag (#6267) * Remove `gqlType` option on `autoIncrement` field type (#6280) * Use playwright install-deps (#6294) * Update patch dependencies (patch) (#6284) * Update prisma monorepo to v2.29.0 (minor) (#6292) * Nested filters (#6095) * GraphQL API docs changes (#6297) * Update dependency @types/jest to v27 (#6293) * Ignore generated files in prisma-utils (#6305) * Move import of mergeSchemas (#6310) * Update resolveInput error handling (#6316) * Upgrade Next to 11.1.0 for the website (#6311) * Update @graphql-ts/schema (#6312) * Lock file maintenance (#6320) * Split create/update field input resolvers for relationship fields (#6317) * Expand editable area (#6318) * POC - Expand editable area * Change things * Create cyan-rabbits-look.md Co-authored-by: mitchellhamilton * Fixed import url on CustomNavigation component (#6308) Co-authored-by: Tim Leslie * Update text filter API table (#6330) * Update the tags in the docs navigation (#6329) * Update patch dependencies (patch) (#6331) * Add a GraphQL API upgrade guide (#6281) * Fix issue with VisuallyHidden checkbox interactions in table (#6334) * resolve CHROME BUG * changeset * 6261/fix delete alert (#6296) * refactor confirm procedure to only add success toast on success * new deletion logic in Listview * add crud-notifications test project * update deletion solution to be more pragmatic at scale * update bug fix to be more verbose * update schema.graphql * minor updates * fix yarn lint:examples to not break when running more than one test-project * minor updates to copy * remove log * changeset Co-authored-by: Tim Leslie * Version Packages (#6199) Co-authored-by: github-actions[bot] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Charles Co-authored-by: Renovate Bot Co-authored-by: Mitchell Hamilton Co-authored-by: Tim Leslie Co-authored-by: Ronald Aveling Co-authored-by: Gautam Singh <5769869+gautamsi@users.noreply.github.com> Co-authored-by: Charlie Jonas Co-authored-by: KeystoneJS Release Bot <69774846+keystonejs-release-bot@users.noreply.github.com> Co-authored-by: github-actions[bot] * Release notes for 2021-08-17 release (#6345) * New release notes. * Update index.tsx * Update 2021-08-17.mdx * Update next-env.d.ts * Update index.mdx * Update 2021-08-17.mdx * Fixed markdown for bold styles (#6346) * Update wording on upgrade guide and release notes (#6353) * Updates nav additions (#6366) * Relocated "K5 vs K6" guidance * Updated sidebar navigation content for `/updates` * Update new-graphql-api.mdx (#6375) * Updated URLs (#6374) * Tweaking docs for Next.js walkthrough for latest version (#6383) * Tweaking docs for Next.js walkthrough. * Update next-env.d.ts * Added upgrade notices to GraphQL API related pages (#6387) * Fixed link color inconsistency (#6388) * Add note to use `yarn` in the embedded Next.js guide (#6384) * Tweaking docs for Next.js walkthrough. * Update next-env.d.ts * Update embedded-mode-with-sqlite-nextjs.mdx * [WIP] Related content links (#6360) * WIP: get well in bottom of page * New RelatedContent component. * Added related content for POC * Added more related content cards * Updated guides index * Styles fix for inline code within component Co-authored-by: Thomas Walker * Added 2x testimonials (#6400) Co-authored-by: Mitchell Hamilton Co-authored-by: Ronald Aveling Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Charles Co-authored-by: Renovate Bot Co-authored-by: Tim Leslie Co-authored-by: Gautam Singh <5769869+gautamsi@users.noreply.github.com> Co-authored-by: Charlie Jonas Co-authored-by: KeystoneJS Release Bot <69774846+keystonejs-release-bot@users.noreply.github.com> Co-authored-by: github-actions[bot] --- docs/components/RelatedContent.tsx | 24 ++++++ docs/components/docs/Navigation.tsx | 32 +++++++- docs/components/primitives/Well.tsx | 4 +- docs/lib/prose-lite.ts | 4 +- docs/next-env.d.ts | 3 + docs/pages/docs/apis/auth.mdx | 13 +++ docs/pages/docs/apis/config.mdx | 14 ++++ docs/pages/docs/apis/context.mdx | 20 +++++ docs/pages/docs/apis/db-items.mdx | 20 +++++ docs/pages/docs/apis/fields.mdx | 22 +++++- docs/pages/docs/apis/filters.mdx | 15 ++++ docs/pages/docs/apis/graphql.mdx | 22 ++++++ docs/pages/docs/apis/hooks.mdx | 13 +++ docs/pages/docs/apis/list-items.mdx | 19 +++++ docs/pages/docs/apis/schema.mdx | 27 +++++++ docs/pages/docs/apis/session.mdx | 21 +++++ docs/pages/docs/guides/cli.mdx | 13 +++ .../docs/guides/custom-admin-ui-logo.mdx | 28 +++++++ .../guides/custom-admin-ui-navigation.mdx | 27 +++++++ .../docs/guides/custom-admin-ui-pages.mdx | 29 +++++++ docs/pages/docs/guides/custom-fields.mdx | 17 +++- .../pages/docs/guides/document-field-demo.mdx | 22 ++++++ docs/pages/docs/guides/document-fields.mdx | 22 ++++++ docs/pages/docs/guides/filters.mdx | 15 ++++ docs/pages/docs/guides/hooks.mdx | 10 +++ docs/pages/docs/guides/index.tsx | 60 +++++++++++--- docs/pages/docs/guides/relationships.mdx | 13 +++ docs/pages/docs/guides/testing.mdx | 30 ++++++- docs/pages/docs/guides/virtual-fields.mdx | 21 +++++ docs/pages/docs/index.tsx | 2 +- .../embedded-mode-with-sqlite-nextjs.mdx | 27 ++++++- ...tting-started-with-create-keystone-app.mdx | 26 ++++++ docs/pages/for-developers.tsx | 19 ++++- docs/pages/releases/2021-08-17.mdx | 74 ++++++++++++++++++ docs/pages/releases/index.mdx | 40 +++++----- docs/pages/updates/index.tsx | 24 +++++- .../keystone-5-vs-keystone-6-preview.mdx | 2 +- docs/pages/updates/new-graphql-api.mdx | 9 ++- docs/pages/updates/roadmap.tsx | 2 +- docs/public/assets/benoit-richert.jpg | Bin 0 -> 9566 bytes docs/public/assets/divslingerx.jpg | Bin 0 -> 25015 bytes docs/redirects.js | 7 +- .../crud-notifications/CHANGELOG.md | 1 + 43 files changed, 762 insertions(+), 51 deletions(-) create mode 100644 docs/components/RelatedContent.tsx create mode 100644 docs/pages/releases/2021-08-17.mdx rename docs/pages/{docs/guides => updates}/keystone-5-vs-keystone-6-preview.mdx (98%) create mode 100644 docs/public/assets/benoit-richert.jpg create mode 100644 docs/public/assets/divslingerx.jpg diff --git a/docs/components/RelatedContent.tsx b/docs/components/RelatedContent.tsx new file mode 100644 index 00000000000..425b4cc882b --- /dev/null +++ b/docs/components/RelatedContent.tsx @@ -0,0 +1,24 @@ +/** @jsx jsx */ +import { jsx } from '@emotion/react'; +import { ReactNode } from 'react'; + +import { useMediaQuery } from '../lib/media'; + +export function RelatedContent({ children }: { children: ReactNode }) { + const mq = useMediaQuery(); + + return ( +
a > p > p > code': { + textDecoration: 'none', + }, + })} + > + {children} +
+ ); +} diff --git a/docs/components/docs/Navigation.tsx b/docs/components/docs/Navigation.tsx index f854aea01c7..75264b6f4b6 100644 --- a/docs/components/docs/Navigation.tsx +++ b/docs/components/docs/Navigation.tsx @@ -10,6 +10,7 @@ import { useMediaQuery } from '../../lib/media'; import { useHeaderContext } from '../Header'; import { Badge } from '../primitives/Badge'; import { Type } from '../primitives/Type'; +import { Emoji } from '../primitives/Emoji'; type SectionProps = { label: string; children: ReactNode }; export function Section({ label, children }: SectionProps) { @@ -133,7 +134,6 @@ export function DocsNavigation() { Walkthroughs Examples
- Keystone 5 vs 6 Command Line Relationships @@ -214,6 +214,36 @@ export function UpdatesNavigation({ releases = [] }: { releases: string[] }) { ))}
) : null} +
+ + +   New GraphQL API + + + +   Customisable Admin UI + + + +   Jed’s Prisma Day Talk + + + +   New Core + + + +   New Examples Collection + + + +   Keystone 5 vs 6 + +
); } diff --git a/docs/components/primitives/Well.tsx b/docs/components/primitives/Well.tsx index a08cff47dee..c087f5b7213 100644 --- a/docs/components/primitives/Well.tsx +++ b/docs/components/primitives/Well.tsx @@ -27,6 +27,7 @@ export function Well({ grad = 'grad1', heading, href, children, ...props }: Well color: 'var(--text)', overflow: 'hidden', transition: 'box-shadow 0.2s ease, transform 0.2s ease, padding 0.2s ease', + textDecoration: 'none !important', ':before': { content: '""', position: 'absolute', @@ -47,8 +48,9 @@ export function Well({ grad = 'grad1', heading, href, children, ...props }: Well as="h2" look="heading20bold" css={{ - margin: '0 0 1rem 0', + margin: '0 0 1rem 0 !important', paddingRight: '2rem', + fontSize: '1.25rem !important', }} > {heading} → diff --git a/docs/lib/prose-lite.ts b/docs/lib/prose-lite.ts index d96b0595a7c..fbf5edd053d 100644 --- a/docs/lib/prose-lite.ts +++ b/docs/lib/prose-lite.ts @@ -7,15 +7,15 @@ export const proseStyles = { content: '""', }, a: { - color: 'var(--text)', textDecoration: 'underline', fontWeight: 500, + color: 'inherit', }, 'a:hover': { color: 'var(--link)', }, strong: { - color: 'var(--text)', + color: 'inherit', fontWeight: 600, }, 'ol[type="A"], ol[type="A" s]': { diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts index f87ea7fa66a..6ab0ecc22f4 100644 --- a/docs/next-env.d.ts +++ b/docs/next-env.d.ts @@ -2,3 +2,6 @@ /// /// /// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/docs/pages/docs/apis/auth.mdx b/docs/pages/docs/apis/auth.mdx index 98a96d5a746..cd2c77ff6ab 100644 --- a/docs/pages/docs/apis/auth.mdx +++ b/docs/pages/docs/apis/auth.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Authentication API @@ -475,4 +477,15 @@ If the token has expired the value `{ code: TOKEN_EXPIRED, message: 'The auth to If the token is valid then the session handler will start a new session and return the encoded session cookie data as `sessionToken`. The authenticated item will be returned as `item`. +## Related resources + + + + Adds password-based authentication to the Task Manager starter project. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/config.mdx b/docs/pages/docs/apis/config.mdx index a88be185166..f6c774576f1 100644 --- a/docs/pages/docs/apis/config.mdx +++ b/docs/pages/docs/apis/config.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # System Configuration API @@ -405,4 +408,15 @@ Options: - `generateNextGraphqlAPI`: Creates a file at `node_modules/.keystone/next/graphql-api` with `default` and `config` exports that can be re-exported in a Next API route - `generateNodeAPI`: Creates a file at `node_modules/.keystone/api` with a `lists` export +## Related resources + + + + The API to configure your options used with the list function. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/context.mdx b/docs/pages/docs/apis/context.mdx index e075db84568..381fc080bf4 100644 --- a/docs/pages/docs/apis/context.mdx +++ b/docs/pages/docs/apis/context.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # Context API @@ -161,4 +164,21 @@ They will be removed in future releases. `gqlNames`: A function which takes a `listKey` and returns an object containing the GraphQL query, mutation and type names related to that list. +## Related resources + + + + A programmatic API for running CRUD operations against your GraphQL API. For each list in your system you get an API at context.lists.<listName> + + + The API for running CRUD operations against the internal GraphQL resolvers in your system. It returns internal item objects, which can be returned from GraphQL resolvers. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/db-items.mdx b/docs/pages/docs/apis/db-items.mdx index e857f995535..375ebabca99 100644 --- a/docs/pages/docs/apis/db-items.mdx +++ b/docs/pages/docs/apis/db-items.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # Database Items API @@ -140,4 +143,21 @@ const users = await context.db.lists.User.deleteMany({ }); ``` +## Related resources + + + + A programmatic API for running CRUD operations against your GraphQL API. For each list in your system you get an API at context.lists.<listName>. + + + The API for run-time functionality in your Keystone system. Use it to write business logic for access control, hooks, testing, GraphQL schema extensions, and more. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/fields.mdx b/docs/pages/docs/apis/fields.mdx index a5b16a48791..9bbd12cb497 100644 --- a/docs/pages/docs/apis/fields.mdx +++ b/docs/pages/docs/apis/fields.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # Fields API @@ -731,4 +734,21 @@ export default config({ }); ``` -export default ({ children }) => {children}; +## Related resources + + + + The API to configure your options used with the list() function. + + + A complete CRUD (create, read, update, delete) GraphQL API derived from the list and field names you configure in your system. + + + +export default ({ children }) => {children} diff --git a/docs/pages/docs/apis/filters.mdx b/docs/pages/docs/apis/filters.mdx index 5e58fc12cad..dabc8c8c8c9 100644 --- a/docs/pages/docs/apis/filters.mdx +++ b/docs/pages/docs/apis/filters.mdx @@ -1,7 +1,11 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Query Filter API +?> We recently improved this API so it’s easier to program and reason about. If you were using it prior to August 17th 2021, [read this guide](/updates/new-graphql-api) for info on how to upgrade. + Each field type provides its own set of filters which can be used with [queries](./graphql#all-users). This page lists all the filters available for each field type. For more details on how to use filters in queries please consult to the [GraphQL Queries - Filters](../guides/filters) guide. @@ -147,4 +151,15 @@ The `file` field type does not support filters. The `image` field type does not support filters. +## Related resources + + + + Query filters are an integral part of Keystone’s powerful GraphQL APIs. This guide will show you how to use filters to get the data you need from your system. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/graphql.mdx b/docs/pages/docs/apis/graphql.mdx index c3a2ca5ffb6..5692f5e1635 100644 --- a/docs/pages/docs/apis/graphql.mdx +++ b/docs/pages/docs/apis/graphql.mdx @@ -1,7 +1,12 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # GraphQL API +?> We recently improved this API so it’s easier to program and reason about. If you were using it prior to August 17th 2021, [read this guide](/updates/new-graphql-api) for info on how to upgrade. + Keystone generates a CRUD (create, read, update, delete) GraphQL API based on the [schema](./schema) definition provided in the system [config](./config). Consider the following system definition: @@ -407,4 +412,21 @@ type User { } ``` +## Related resources + + + + The API to configure your options used with the list() function. + + + The API to configure all the parts parts of your Keystone system. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/hooks.mdx b/docs/pages/docs/apis/hooks.mdx index c14c16234ba..e622bd8100c 100644 --- a/docs/pages/docs/apis/hooks.mdx +++ b/docs/pages/docs/apis/hooks.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Hooks API @@ -438,4 +440,15 @@ The data resolving steps are applied in the following order: 5. Field hooks (user defined): A `resolveInput` field hook can return a new value for its field, which will the current field value on `resolvedData`. 6. List hooks (user defined): A `resolveInput` list hook can return a new value for the entire `resolvedData` object. +## Related resources + + + + Learn how to use Hooks within your schema to extend Keystone’s powerful CRUD GraphQL APIs with your own business logic. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/list-items.mdx b/docs/pages/docs/apis/list-items.mdx index 12630497fd1..b0006bf5a1f 100644 --- a/docs/pages/docs/apis/list-items.mdx +++ b/docs/pages/docs/apis/list-items.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # List Items API @@ -144,4 +146,21 @@ const users = await context.lists.User.deleteMany({ }); ``` +## Related resources + + + + The API for run-time functionality in your Keystone system. Use it to write business logic for access control, hooks, testing, GraphQL schema extensions, and more. + + + The API for running CRUD operations against the internal GraphQL resolvers in your system. It returns internal item objects, which can be returned from GraphQL resolvers. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/schema.mdx b/docs/pages/docs/apis/schema.mdx index 9e98cf21fe6..bb153ecab99 100644 --- a/docs/pages/docs/apis/schema.mdx +++ b/docs/pages/docs/apis/schema.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Schema API @@ -207,4 +209,29 @@ export default config({ The `description` option defines a string which will be used as a description in the Admin UI and GraphQL API docs. This option can be individually overridden by the `graphql.description` or `ui.description` options. +## Related resources + + + + Defines the names, types, and configuration of Keystone fields. See all the fields and the configuration options they accept. + + + The API to configure all the parts parts of your Keystone system. + + + A basic Blog schema with Posts and Authors. Use this as a starting place for learning how to use Keystone. It’s also a starter for other feature projects. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/apis/session.mdx b/docs/pages/docs/apis/session.mdx index 4fb33c01333..b860e00e9aa 100644 --- a/docs/pages/docs/apis/session.mdx +++ b/docs/pages/docs/apis/session.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Session API @@ -122,4 +124,23 @@ If you configure your Keystone session with session management then the [`Keysto The `startSession` and `endSession` functions will be used by [authentication mutations](./auth) to start and end authenticated sessions. These mutations will set the value of `session` to include the values `{ listKey, itemId }`. +## Related resources + + + + The API to configure all the parts parts of your Keystone system. + + + Adds password-based authentication to the Task Manager starter project. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/cli.mdx b/docs/pages/docs/guides/cli.mdx index be2393cfa40..4419dcac954 100644 --- a/docs/pages/docs/guides/cli.mdx +++ b/docs/pages/docs/guides/cli.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Command Line @@ -186,4 +188,15 @@ yarn keystone-next start - If you promote your build through separate environments in a pipeline (e.g testing → staging → production) you should run migrations during the **promote** step and **not** as part of the build script. - It is important you do **not run migrations against your production database from staging builds**. If you have staging or preview environments set up in production, make sure they are not pointed to your production database. +## Related resources + + + + How to use Keystone's CLI app to standup a new local project with an Admin UI & the GraphQL API playground. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/custom-admin-ui-logo.mdx b/docs/pages/docs/guides/custom-admin-ui-logo.mdx index 00c11d9d90e..e363a2cec0c 100644 --- a/docs/pages/docs/guides/custom-admin-ui-logo.mdx +++ b/docs/pages/docs/guides/custom-admin-ui-logo.mdx @@ -1,6 +1,8 @@ import { ComingSoon } from '../../../components/docs/ComingSoon'; import { Markdown } from '../../../components/Markdown'; import { Alert } from '../../../components/primitives/Alert' +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Custom Admin UI Logo @@ -46,4 +48,30 @@ Of course this is purely a recommendation, if you would prefer to roll your own Once you've added your custom logo component you should see it rendered out in the Admin UI. ![image of Admin UI with custom logo](/assets/guides/custom-admin-ui-logo/custom-logo-result.png) +## Related resources + + + + Adds a custom logo component in the Admin UI. Builds on the Task Manager starter project. + + + Learn how to create your own custom Navigation components in Keytone’s Admin UI. + + + Learn how to add your own custom pages to Keystone’s Admin UI. + + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/custom-admin-ui-navigation.mdx b/docs/pages/docs/guides/custom-admin-ui-navigation.mdx index 1ed9376ef94..56482dcfcfe 100644 --- a/docs/pages/docs/guides/custom-admin-ui-navigation.mdx +++ b/docs/pages/docs/guides/custom-admin-ui-navigation.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Custom Admin UI Navigation @@ -304,4 +306,29 @@ type NavItemProps = { By default the `isSelected` value will be evaluated by the condition `router.pathname === href`. Pass in `isSelected` if you have a custom condition or would like more granular control over the "selected" state of Navigation items. +## Related resources + + + + Adds a custom navigation component to the Admin UI. Builds on the Task Manager starter project. + + + Learn how to add your own custom logo to Keystone’s Admin UI. + + + Learn how to add your own custom pages to Keystone’s Admin UI. + + + export default ({ children }) => {children} diff --git a/docs/pages/docs/guides/custom-admin-ui-pages.mdx b/docs/pages/docs/guides/custom-admin-ui-pages.mdx index b587f0c4f83..d11de9a0bf3 100644 --- a/docs/pages/docs/guides/custom-admin-ui-pages.mdx +++ b/docs/pages/docs/guides/custom-admin-ui-pages.mdx @@ -1,6 +1,8 @@ import { ComingSoon } from '../../../components/docs/ComingSoon'; import { Markdown } from '../../../components/Markdown'; import { Alert } from '../../../components/primitives/Alert'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Custom Admin UI Pages @@ -9,6 +11,8 @@ import { Alert } from '../../../components/primitives/Alert'; In this guide we'll show you how to add custom pages to the Keystone Admin UI. As the Admin UI is built on top of [Next.js](https://nextjs.org/docs/basic-features/pages), it exposes the same pages directory for adding custom pages. +## Getting started + To create a custom page, ensure that the `admin/pages` directory exists in the root of your Keystone Project. Much like with Next.js, all files in this directory will be added as routes to the Admin UI. The default export of every file in this directory is expected to be a valid React Component rendered out as the contents of the route. @@ -173,4 +177,29 @@ export default function CustomPage () { Using `emotion` for styling is purely a recommendation, if you would prefer to use another css-in-js or css solution for your custom component please feel free to. This may require additional configuration currently outside of the scope of this guide. +## Related resources + + + + Adds a custom page in the Admin UI. Builds on the Task Manager starter project. + + + Learn how to add your own custom logo to Keystone’s Admin UI. + + + Learn how to create your own custom Navigation components in Keytone’s Admin UI. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/custom-fields.mdx b/docs/pages/docs/guides/custom-fields.mdx index 60acc7995f5..910f91588c4 100644 --- a/docs/pages/docs/guides/custom-fields.mdx +++ b/docs/pages/docs/guides/custom-fields.mdx @@ -1,5 +1,7 @@ -import { ComingSoon } from '../../../components/docs/ComingSoon'; import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # Custom Fields @@ -223,4 +225,17 @@ export const CardValue: CardValueComponent = ({ item, field }) => { }; ``` +## Related resources + + + + Adds a custom field type based on the integer field type which lets users rate items on a 5-star scale. Builds on the Blog starter project. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/document-field-demo.mdx b/docs/pages/docs/guides/document-field-demo.mdx index 5f906a89733..d80abb27b26 100644 --- a/docs/pages/docs/guides/document-field-demo.mdx +++ b/docs/pages/docs/guides/document-field-demo.mdx @@ -9,6 +9,9 @@ import { DocumentFeaturesProvider, } from '../../../components/docs/DocumentEditorDemo'; import Intro from './_doc-field-intro.mdx'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; ## Configure the demo @@ -51,3 +54,22 @@ export default ({ children }) => { ); }; + +## Related resources + + + + Keystone’s document field is a highly customisable rich text editor that stores content as structured JSON. Learn how to configure it and incorporate your own custom React components. + + + Illustrates how to configure document fields in your Keystone system and render their data in a frontend application. Builds on the Blog starter project. + + diff --git a/docs/pages/docs/guides/document-fields.mdx b/docs/pages/docs/guides/document-fields.mdx index 5038fdcd3bc..b167b735d1d 100644 --- a/docs/pages/docs/guides/document-fields.mdx +++ b/docs/pages/docs/guides/document-fields.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # How To Use Document Fields @@ -676,4 +679,23 @@ const componentBlockRenderers: InferRenderersForComponentBlocks; ``` +## Related resources + + + + Illustrates how to configure document fields in your Keystone system and render their data in a frontend application. Builds on the Blog starter project. + + + Test drive the many features of Keystone’s Document field on this website. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/filters.mdx b/docs/pages/docs/guides/filters.mdx index 869cb8acfe3..bca50788605 100644 --- a/docs/pages/docs/guides/filters.mdx +++ b/docs/pages/docs/guides/filters.mdx @@ -1,7 +1,11 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # GraphQL Queries - Filters +?> We recently improved our GraphQL API so it’s easier to program and reason about. If you were using it prior to August 17th 2021, [read this guide](/updates/new-graphql-api) for info on how to upgrade. + Keystone provides a powerful GraphQL API for querying the data in your system. At the core of this API are **query filters**. This guide will show you how to use filters to get data you need. @@ -171,4 +175,15 @@ For example, to find all the people which have `some` posts with the label `"Hel } ``` +## Related resources + + + + The complete list of filters available to Keystone field types. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/hooks.mdx b/docs/pages/docs/guides/hooks.mdx index c6a6f1ddd40..685e5ad9925 100644 --- a/docs/pages/docs/guides/hooks.mdx +++ b/docs/pages/docs/guides/hooks.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Hooks @@ -222,4 +224,12 @@ export default config({ See the [Hooks API](../apis/hooks) for the details of all the arguments available for all the different hook functions. +## Related resources + + + + The complete reference for executing code at different stages of the mutation lifecycle + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/index.tsx b/docs/pages/docs/guides/index.tsx index 57c52da5d11..2da2b2dc68d 100644 --- a/docs/pages/docs/guides/index.tsx +++ b/docs/pages/docs/guides/index.tsx @@ -35,14 +35,6 @@ export default function Docs() { gap: 'var(--space-xlarge)', })} > - - We’re transitioning to Keystone 6 soon. If you’re wondering which version to start a new - project with today, this guide is for you. - Keystone’s CLI helps you develop, build, and deploy projects. This guide explains all you need to standup a new backend in the terminal. @@ -55,14 +47,60 @@ export default function Docs() { Query filters are an integral part of Keystone’s powerful GraphQL APIs. This guide will show you how to use filters to get the data you need from your system. + + Learn how to use Hooks within your schema to extend Keystone’s powerful CRUD GraphQL APIs + with your own business logic. + Keystone’s document field is a highly customisable rich text editor that stores content as structured JSON. Learn how to configure it and incorporate your own custom React components. - - Learn how to use Hooks within your schema to extend Keystone’s powerful CRUD GraphQL APIs - with your own business logic. + + Test drive the many features of Keystone’s Document field on this website. + + + Learn how to define your own custom field types in Keystone, with customisable backend + data structure, and Admin UI appearance. + + + Learn how to test the behaviour of your Keystone system to ensure it does what you expect. + + + Virtual fields offer a powerful way to extend your GraphQL API. This guide introduces the + syntax and shows you how start simply and end up with a complex result. + + + + Admin UI Customisation + +
+ + Learn how to add your own custom logo to Keystone’s Admin UI. + + + Learn how to create your own custom Navigation components in Keytone’s Admin UI. + + + Learn how to add your own custom pages to Keystone’s Admin UI.
diff --git a/docs/pages/docs/guides/relationships.mdx b/docs/pages/docs/guides/relationships.mdx index 621ce1597bb..09ce5b98126 100644 --- a/docs/pages/docs/guides/relationships.mdx +++ b/docs/pages/docs/guides/relationships.mdx @@ -1,5 +1,7 @@ import { Emoji } from '../../../components/primitives/Emoji'; import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Understanding Relationships @@ -314,4 +316,15 @@ export default config({ Keystone relationships are managed using the [relationship](../apis/fields#relationship) field type. They can be configured as one-sided or two-sided by the `ref` config option. Their cardinality can be set using the `many` flag. Keystone gives you the flexibility to choose what you want based on what you need to achieve. +## Related resources + + + + Defines the names, types, and configuration of Keystone fields. See all the fields and the configuration options they accept. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/testing.mdx b/docs/pages/docs/guides/testing.mdx index 1efad75ee7a..325010c37da 100644 --- a/docs/pages/docs/guides/testing.mdx +++ b/docs/pages/docs/guides/testing.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; # Testing @@ -234,4 +237,29 @@ describe('Example tests using test environment', () => { }); ``` -export default ({ children }) => {children}; +## Related resources + + + + Shows you how to write tests against the GraphQL API to your Keystone system. Builds on the Authentication example project. + + + The API for run-time functionality in your Keystone system. Use it to write business logic for access control, hooks, testing, GraphQL schema extensions, and more. + + + A programmatic API for running CRUD operations against your GraphQL API. For each list in your system you get an API at context.lists.<listName>. + + + +export default ({ children }) => {children}; diff --git a/docs/pages/docs/guides/virtual-fields.mdx b/docs/pages/docs/guides/virtual-fields.mdx index d96a87b590c..df452fe9bc5 100644 --- a/docs/pages/docs/guides/virtual-fields.mdx +++ b/docs/pages/docs/guides/virtual-fields.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # Virtual Fields @@ -314,4 +316,23 @@ Another way to address this is to use a [scalar field](../apis/fields#scalar-typ The other main consideration is that it is not possible to filter on a virtual field, as each item calcutes its value dynamically, rather than having it stored in the database. Using a pre-calculated scalar field is the best solution to use if you need filtering for your field. +## Related resources + + + + A demo project that shows you how to add virtual fields to a Keystone list. + + + A virtual field represents a value which is computed a read time, rather than stored in the database. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/index.tsx b/docs/pages/docs/index.tsx index cc10a6895c2..09f26a516a4 100644 --- a/docs/pages/docs/index.tsx +++ b/docs/pages/docs/index.tsx @@ -101,7 +101,7 @@ export default function Docs() { We’re graduating Keystone 6 soon. If you’re wondering which version to start a new project with today, this guide is for you. diff --git a/docs/pages/docs/walkthroughs/embedded-mode-with-sqlite-nextjs.mdx b/docs/pages/docs/walkthroughs/embedded-mode-with-sqlite-nextjs.mdx index 1dbf8e24da5..48e3ee4f8f2 100644 --- a/docs/pages/docs/walkthroughs/embedded-mode-with-sqlite-nextjs.mdx +++ b/docs/pages/docs/walkthroughs/embedded-mode-with-sqlite-nextjs.mdx @@ -1,4 +1,6 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; # How to embed Keystone + SQLite in a Next.js app @@ -38,13 +40,19 @@ Here's what we're going to do: ## Setup a Next.js app -Create a basic Next.js project with the `--typescript` option in an empty directory. +x> **Warning:** We normally advise to set up a new Next.js app with `yarn create next-app --typescript my-project`, however this will install Next.js `11.x`. This version isn't compatible with this guide until we upgrade Keystone's Next.js internals to `11.x`. + +x> To continue, you'll need to use Next.js `10.x` until this upgrade is completed. We've set up a repository below using Next.js `10.x` you can clone in the mean time. + +Clone the basic Next.js project below. ```bash -yarn create next-app --typescript my-project -cd my-project +git clone https://github.com/keystonejs/embedded-mode-with-sqlite-nextjs +cd embedded-mode-with-sqlite-nextjs ``` +Then run `yarn` to install the dependencies. + !> Keystone 6 has great TypeScript support. Including it in your project will make it easier to use Keystone’s APIs later. Delete the `/pages/api` directory. We’ll add a GraphQL API later in the tutorial. Your `/pages` directory should now look like this: @@ -256,7 +264,7 @@ export async function getStaticProps({ params, }: GetStaticPropsContext) { const [post] = await lists.Post.findMany({ - where: { slug: params!.slug as string }, + where: { slug: { equals: params!.slug as string } }, query: 'id title content', }); return { props: { post } }; @@ -317,4 +325,15 @@ Embedded mode is a great way to operate a personal Next.js blog or portfolio wit Keystone’s Embedded mode and SQLite support gives you the option to run a self contained CMS from the same place you keep your frontend code. While this option restricts read-write access to people who can run the project in local development, it has advantages with ease of setup, security, and web deployment. This is also a great way to deploy a read-only API on the web for content you manage on your computer. +## Related resources + + + + How to use Keystone's CLI app to standup a new local project with an Admin UI & the GraphQL API playground. + + + export default ({ children }) => {children}; diff --git a/docs/pages/docs/walkthroughs/getting-started-with-create-keystone-app.mdx b/docs/pages/docs/walkthroughs/getting-started-with-create-keystone-app.mdx index 28005d1e5c8..07efdebe3e7 100644 --- a/docs/pages/docs/walkthroughs/getting-started-with-create-keystone-app.mdx +++ b/docs/pages/docs/walkthroughs/getting-started-with-create-keystone-app.mdx @@ -1,4 +1,7 @@ import { Markdown } from '../../../components/Markdown'; +import { Well } from '../../../components/primitives/Well'; +import { RelatedContent } from '../../../components/RelatedContent'; +import { InlineCode } from '../../../components/primitives/Code'; ![A terminal with the output of create-keystone-app](/assets/walkthroughs/getting-started/cover.svg) @@ -120,4 +123,27 @@ Read more about the cli in our [command line guides](/guides/cli). - Customise Keystone with the [System Configuration API](/apis/config). - Add fields and relationships using [Schema API](/apis/schema). +## Related resources + + + + Keystone’s CLI helps you develop, build, and deploy projects. This guide explains all you need to standup a new backend in the terminal. + + + The API to configure your options used with the list() function. + + + The API to configure all the parts parts of your Keystone system. + + + export default ({ children }) => {children} diff --git a/docs/pages/for-developers.tsx b/docs/pages/for-developers.tsx index 9a8d63884a5..5f2df11ab01 100644 --- a/docs/pages/for-developers.tsx +++ b/docs/pages/for-developers.tsx @@ -463,12 +463,29 @@ export default function ForDevelopers() { gridTemplateRows: 'masonry', // experimental and hopefully supported soon })} > + + How good is Keystone support! The answers are fast, thought through, technical when + needed, and always gentle... Kudos to the Keystone team, thank you very much!{' '} + + + + I love how Keystone’s access control lets me declare every single Create, Read, + Update, and Delete operation at both the model and{' '} + field level. It’s my favorite way of implementing Auth. + Working with Keystone is a very satisfying experience. I wrapped up 50% of my app’s - schema, API and seed data in a day . The dev + schema, API and seed data in a day The dev experience feels too good to be true {' '} + + + @KeystoneJS + {' '} + is almost too good to be open source. I can’t stress enough how awesome the dev + experience is. This is what I wish Wordpress was. + I think I'm in love. Keystone‘s just what I needed: a dashboard & GraphQL API that works like a charm. As a frontend dev with skills in node and elastic search, Keystone diff --git a/docs/pages/releases/2021-08-17.mdx b/docs/pages/releases/2021-08-17.mdx new file mode 100644 index 00000000000..fff504f9081 --- /dev/null +++ b/docs/pages/releases/2021-08-17.mdx @@ -0,0 +1,74 @@ +import { Markdown, getStaticProps } from '../../components/Markdown'; +import { Emoji } from '../../components/primitives/Emoji'; + +# Release: 17th August 2021 + +A major milestone in the path to a `General Availability` status for **Keystone 6**, this release includes: + +- **A new and improved GraphQL API** +- Enhancements to Custom Admin UI Pages +- Better deletion notifications +- And more… + +**⚠️   This release contains breaking changes, please see below!** + +```json +"@keystone-ui/notice": "4.0.1", +"@keystone-ui/segmented-control": "4.0.2", +"@keystone-ui/toast": "4.0.2", +"@keystone-next/admin-ui-utils": "5.0.6", +"@keystone-next/auth": "31.0.0", +"@keystone-next/cloudinary": "6.0.6", +"@keystone-next/fields": "14.0.0", +"@keystone-next/fields-document": "8.0.0", +"@keystone-next/keystone": "24.0.0", +"@keystone-next/testing": "1.1.1", +"@keystone-next/types": "24.0.0", +"@keystone-next/utils": "1.0.4", +``` + +## A new & improved GraphQL API + +We’ve made the experience of working with Keystone’s GraphQL API easier to program and reason about: + +- **Queries:** the names of top-level queries are now easier to understand. We also removed deprecated and unused legacy features. +- **Filters:** the arguments used in queries have been updated to accept a filter object for each field, rather than having all the filter options available at the top level. +- **Mutations:** all generated CRUD mutations have the same names and return types, but their inputs have changed. +- **Input Types:** we’ve updated the input types used for relationship fields in `update` and `create` operations, removing obsolete options and making the syntax between the two operations easier to differentiate. + +#### Upgrade guidance + +We've [written a complete guide](https://keystonejs.com/updates/new-graphql-api) to the improvements we've made, and it includes [a checklist of the steps you need to take to upgrade your Keystone projects](https://keystonejs.com/updates/new-graphql-api#upgrade-checklist). Be sure to check it out! + +!> While there are a lot of changes to this API, we've put a lot of effort into making the upgrade process as smooth as possible. If you get stuck or have questions, reach out to us in the [Keystone community slack](https://community.keystonejs.com) to get the help you need. + +Screen Shot 2021-08-17 at 11 28 56 am + +## Custom Admin UI Pages + +Our [Custom Admin UI Pages](https://keystonejs.com/docs/guides/custom-admin-ui-pages) guide has been expanded, with an example to make your custom pages look more like the Admin UI, as well as adding links to your custom pages from the Admin UI Navigation! + +Screen Shot 2021-08-17 at 11 30 39 am + +## Improved Deletion Notifications + +When items are deleted via the Admin UI, we now display all the items that were successfully deleted, and any that failed, instead of displaying multiple notifications without any context. + +Screen Shot 2021-08-17 at 11 04 47 am + +## Deeper GraphQL Errors + +A `config.graphql.debug` option has been added, which can be used to control whether debug information such as stack traces are included in the errors returned by the GraphQL API. + +## Prisma Update + +Updated Prisma dependencies from `2.27.0` to `2.29.0`, check out the [Prisma releases page](https://github.com/prisma/prisma/releases/tag/2.29.0) for more details. + +## Credits + +Added option for `Bearer` token auth when using session, thanks to [@gautamsi](https://github.com/gautamsi)! + +You can also view the [verbose release notes](https://github.com/keystonejs/keystone/releases/tag/2021-08-17) on GitHub. + +export default ({ children, ...props }) => {children}; +export { getStaticProps } diff --git a/docs/pages/releases/index.mdx b/docs/pages/releases/index.mdx index 538727144f1..bc09fae72e6 100644 --- a/docs/pages/releases/index.mdx +++ b/docs/pages/releases/index.mdx @@ -4,75 +4,79 @@ import { Status } from '../../components/primitives/Status'; # Release Notes -## 29th July 2021 +## 17th August 2021 -Custom **navigation**, **pages** and **logo** in this big **Admin UI** themed release! — [read more](/releases/2021-07-29) +A **major milestone** in the path to a General Availability status for Keystone 6 this release includes **new and improved GraphQL API** and more. — [Read more](/releases/2021-08-17) + +## 29th July 2021 + +Custom **navigation**, **pages** and **logo** in this big **Admin UI** themed release! — [Read more](/releases/2021-07-29) ## 13th July 2021 -More examples, types, and UI rendering tweaks as we push forward towards a general availability release! — [read more](/releases/2021-07-13) +More examples, types, and UI rendering tweaks as we push forward towards a general availability release! — [Read more](/releases/2021-07-13) ## 30th June 2021 -We fixed an issue with `cloudinaryImage` and `relationship` fields. — [read more](/releases/2021-06-30) +We fixed an issue with `cloudinaryImage` and `relationship` fields. — [Read more](/releases/2021-06-30) ## 29th June 2021 -The ID Field option has been revamped with `cuid`, `uuid` and `autoincrement` options! — [read more](/releases/2021-06-29) +The ID Field option has been revamped with `cuid`, `uuid` and `autoincrement` options! — [Read more](/releases/2021-06-29) ## 28th June 2021 -A new package to help test the behaviour of your GraphQL API, a document field example, better error messages, accessibility updates and another Prisma update! — [read more](/releases/2021-06-28) +A new package to help test the behaviour of your GraphQL API, a document field example, better error messages, accessibility updates and another Prisma update! — [Read more](/releases/2021-06-28) ## 15th June 2021 -Keystone Next now has a new core , unblocking many of the features you’ve been waiting for! — [read more](/releases/2021-06-15) +Keystone Next now has a new core , unblocking many of the features you’ve been waiting for! — [Read more](/releases/2021-06-15) ## 2nd June 2021 -We have a new JSON field , a bunch of new learning resources, and plenty of under the hood optimisations in this big release. — [read more](/releases/2021-06-02) +We have a new JSON field , a bunch of new learning resources, and plenty of under the hood optimisations in this big release. — [Read more](/releases/2021-06-02) ## 19th May 2021 -Node updates and Admin UI has moved! — [read more](/releases/2021-05-19) +Node updates and Admin UI has moved! — [Read more](/releases/2021-05-19) ## 17th May 2021 -Apollo caching can now be configured for performance and a basic authentication example to get your started — [read more](/releases/2021-05-17) +Apollo caching can now be configured for performance and a basic authentication example to get your started — [Read more](/releases/2021-05-17) ## 11th May 2021 -A bunch of admin UI tweaks in this release , among other minor fixes — [read more](/releases/2021-05-11) +A bunch of admin UI tweaks in this release , among other minor fixes — [Read more](/releases/2021-05-11) ## 5th May 2021 -Aside from dependency updates , we added an `isIndexed` config option to the `text`, `integer`, `float`, `select`, and `timestamp` field types — [read more](/releases/2021-05-05) +Aside from dependency updates , we added an `isIndexed` config option to the `text`, `integer`, `float`, `select`, and `timestamp` field types — [Read more](/releases/2021-05-05) ## 3rd May 2021 -Files in Keystone Next ! This release involved a bunch of busywork behind the scenes in Keystone Next — [read more](/releases/2021-05-03) +Files in Keystone Next ! This release involved a bunch of busywork behind the scenes in Keystone Next — [Read more](/releases/2021-05-03) ## 20th April 2021 -Improvements to the Lists API, deprecating `resolveFields` — [read more](/releases/2021-04-20) +Improvements to the Lists API, deprecating `resolveFields` — [Read more](/releases/2021-04-20) ## 6th April 2021 -Controlled code demolition , Better pagination in Admin UI — [read more](/releases/2021-04-06) +Controlled code demolition , Better pagination in Admin UI — [Read more](/releases/2021-04-06) ## 30th March 2021 -Goodbye legacy code , Improved `select` field type , Squashed bugs — [read more](/releases/2021-03-30) +Goodbye legacy code , Improved `select` field type , Squashed bugs — [Read more](/releases/2021-03-30) ## 23rd March 2021 -Added support for SQLite with Prisma , Noteworthy bug-squashing — [read more](/releases/2021-03-23) +Added support for SQLite with Prisma , Noteworthy bug-squashing — [Read more](/releases/2021-03-23) ## 22nd March 2021 -Prisma migrations , Noteworthy bug-squashing — [read more](/releases/2021-03-22) +Prisma migrations , Noteworthy bug-squashing — [Read more](/releases/2021-03-22)
diff --git a/docs/pages/updates/index.tsx b/docs/pages/updates/index.tsx index 92518a0fdd8..e10cf09a19b 100644 --- a/docs/pages/updates/index.tsx +++ b/docs/pages/updates/index.tsx @@ -10,6 +10,7 @@ import { Alert } from '../../components/primitives/Alert'; import { Type } from '../../components/primitives/Type'; import { DocsPage } from '../../components/Page'; import { ArrowR } from '../../components/icons/ArrowR'; +import { Emoji } from '../../components/primitives/Emoji'; import { useMediaQuery } from '../../lib/media'; type TimelineProps = { @@ -165,7 +166,26 @@ export default function WhatsNew() { gap: 0, })} > - + + + A major milestone in the path to a General Availability status + for Keystone 6, we've just released a new and improved GraphQL API.{' '} + +
+
+ We’ve made the experience of working with Keystone’s GraphQL API easier to program and + reason about: We've{' '} + written a complete guide to + the improvements we've made, and it includes a{' '} + + checklist of the steps you need to take to upgrade your Keystone projects + + . +
+
+ Be sure to check it out! +
+ We're opening Admin UI up to support a more personal content experience. Now you can:
    @@ -392,7 +412,7 @@ export default function WhatsNew() { Keystone 5 is now in maintenance mode while we focus all our efforts on building Keystone diff --git a/docs/pages/docs/guides/keystone-5-vs-keystone-6-preview.mdx b/docs/pages/updates/keystone-5-vs-keystone-6-preview.mdx similarity index 98% rename from docs/pages/docs/guides/keystone-5-vs-keystone-6-preview.mdx rename to docs/pages/updates/keystone-5-vs-keystone-6-preview.mdx index 0ded46e55ad..75bae6756d5 100644 --- a/docs/pages/docs/guides/keystone-5-vs-keystone-6-preview.mdx +++ b/docs/pages/updates/keystone-5-vs-keystone-6-preview.mdx @@ -1,4 +1,4 @@ -import { Markdown } from '../../../components/Markdown'; +import { Markdown } from '../../components/Markdown'; # Keystone 5 vs 6, which should you use? diff --git a/docs/pages/updates/new-graphql-api.mdx b/docs/pages/updates/new-graphql-api.mdx index 47c6b0afc89..bb1b40223af 100644 --- a/docs/pages/updates/new-graphql-api.mdx +++ b/docs/pages/updates/new-graphql-api.mdx @@ -48,7 +48,7 @@ export const lists = createSchema({ ## Query -We’ve changed the names of our top-level queries easier understand. +We’ve changed the names of our top-level queries so they’re easier to understand. We also took this opportunity to remove deprecated and unused legacy features. ### Changes @@ -138,11 +138,12 @@ tasks( ) { id } ``` -There is a one-to-one correspondence between the old filters and the new filters, so you can make a simple systematic set of changes to bring your filters up to date. +There is a one-to-one correspondence between the old filters and the new filters. +No filter functionality has been removed or added, however the individual filters are now in a nested object, and the names have changed from `snake_case` to `camelCase`. ?> **Note:** The old filter syntax used `{ fieldName: value }` to test for equality. The new syntax requires you to make this explicit, and write `{ fieldName: { equals: value} }`. -!> See the [Filters Guide](/docs/guides/filters) for a detailed walk through the new filtering syntex. +!> See the [Filters Guide](/docs/guides/filters) for a detailed walk through the new filtering syntax. !> See the [API docs](/docs/apis/filters) for a comprehensive list of all the new filters for each field type. @@ -386,7 +387,7 @@ input TagRelateToManyForCreateInput { ## Upgrade Checklist -While there are a lot of changes to this API, if you approach the upgrade process systematically your experience should be pretty smooth. If you get stuck or have questions, reach out to us in the [Keystone community slack](https://community.keystonejs.com/) to get the help you need. +While there are a lot of changes to this API, we've put a lot of effort into making the upgrade process as smooth as possible. If you get stuck or have questions, reach out to us in the [Keystone community slack](https://community.keystonejs.com/) to get the help you need. ?> Before you begin: check that your project doesn't rely on any of the features we've marked as deprecated in this document, or the `search` argument to filters. If you do, apply the recommended substitute. diff --git a/docs/pages/updates/roadmap.tsx b/docs/pages/updates/roadmap.tsx index 6a66741b49b..a469b123120 100644 --- a/docs/pages/updates/roadmap.tsx +++ b/docs/pages/updates/roadmap.tsx @@ -240,7 +240,7 @@ export default function Roadmap() { {/* If you're assessing whether to start a project today on Keystone 5 or 6, check our{' '} - + Comparison Page */} diff --git a/docs/public/assets/benoit-richert.jpg b/docs/public/assets/benoit-richert.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8264538c5fc0c583317beee98c994ceeaa8fdf62 GIT binary patch literal 9566 zcmbuEWl&u~6Q1`-G!B!S?zeBW;E z)>iGmoj&JRPo3$m>Gzpa(=V$pKLIR7Sp``D1Ofois{tZ@U5 zprK)45@2D!8UZyvG5+gAO+iaR_WJTM)6+BaiScmph$+j+D4QCX1_YFW{(nF4G5}yB z{U;tUh#G*y27$3bFM|LX005BxMEZXQ2o4O7@EYmMI)L;)Jxf{t@k;c;%Yd+`6fE3> z0eAo&-9;^NP@Yx>DVizW3TYIOfY6Tm-DRQ7K&e8ou@wP001hJ__G5*x2aO{f1Tt9-smt9GzQO z+yCS?d(5EU7#YFQP-q5%sgN8TZuE%sSB04tm|c!=>xZ=7;IC0M0#p)MN2_D2MrZH8 zYCYl4`*y2IhlQ4mSr^X$jg#<4V%;t=E z{2M!MblxYPpLG-Zo>YH&_ST1Er<+Rxi%RMt-X}gd7Lu`WbzNZVhyV1wW&T4WMbKWptFuoTYX|5g+rNdH)kp*+8e{SbjeMFZl*Ov!grhQ>5nPe$&z&iSK=n zzqNg|{pYhqY%E1h?WBqR&qskd`kK-SleU@OR%2Q``tdr+z7;m;ae3B}#dSq~58*~o zo$d0Ud-q;(CINf=5*bm{$WVA}u^YvIXO5pD*CrRWGvBabP? zb#?8EB_@B8HZ(8qU6cit$0w>Q63EN5^%iwhi=35}cs$m4d&+K})M`ZVs;GQHOl3_B zW&7baVe^}H&zi)&Z#ab}Qc&gheh8^c3CUZEB_T{e3H63s8o3|JEt zQW~D;cP+jxtLbgpWQ{yY1;(chUvcFb&u}!74)5avQ7o@j+gr5J;=P>wyTQ0y3iRB; zi3X-xZpsvf#umR~G^keg?F$=%?CmO$f4i9#SNdz_$M-8OslQ26cWU5d z&S3Ki^Q-NNbbkHyhfjkNDm`TTlPjgwL1#70eUqj0amLvdcKHJ6S=}|?(QhwaGA0=+ z$Y;D;O-vm!K)Gz-VEX0iL3TzTJ%ko1lt5t50`X&!$6kz>{m5e5Y(o!0N3l*`m~2vM zoX_;5?db}~^U;WyKTDYTXdfSMnAq51nXb(ivF0H{PWY-a5)c3f{=ZcQ2Li(*BK%il za9FSE`U?cpEtwIF0y*X;%~7#msMu^8bz>OI%_Z8$ z3zoM9QoP@E;(y<#i~{d|X)_d_DqhqR+NYoy_O5Z;AM7iTaIVzpRz}xl(i?c0|Cq@Z zW_@eR&T;%4VdCXyY7q~4!!8yMdxO#GMUoSpmHw}Bn8dbr&bV$!Ni3e|-`?P6_+T5( zDW-?9jo$;lp6UNPjsFRY|E2-{PZ~$T06LmG0B^L2OV!7cxkpVEOe5*4QE9Dc2N%ly z&!9bNM&>;LZJ6^>@TebM22MYxs;L+mU=$&;)YV4Hv3~T%@1H5uacVcW5*ncX#im9_ z#K7EXL1nuUTV8p&PDAl0*@o#FL!9r}w2)f1`>t8R&BIXPNW;CTM8o~(5@Ve#ox6LQWh&TWQ3m1=o3jcr64g?20 zxx4_=XJ=>688@BRPrWs!v8S6)F3)YJn~S$%5;mN2jMFl-o12?IGESdfXSMnKbheO@ za6$8tG$LxM!YAA_{?Vcv^vma&KhTL}PL2x;%Au_I7V> z%DAx9@S<7$Sf~3#RS(rL^0&yY`dZbK7WiZNb^TK^ft~U3hWf@A0DsVV4a;(hvEE`> ziJn*2XQk$K{mo6x>f%ezQh5a~t+J8=Jx+Ed>`LlU7wu|MZH=oVwbTDh+4Ama-5=LS z7VMCwPex<8Ls^tgy^zenI?Z~HIqs(4`d0s+S(_^)+ask6s!kay4@hA%Di+fsohUi3 zRe81bhkD*dJrO>tkMllPy$A5VQ`XBl&e7TvbF(^axQ8C}8l9uMbG<5e zIPIlX1M7&d@t-}-@awxHjkA?;vn1unZ-`VSBckI)`u?`D=8)=()EvM1t^vvY@AC0{ z%i5BInKBMnUI(Ix1EQG-m(A|x0RxSP87s|%0aj7$A3Hlcd)nqZ<~VN$W*+SwPUEz) zH$TxC#!ZKb4%#mpS!EkmofY*;S>{{DEg5faF0pMOeGl)<$ua3kUJ6O~R%yad@v~AI zcA}oPkkh?G*(h)xbvwC-_)ooVq+z9l-=Vj68>>fp!&cr&WZVg*eiOaU`an?md9Hg@ z6Eb;2Pj&R~<;t_;j21eElIf!kQjIUL+iMZuD#oCu10f|>&8hZ78RCf57a(cwyXPd8 z-_`H={9Zp*<&MwGqb-`%^}BwECK>PR^ujCHr?M`8Yf%oBZr<-Wi};{`ofsY*yrP%N z)VswW_#arFM4ppYQVrqpDBu!gOmZq)Iw_K!IwhRPxXssf6ute6TrJHW-RkVcCMRhp zhm`weRJkLc$;I_(EQNFGT3}QdG8sSO4X@aobJLTT9J3SFFnqOScqS(&v47p^p?iJy zopHCbzyBIDe3t8VP1Ihu&qB%GFs^rPEs0hv?~9Eshb(fZH7WB;Fwms)LR>|1s?(0+ zcKz)*w*%{0j!le+KO#*tjW10;jZ?91(S$V`qN_FF@_{OyJB3&6-MrmU{z4#h@*i!rL|bfjV1-JzyNDrn^iGFlTk?y|X` zTlt|Hw;lt5AtIqLqaabpSm}zq08NNAVT_DOf^_3nt%=1uL|kz~4uia|cLj_B6j~yT zjNqWCJO5j9Oibgcw*pg&n5lSVEySfSz)V&J8A7XHcabTDNO|Vn<=#8#xRP_iPfeY7 zt;0bfcw_?}@>5LWB4rmPL?Up%(F)4T@7(YL%I~0$ESMK$E;@gydMCS8=L2eYKd_XdV$L|2=0c%v0e4V!=%b**-0J2f-bd~r!<6$lcPBYKTfCJmns=^ukU3h+ zeo>_#C7N^(_8L9_9zKRz(~)yhCgb_>4M6mDVB6AQYGVKL6xnRB7VcMWB5UZf^tad7l^xXPk%h5W z@0Y5;DJ6Fm;4_M%_TofhES7}!vcKeC(B#hYEMI_is-#6{*qL~hpVgius`Ad3LSxDbrHGm;04jcF=xDj{70JH z8{^0}k$DF(+CXggW!cwuQV?h3Va(smk4UB1ge9ck=OUg972l2&Wn zg`;U(zP8d6KqSu>h{alb-v6E8Gjo2Ue}^6rB6#Slp~k~6GfuZISST_YS zIl|u5OXoZ+8n1-XSx$06PAahSx%FiANY~xGZ}>;5ERxIbgy+;;)v++LufW&>ge>@} z{Lb$g&&M$r2J6QCXKYfQ@Gc8IX;dl^s8e&4EPDqPYHhaNy zBPFcQOE3}jFRzkI;)+)QcHB6BOKT(Y@poKkSp#DF#o`p|;o>oIE0IWdr8`wyM|1-t z<3!o1XV0so-4nb5LpkZDKP9>UDql_-?{#cEar>U|Zx32)5rl8}EzLb~Pxb{k%JV{~ zuCN<=m8YY(^8n|ef5oY+l73O@VU9@>sf(rcgTi^PlYJUhzHGGQw>J+)bwYM7$o&gc z%aOA$K&Y*C922V^D8Y*mbK6v2Fb(DQ_lkUxqfLZL){d^{@x%Pucf)aDCSoorm&^<; zhz5$Bm^+>#uNLKA3~RStT+00;96Bc2xsSLT(2ZGy-t-P*K~eipqyawTs8_;=a*M=b z?=7qhF=q6Bw#6Ij_|vveZaN7cCie_z8=J5-YM9rwQO%Tbleocr5flh z0!?ZUa$$?Ge$|32Vnv3OIbc^enDZ#y#Rw)mkVly-zgMaiNfTOeX2rOJxAYTNKWujj zR^`m*ij=HE;VwxCnl6g?nYp6K`QT4-bqAVUs%fVy#zQO#yH0ld5y>DAJCJh#iRM{O zr<>r5#7@;_dLC@cOV-^uhGWP|c#UwzaK59uhfN8g@QtX8MAx9>O$d(4!r*u9AsR1$ zV!Mq+enq2-id{oeMp9QHh=IPnDS+%*08=D6OM`Psmq@WId3MH~G8ng`uZnbKwi>=` zF|2_nd4#ln_k9a8o&wTQuJ$Bmgz9I+Y*#YQQG_-#Uu=1DJR9jB_;F)3Q7NZ@a|<(C zlSNG-WGY1$XIIvZSs%kh$}WGcW@`PnK!Uh%-nO5XZldYnR1)op_#SFZAgNVi(%xUn zht}be;Q}s>Z!bWsYm7&LAZOGViXay96i-zos5iq?DCc!$Fe zg{}XUREg7~hwhBayK3$()CW_AH%wdYDiP6aTlSxQ8;IZ^w323gYTUjqMV;umLRH}K z%ir=^ze8ZPl;GmvXkMP?4IQ+osjHsEDHBr`qPQ9kB>ko4=!O}>_!d4arN&`jfoIbD ziw_Uvq|siPAL6VmUSQI@IA3yr(}Ee9@XBk{O zyjx$vgKkrUA%?UBZ`W;;ty5?;9KIMaDaRA55J~94C&_e#Gzo_`B|(}G>GG@Qv++@7 z+g(nvAJwc`B4P+GZ=LfL{h?tITSoGQO5^h6H)S6Z)BAW7!*b`_i}!&kgdw-O7y+eK z)3R!fTHb*tV#k<(w?ib;_vAVB$cvO1R^;k0K=vgbXz#(aw28UbC%jgz&_&zRb|mkE zHOd*rK}KF_&Zkw=L9QmLWUOvp^dZMsvLgkNJDo&T9|nieBg}@a;s#$Uy(m>*eD{I3 z&{G%LXu(23V)7BigzH%j8ZTlz$)#kZs+`}J&eq6230!Bn^$1FE)ErbHVai$#JQHF0 zdxq-b?8GAi@0UenSCvp-0P32##DC`Mf6n-Q?Q%6pV?X30v+CKHul_?5TKd#wt5R)y zn?LJZTZ{3%@<$9Tzs>MdKAy!~iS2lk7Zi@^&6||u@aW)q|VA6i?>9(4t!2FiIxz-0*N90 z08#8va(=>HXM%u+`w1iI7!%RWs|gjBE0N%*C2;bB*nVOvSK~2DV#kA=r@EV6+G0VpYePI$1uMP>rSXV+V9nH`e-9HL~cI0yPY7K0Lv#gZAVIaD`t; zqJ?c~{E|xLV-QS=$;S%l!8+q0qAR@Qc2cXL0H|3p8A%`|e7X_4@+Nt4u36Ma!p_Bu z(F-LS?gmyRvSc+bg?$Hod0I+Isc``+BhuJN6wI@?8qD(pqiTGiU!?(6?gVZ3!8$AR zaM^+I=|1gZtcpMCy&3?+HEAG{1$<|S`XCa_Qz59|V^-QD$w-l%jdoZ6vZQI!T6MVH z>t6}m()P?6YVPG>S&bTAjD|++{gHEf02G{94m@i|IFaox7TBiyFRfcC6+1AX@Q;=n zj}aXykp)Kr6%!UEIYuQ7HEk515iE|>YdL(1>|LBs4RN@(zk34zObxOv%j2n2&62Vc z-jx3|)5=wYk+X7!5;oSct}Jr2M!}HzW;A19!`$*Q{oX*_NC`5xLC9sUy|DJA-{U)#di*ARkMhaEJgZZfBD$EW*bBfXwDO50 zZTjxwL2K19-D_B0T{z*XYAB$M8C=#P+EvOAyKD;1n&y63q-sjUO%Eu)I&l{P2n(K#HO=Zxn9FOxs>78DC#hAQ@Mn9v{idR`+5-gsv3`# z@&pFBxX`!`vXwYGTIF$F{L7JsgX&)SFB01%NmY`y=$i&eQ(`s>ByTS5j!=QBSR~LK zCq2ljB8?;81qkdjuP8QHPYZe#5&!jo%YK`zmTKN8l(#remqW}%+(%>KaJ;-%syp3u zpgA^D^DYQS1U@$xf4{#IOX&I>s=q1P-Lc|@H8?Y6=Ghv4&TvklB#RH6^W@H$OBrS$ zf#kc2R`AB`oiV&o$6FL6EmqM-guWde<>!eR!iIXMRT<5?dOl4xCH<5T`yKWISk+?x zsYAVgrq(nvW3}rFIU=*{COregUrRiHtWNx%(3Ny5AF%4Rs_v#N&P&^RdESR^f1F;b>6_sWGtDKeuhFPoD|Acqw{(A!`RLBS~0pEXBte5b=I0@ z?8H2A0!=&Q)%RDx2xek1Isvn%_EGvDXSgO{$iXh*o!|$g3MCt)+RM&VUXKH?9 z_W8*t%s5hEVKI`yNLP=7G=E)~dZ>2dk{t1*0NqO?LvNy2ge~Hoh54Q4rek zy`ymsoS27U_mI&q%laECz+%?ccXmBJ4|CJ2<3rt_g%IkHLwV$PB%|wgRf~R9RNU6# zb?y)n*`#Z%t|CyDcpt`as#ktPU1w?ftdgkJ)Wb<4&xck-Y!LAy_QU;{m;A42BRjYG zd~R<6XainGFUemv2$M^a;S0b+GIQgXAE81+9if1$R44#xsH;lK7U!${T#RUeFLc98 zrtpOq1tO_HSE0L0Zb<&eS9g9L9I_*}Nom{59-JKHJ0&_;!$Ov9C+9uyC2v&M z%gnXK@ytx16Ag!5UTe6(bD5sDy6yP-D}{u{BF@$$)mAl)>C3et7SXO=>7G>Ki%2e6 zQG4rx##u5lFC-~Mj!bMB3Y@k4sYAQ3dVcGd;fMovwFn=gJzvt}b*GGS=_$R?E088i zSYOgR`~;!uc~UVjR6;dTLem*v^Ej&{0)3|GQC;eDB8MB{$A)7VxBMo}nqa)~_J;rw z{?Lc~!RzF8x8H_(5=#OTYT=S`^zV-<*w5KrtOR`zl67W$iQ2aRp4YJXC!e3NTzbfD zG{Ov)1Mmd23w$q15|lo<__?98s_{(yK-Dl-NvB4c@Bev zF=7`)k$Fetj{wpr)TYI-_8{oYBIB6IQ! zzpyAx^$~XQWtaJ4>W$e2Cgbx})_d?o!I$%zjk*ax%C{VkhB4|Lw4m=NEITY1IJR-d zYwcnpD08XyDI{d2J{NH4s+U3_ga$GYUF8`$|I&e6zSxOm(ggbxZ|X``TT7g zUdHP8V&ycD=1EqLq##KKc>jD1zj0+C`wHs|Zb*@_E=kIBK@v>#-lC)@bo&@a2nW~Jf!}$my-H`Lej|1o79;R&(v7>>0p5k%t zc!wyXf-5JjR#Q}?j|AaJG4MflR31>>pp$1_-?1{c;Hw3qs)@VI+`R<O}7XjHCp@D0W0yXkfolx0xrk=x=97WZOIXV2!4BDmr=iWh~3@f##?c5==njTQn{5L1V2R|M% z<`lm8)#ZuDoPrPbRp)@;u$a2H%jqClmu9$M_R z&!W*2UvX8GXZAB`0{{CwM!v{?m$2z=G58)uW2)OGT4V_0AL9`9C>~B36?US7(ne{r zEWO8Y35_k`~w}qDWpaw zDr5eK(K_wUPa8Flw&TU^)~rQMh~$n@gy~2h;%e-~gNR4Eg{>Fy7dbxv-TD$p=(PKB zj%kLby?mg)pSL6d1a2s#wQOH~giW#)Gs;n)i02{rPCq#c+r(q5sHl*R!Ip5@lf<{qP7bDWsGY0WQ9T%5{vUj>L-040~fR<^#k~Htk5@DF9Wgv2_ ztNPcNjt#VXO>!x)b?1!QK(dh~9v9S&AK(0&|9I_@IZC!>`d<9HDkqhn-#vBu@5c32 zkbz#!mhUie>LH%_cKV<5@OUkMi(D(PhDe@fo2D#j9eRhr#@5$oK!4>66I|n@-DB$f zY_+_ocg5K_B%P6M*5!ha%RiW(ci@9=O5}QMR-|y2+!Lyyj+k#^Ai*e&^Y3W44jj^1 zSGJhLH?UkbLj&axHv{V~PA|Zfk@yS1g*{__G+%xDxpFenKwvuP#DS?Xj3N~wm%S@B z)eWM25|pM`(wqyEo-R(8Qe#~}md5Zmd(gnaZgu%^uHS!Wui=lvMf_340yb7&PCHit z-!L{xQ-yY;nVlz_tWRr`?u+5MN?}vf3LA7!k=u8?lpB4V@*PrhS>MiLO~MzWno7R1k0&T91qs^M#PIk~OA<@lt=a-YS`=>fH243?u(<5mKk zQdUv3pGqqhv5|^owNM6UDbqP6QovIdI?Fb)EQ!rSX&cq6OGE@@bW!D99Eg(uYrC3o zx(Wz?YA%MCs2XE#Q9?1|K57zv_+}Xl*Yvr_?MxUpus3XjH(<%Un>kgiPHy(Kqg-q2 zmyvA6H#1vMjyX0S3LI|y>zTw7>Xqr9)5s`&fM+gUr}u51!H$1jNMjl`PEj zj5xE9)<-d_XzX3IkJ!f&+jL}5eIYCe5g9=&)uwqvK4Ks3B=cSu**`0U5s{m-4UTzB z-oa=IIk?Zv8XlK;VFINZ;fnLKQMjbV4JR%Ms%ZF3j*gC*|Ijb4%GrwT?Tf$mf1C!S zsyoNrNFF%j0s3|lf{+4gVQ0>twxC$u_NdCxU^w@+2v%Aj=Wv?__74=CzkRc!#j#E~ z(NDg)3`2saG=AF0Y490*B}K~mjt9TeHSLL|xaV4tbkXVeJ^Lo20Jr~>TjZJGZvKuo zvcFQf8NCr|fB?j`_L7fnNS&9jvLm0IH2a<6Z5}~Of8AP~wT#O!A?*VaQu>?nI8aAC zhn0DU<|%h4O*kpQ*G@{+Nt$(JMZlkh#T5{(j{A`T(|%w_b48h6>l~e;G#vh-!;Sa_ zP$;P71NmE^UuJLkQq8vYBb8xM#h$LS z5nZ_r`j#&x*+pKPb5#%6KD6ORtpTTEmRSp&9J*f=B1@#^$c7VqD{|hDvC^YjLb3wJ z(>kzarV^Q-15||4%qH22L_Peaj>n1pwY-bS^;28iXgcV>d~9P+N3YbXDNl4@7N2Av zSMkP%rV<9CyOVFinaAP_6qx~H_7Ku8!?$UZW*6`hPm@y%jJk^3OyLrlQ z<2!jorS|4BS}ib~!u?M@cEF zli&Zz?m6$hJ$tr#rt6!kTQyy`yX#hcb?a&EX%~Q~DXA&}NJs#HggAhwedIz_dHEOG zx>`!A8jAnPKu&hCarFj40l?MG$4ggPj@B4vLi=nVzyR<70)QPLv9j^@kk!`K0RFe( zX60Y)0Iq8LBQUMQe__sl*!sWlzqZiYIC{AvWLyxK z(bdHlaSi_o|5^gJb2HFG#FYQ}dIP$EG9U-g0@i>p@DgwVd;l&)?1s?U|GFICf68eB z?uarrh_eR}2zVh%H~@}_vYd!iU%(r%L&WxobUVc1f{;Ljf4ct{1Hk{(skc4X)adD|P^QmJ0w6(N9l*i=UnzN&o<54FLMn{%3jjG=w_O5$VbQGmY^*0N{oL zKwIzsOtUTnfR6|rlYaKF^0NBR|DYhw$oBRCa9IHW*f0PfKhgo27Vp`xOqJp-dZLj+tbEDSInE5MF(nBBAvqBq9w{9uITaNR4GjSaJtI9eBPBHr^}kAx5JjJ%J;Omq$Dt;~Bc%TS z9G(UNJanXFq+}E%dH@*@2?Y=7Y53m*fsBmu?}hpw0SOfi83ptV9g$1;|H$}{#M1@< zMnM9QAt(^U4g7`2TL@TYp~!#<0N`cFTrNn6Ig6ixn4frnH)bNM=8`@s$-@#1kOCMb z&SSKQyOM>ttAHZ~A_avkejF(TtYPg!Up{v0C+{k5e?wQE=RUpL<*VX zwdG7Du;dMaq9OEb2}PDtPCgh10CE&s4JA2CV7MQt1xyO?hS?y6jQ$fq3UeWV^1t4g zSsiLPSARnu}EUG8`bcf{&Ar1Ejp+D9;0$6paM%O^STs zAirXmQbc*LTezXq*ayD3z3zx+3-zesqiyeP(;G z(@NSTH}Y8*QOUpmMXcHkGIFwE)$CYY?!kZ5wmEQ{zMSO3HrE$_coKE}S%`=sT?KWTL zy1sR2xS@0sLU9Mz(@EN2_9-!iChiXux)a;mB(I^VhLZwzM{hH=CGvB7JsR$kvgIx6 zDpRQh^3-nx{)8zjYr!nMZXtILqT}4oG@=#NTpyretp<&f4tAK+s{Uh+ zk}k5z42)1<+=X-?--(J1Y7xVqGVMkL;nQX!6Hz(5SOoDNMO1p_w3GG6^(7Ub5eGxXfW4@B>F_a+hzw1lL> zN=9#}@)Hjq8yu!KXOzdr^)(ZU{={n}s@XPrJEuzY_0Fm=SN(SSb~O5iY4Bnecy(jk zOc&BW@g*4$%G$65lf`}|sTb{tc1$#T|N5)2W=-6d;7-E+*R=1VoOk~3V6hYi?fq%a zidwK!iAUHg`UATvrq8*8qbe)4X^Ybj$nif)xlk6WqMKW$vrsf9%CUJ{{^=F1Cued; z-~Q6v{*$p=|B>mCQqqB!uZs<~+^a@xvU7Id0+}!gYv%<42t4H~l&Mo;_3&-u5oopK z=P#n1kqp}F(^NhJa4H21g*2<5w4b`RJ>TCpE=SyRJvOQPCv+UNA>_F9sXg~OCHx|) z_xKwD_uC~oPuQ>I?e_zp>Z_CEn+&;FFgYp|1nXK}k)p|r0&BR8qZc-g6eHOT$mycy z1&j?=6&9}&60JJCE(yj8MyP8m;$=C;@EVTc?^1-UKH@P(hYv5)tm1ol`Z{u~ItFEz zSG&|^Mn@^hV3!M_$&dlqP)ng~m9(R;oNK4!dyDx+?e{qC+ucX|1o#(*rytVtxN_A| zJFC3-Bo9Wx;at} zQ2aSZ2XW1kiaFDhgjEz=ShghRW-IMm=4%~lhBQAZxClf9zRXT)#-X;!E7I(o2$-Ub zS|n|v&_MJ`uDtQIA>aSBUt_(C3qqn>rl7YmXz(U_lW95h0jo5W3Jz-SjB@)fgug82#7b{OfD-g%ADiLi;u(`Yr4J-@FQFx%YWe9F61p7<17SHG&m(z#oP(?Mz;UHszFFGKP%+c8euWE>3z z21az|NZs;c(>?l?fBK3S(Ct%BV|}uID~}UM&Ut|{j@_Dz={0EEexHcgT#r)x`4c#$ zAz(x%PBn|~w|Z)Vd3p+-|NPM>@0Fb(b-3gg@90{*jR~7Lk@vKvNzKv8Sq85LzUADr zP4Silj_#n$Bde-MnXipGPp$c7C_pG&jP3D^}kR zbABZNr_A{~qh&fc8OSIR5!2?n`$@&Khb8lu0n&sZXVLf$GkJ^`bQ;2_=v_)^vn zhOZ%5U9UCBr?rs!Giyc^35NmW`A$$>8P)h*@qF5k}q zA`&z@C4#5XH2LS1OuZ$H%?u7pEP4$1wKZ-dq1i}35*dqZ`R_c|9CJ^creTb-!L*V~EDksEww5LW!l zHa_*k(gyvmiuB~vpH|D%lazK?s3=JkDUdAa_Pd1*UX($4F!e)$Dp^X?_GqAB_f4gw zPmf1|)J(k-X!PJa%7ZmkpGYL~=e**Dzo^j>DVw>UaxL zB=O4l#*)4K_9ySVxosL!ZC!%=e@=x-wQrlrSfIr&XnbM1ck}%l4~M+A2`x|2<9cCM zHMZH8ep~4rQ>+LMIf&E4Ae*yo*fWDBs^XER{2*tjq96Wcm+;z3O z;S!Hiqn={;{49dbc<@}R%FcL+>jF(6(;efekmM%Ln zcP@0YbnaLd>4MdQB1P3${RBi`h|t$&{$ja(TiEE9KyGf|be0}t(!t}jS~h&ZWFK{6 ztH)t^^^Tg|HU#{=nujej)#vC5z}-h*Zr{4q zZL1C~%8MMp(QGSoZ2v<+5$zqXF06$t-ryq{Po;iAK0h$J{`7J|@`H-~-m3;MNBsUNMZ`DVF1-0^Iqn8 z6Q@&gpNj@;26vfvl_a>hWSCo}HQ!Jel7WK;K!Hwqx;zX<^KR5~Q_jdjpzD04*CHDnv}?$Swi*tAJm0uu?Z!T{3UBv{8>h_Cjcus^))=@ z+ro=Yk*_$)yEE1Fn&<_&cb@;?Y+z%hhFIE z`W@>x?KCt~tn+)a;IR=IhEd-jX)Y^LC8XU1yPqjPfPN|E^RfQFec=M^rnyyIF)*;Z zT0$)qjzO34?{1F$QU@>YvEj>e_ptW!YFjtlUp`J+1DW?moakQB9cW-_hReT4QNe}K zJQg9(+zsAnD+zII!juBzj;tsG9o2(+tTYvs@yyE9{j^Hdu335aa0ata1KTN88txWhPJI%;|+_xY03#2qA7Z#_J|_BB zDpe@$aK(5vt;2b>cJdN^%Wfz{4PhInZl*~S4hgmjqmq`b9cVj zZ>9V?nTr}Cv4>E9&K`TQCI0eVs>Rgk+;r`wbm5<&=utCw0i4sN=;h$_(02ctBZtkm zxV)1qU+BtaOb$hn2+F!kL$fE zOG#6blA&<$!YLT#OOV}Zn}MW@;hTMtQ4fX;>mM*N#E`SbDycC3wV9sHVjs223V~Fk z&dNd?uN+6@OfQ{?#JjX+&=h!Pi->{YG50u|v$7!k0u)*IaVKzC+DS^R3BTu~go~z< z2SJpUH*{tQ_{>)|C19Cnw(F4C^|?Y27JlGBd0cgIg8fN4I{8amQ#8L*d-Vmj|2UUX z-s>Ml@b~DYIWK;!B`ZGTJsK{Uk|Iu4H{oe{pUUwB2nS-xvqV1fQMPhN5L4QEXXrQ# zsyASWdXXN+krE55`jF*{6V5yyiQ%^yr!=vgMOf$6k8g&vzE)AKwx`gsRrxvb@aS?9 zEqn%hecvvwZn5MQ(8?-G@~2>{6~VW3=S$YKGK&1l=Zw5+V8-BO`mH&TvJ`D@jWhiO zc)ZRe?-4HU-DBiRR^7tw?WX)v_epak5bjv#y!!YA4CAg~Vb;sJCo^dgxVq@(F#Az# zX)b_9Qpa4VWffg=5`ymBN(YP7>y6$h^4}&t3>x5d_mrNZsN4~gbWY|ByOMXYOC5YC zvSlbC==Z|FrI9!e*!iLE)}maH&aCzXv~vx8Q@y+u!+jBwC*T>jz=&Q&D7E66$2nXY zZuM~W5bpB4u8YE-lj~y}h8$yC7Q1>&5FpQ#;itsHoFG=7fjQ{2G?AK5mW0n3S4$5qfKgCN(t_-obY^p|fqwzjDADt;8)-aY|W z9UBL>IN$hivW)}J*3^8%EV4~3j*YLmk+Z{X+h@almHvcftP^BW4Sv~zT#?)VWcVbQ97Y1anBp%mU$aBVRKk^g7?SF|U zxcezk!vZX%zv=C-oK5r#rdu*;CB$1Dx@gu&N^8@IZWT51l^f;AGNRPzF2?zrY7aJh zL&^o)tR&~@^vpEG&Xob<)amLP*Ya2O$uPU@FE44U#dUhdIlf0IKejxkj~~fXrhGKI zwf~tx^UInkM|}AW!}7=PP~}t?&O6Tstu|*KqRgxby6h_pm2nPr8Am z8!A$tIg;M@VuO$6M}siTgEl)~(8&^H)4ce{c;fxvsnCCnXYzk$PY8-s8i_La{~&?< zKP03f01^r^3Mv|c^hJC2uMPxXiibjn&npX|*Rk>h5zz9PwrU0x=@VzOi8oCCNPJ~ltfa?^5+X3~Epv^ySU zUCimCVm*)53Bi%bkjbw^YrtX1iEdK{+!|I&l{*Ld)2Emw)b`6TOg|eithf_(fGK@p zW+(fN`ZWP^!kJi}vb9#GC772xIg1~r1ViGBtsz4kli*lm3o$QEU-on2W*=n=`8C01 z_l3&&Dz95^=S)=RQ;5HQ%Uz}0t9&eoi1LwG&0B}a$f##0Wi$NC-Z0xbFVl~$bEJlO z8R~-Y_D*PXNU`ckgJhT({RzSI^ZRnV;m?0H9dY+M-KcU9w1O>d6?NfQ=a1@hXrL@R zg?&vMs%4RCH&Kr^s#8|&0QT5m>$5kj8I_o3#}eqKttJ|F?B106ZO4@9aV#=5y&SZK zcep(6hwNt1d{njUZP}qklJ_M0)Ncu1ch3?9vyQVSBN_UHR2ak#({-B#@TS>J);=#;rxLR5;9Od)yeRI#p@RGnrVP*e>A+DruNc<1P07!JvibT@MBmd} zz=vy*bx|s}-MLPaXbT&ef#H?bk_=ad6ZuF=TS36lW4*{5IBKV99YFXrwnGx*8w24r`?xy-fKk zCYQ!x2=poaG`s0HWdAOWV=7Y3&F&`)bICSp$23vAtz9y4jg<;*ZMqJtyz|x!#&7I| zE_Qozkj=hq9~m%??5z;&HpVsYaCx82*=E~hW`v4EC4`{siW%AVMs)mt=Seb|`Qv5e zB0XMyElzyD$wJ*&oY62`s7c#sEp>9k0W&tMZ+pbzs8dfG=P-wdKV*1yQMfW~ywaTG zIhaTLsE6c(*CfNV0W_|n;LQ=)ziV4Fl)upl&V)1LJ!Axz_bW}}(7J`!mj+2gBex2Q z4&EfM$8Oj)OEzD+`k2R~_y7z%yc2eI(#0v(Wyb3-+w7!UQY*^NME9=VESgTaIa4Iz z4Fsm=H{rNV(GaRdE(bz9T)g#)!>oMQyn5%JEj6^?8*N>>YQB(2B?VS_ z2{PO!jqJ7Sm}Gevl^Hz&&a|VDIZk9jrm}f5=FA_&cDsXux`5yddz43Kf^$vVB3goZ zt3jzrk3ES@;-kprMU`Zv_wYQqU?-nV-@cP~95qjXmVz4gB4K_EZy#*1@a6tQpwa|i zVSsf!jEk)6J}nSeVSxkLJbAEJl6mQy9pMbgqi)^;p4B=_(l{EW9;+Vy*DU=iy~mlc zoFw))Jp`TXt=srlZgC9bQW^zhX6S#JbGSy0eY9_ql_GeC@lWKB=hC;0`1W4zhmTII z8S~jSzqr6GK3ZD5bCC{KIFHezQBkVOesdpqpKYkS6?U7p@mLf{{2iJP4M(2}o3fH1 z$i+Ed^OU&MsL=Aq1s%1xcQhb#zRBZ%F7-Kf8{)Anr0`0jO(B40TFzBu$M=NV(Lc8Y zzaM>wfP*kFh59k(+SoO=O!#0dPD<50KR;;golGG)`^KV@ZL4A^4vS#7s>GzL+$M1f2ew#1eC^_Vemq`x(VLE2r)IN3s&#O9 zAOQ!i^Xc0&w$>a~z-h57XFGtQ9%kgocWZe#2+Rh)06sF;r>_*WoG1$LzQ0 zqDwh}cy@G@idIBe6y^9KM4m}F=u#!nG+dhGKz5V!3XvLz4<3Fnq8njgc-%&dC576RF~%dut%_I}S7_Gz%$}tLKjM4dF5czgUIM^>WNS^j-GE z60Jm+%(>n~9EV$+YTEZEMkHB)b!$HAZ(A7BD;yL53ekax71m=KT~Id&AK>e~yzuHL zd3E->iz31H?bNeZC;F9Z%1cED9@j3O`+cS6zQ)9a+9Nl5#Ds)nx)%lSF5bu`}tj8M8y4tO6};e7@jj5Sn!%|lvC z{bdodW*O&>Fp(px7s9rMF^omt*sF2U#eGT72)~j6xoPC{DE%+LMywlF-gTWfQxslv z*Ig}s@O@R!9e9+@+tVe^uQ2S=nPp*G6g3qXdHP^9^!jquF+MqFx2DtwR`qj0m^FUi zQ^OJuWk@p%1?yamd)rxdub{}?;hA6lq+4qqv7g0dncH8^gZG*19*x4D_j0XD%QVY5 zJEt?0gT3D<^|MSHB?ujhtkzwVbyk8EZ=?T^yUq?zR`6P#*Jm%zEwj-3Ee7?&nfx;) zAk%5`wju3GGZqAPJsNK^q(-#geUtIa@teYT`}rQ;QJIb(D>a@Tl^bgN$BfXZ{KO%q z{RL(h)!Z$6Yp)C6=c@YGyY4hHcS++Q7s~=W*QgX9;@rx=EF}8zw)L?xLd!}M>@&ut zV+Jv7i!LIl5m?8?O!BS9agD;t_vnL`$hPO5tW0vk#^uCLf9MDO+P^0o z@#$w7HBG>5wX0Re@J9GbsA44B!)AFi3oSwMlim}Ps~zIDq;vvb$$r5O@=Tx+b2vW) zcwAH4Oz7+y(m!EMCgOemtaLKo&QXH0?T!lKK!s0OaCUt-j}h-7*(aCZ-TL_T$BNCH zMe&N(K>@ahyx}8cy3HUN_kzABKqhZ0T-exDg6l(KfLia(^p&>2dJIRgUP8YvgaDnC zC62MR&&Pu1x9lg5uI(9BbQYMx-=cT}U-Ig@pXg#mXfyNvVDZ+niZf{rL7pIG-S}Lc zy5D*g_*SAVs$ln%_!CjRZWNy}M}I>pap#YZE|0OTSzNz3xyZhbGl=GMB%lu1H+Sg9 zq3IOZ+1HTj@WZ`BA@M%XU52;C__7S4-mq<1?a{Q2bhxDY=roT-8mS+YWX&p?F2S z*~e%`G7TJIb z65nWHIT(WSGSQCwP2MxS)2>Cc(0+QF4HRV*Vbf^H^7w#-K@UelmD?!XrST(oH9;eq zxL}shNyA#Q^aB44sa?DCOQWf z>YAUsiuT&6;$PLHlA#(4U7(bu*BxTR)N>k=VNLF+#HkobJot*|S(8SC^Z{%h!@uZq zcn~uYwttI2NGKpA(Eo7YK*FQrmDRC=(0YcZK#LmZ2ljqm$o%)^A8EQfX{x*5gLgbl zXt5ZIWV&nNyK_$fukU8hZ|9wQCx(iWRpW0|HgIuT_)-{0vmEG^r0=ZqbxEUte`%=S z_iaY_Kpn0v^Q$LdszM`QToC^|l}+(+7YQsIk4D}iW!~r4^?iI&{5R#L?9B0m7hd1< z>zk>?=cz8%dh1wekWW{OPZ2f-gtyV#^o@7 z_u)wbu(T~c7QFLeWVzso)9=-tddC}(DP0g>+t{~Q)@=F^?!r=80hQ<&d?Ybg3C#po z0T~&7^a4xAgTeKxp)LluntzWW%6P~6@`1H9 zn}l7b#|m&#+;y>S*%==0a|!#*|P)7FRA9&9M)79WoGbZ+0ctB6YqtA$-L zb?2C5b$#!4XWdt{$^eDV!{uwXkxI9zkY5GkAvVb&85Zk2^n(uV_FfHZ+#oK+mZ)&& zKPfTnuFTCKXv<`!A*=`O*-xzZ-&&L9Gy?<4qu~LRCB%v7!n&Vgbj{IfZsak`&(PnQ zC&st>*~rh=Tc66EIZO66%4^+tK1RVrZ+No!+3{60VqBcwB6BK?kK7l#O58)Z7M=ji zxQ{5t)ae9Sd;#+o{J*I()3*mwYKiR8>bPz(A`1BW53ciK;%L(J)B|yzTU>zf-u?QG z@6O@&8r#IJgTFZmwW1`U=wQ+GIw?O<<+h{FKV9{KWB9DYE)LYj4Ybs<^;6rG*j zI?ho?OHZ=b3bJa>qcU_E&M_HaOOK|6AD)Dj5+Qx9kWRm3qcO80v+CpLqxEyUnP-=6Ca=5cvI^C7?`+3QOi18Ci4Cg7WS$heHZ0#IvTXY4 z)sU-Ub8hdn>CZlZ&EQgxVU*b19(GuNzo4LJ=0j6g~g5&isBj4L_Z9tnI(^_D#<%^8{pT5 zYN+ea7Av(GmYy=c6h|HJET|3vtYAW8Z~p_CHa43;@)bQBo1=4opz-GOS>&C$*SZ>I zEYxULRRLrMZi}c=C9Fw~vTT$Q?rI(fQdX9GZ1$aX!!eD1ug=U#Q!Nb1M235@LCD;x zv#v*s4*4W5gP~3lI46U$q3W|5HVT*JOdXYhsr`STQL(rxI4#TgIufPAa$4}E(pdZg zI>rbAte?EzR*xg8nW2;@yF90I%!~6P6x-E}g=K&HbYGfB&Yvyx=BBlH1x0b0DW@P) zmX(iBFfNn{k_p(}Cl0GJN2QUb(dHCSn&sPSH-y28xns;p$Q_dxmgqF%?fSxnKrL(K zk$2Cs@KVeg6s4^hi7m^qHxaw`|&ROmt>#+CdI_>@ziEC*2!?ESo#}l6aZpGax(}y&Xi4oDIqddl+Cn5i4b#pqs>(0l!4~i-eibMXbn?i4y+CgqNHn zXwCX@;F}pa=B^`t8aEl|99uFeh6A!Uy7h*%jg8@2`b6`KM)t(QYeAAgNy^g75}BoV zI{H$;o-l!?=!ex-YQ^D#4ya^FKF=+dR^7K48mr~_D4L{RNIR!i;QUffg40coc6N zJp+kiy_chd8P5Yrb{6h2)Yp->V+&5gZRvdK>$2V88EK4(V3+HFzu3(Z5wu3^H?f~0 zOgMaLz{~Vs>8_*08bn`tS*O_8@GG*b2weO28=^;EenuM=>TgaC=QCtx+zH^UowD^- za#RQBooFafGU%vTK-x*yvx#t3VLN^xS=#Jk7D!r2;<8ADf5EZ)6YDgZi~*)xyUF-{Yn*ViO)Nf-_uLyc7A|r>RU~{Cobd4DIFW!T7jzx(S7$%s@Uq9l9$6u zEisDJ{7K6|&yyROh~w!oY6;^kX{ll`n5F+(5e)x9D@K6@ff{ESIW`O{y#@noq!U{SOh4MaQ3!o~fqaaQ#JX{`V$7y`sSlwtQ*CdtmfbENmGF4(E??FarWkF_>sJZa5 zi@qtM!yD(V&qFdxUM_mt{QI~XC%6TPK;Jir7k71ve~IR}d2dflo~q?;n8IEhh4xE@ zS$0}a#e-%1g7zu45dx?zZFEe^OW24iljni!NWK!DCRA3u>7I@dS$j>s=auMNwCMh! zR#T9uhrcxL$-5j!>fcKCtBkPmS;_yT#{NETB z!<5C2TuS8;_!E1Qs*e7y8HB5biezYh%6dBcWGj+%Up&!py3x6;inWBv@ui38#hziw zel2lF!C109$U4DK^&Bo)TWyyHahUF!Ub|1lR=j?f`R-2&Icfg$IK{D5b7pHDqSMrE zFf1aU8iZowc9zB9+5aKEKif*7;cdK^$F7Dm*B!lzG#j3=RH>7rC2NPSt;d0!GoPhI zUXwe@F$;ofW>wtx{rS!&Rr$bIUL;l4wV|Dw-`xrI>oJ`l_rzzd2NSad*pTy8#_*~b zR3qX?oYGYQAD6A9WW{*RgZK_>E)HfmR|OM9&45+rcLrbB%jFci1Bu9Js3rxJq`W6m zTWY$k($y(I0o}fLU;EDn&+w0h4gw5JI1^j|PCh;nO{eY(lJ_;IxW{?|kQoiQzlg*Z zG?FHyy~DRNk}kq6ltD#fo7{~QNo*d^0FZ@g_{BqnE~itsGLvHo7;qj$Gb;{H3u=DV=-k%Dv5$g+RY z_tuOvcwTPr>Om}Rg4j=zNxiN?ro}`ZTdb`(XbioxwoKa8Gp7`?lm}f{+))sn%j@W) zoDBSI*fiM}ELqYTHmZYQ#!-~4jQEAu5ab)w(lRmz!Fzv=cq!U+X3YpL4DVkJ*`Vj| zab)@WN20p=TZ9z(^b)s^wXx|sVr?;FjuqFlm$J$VDKM~7(^^8*pYQ@Dz1^3! znhAL9M=vvY zXyjiMS(YhTO>0M#7QR=|x0xYh^3u(-U({EnCJN zB6;@a1t+%?rCp#2b@a0Qt9ZoR@)PO;;lc~ASb}UvyO&x?Da>I?f!?};46NFGEhqer z**8?h5sqULJfT=&p3b|=db{Pq?u=qt3WDTeA~u#!z;y)ipZ+q!XQfQXP9U;L;qh&G z-MmEovOGR9RlDiLmJ#nNh5A1Un`+D=%6=o?_=8X7R)(*;q(4U{r6d$r58gUO@K9CP zz4sweR*P5VO0JKaYotA5&fg}sXvpTNk4(%wi0^E2pBaG|Snmd5cO{re4F)KqMLCa8 zspLIp9k8TK&~{8$DB`U%!7+4$=;j?EAXJLv8_}U^d+TTj1L|s4qXiVYoi>eIj zpg?+QC{dd8msZ{GI8Bbhi>~d&=FV*gxb5@%+-J^ntjd_GP>gqka)yyNZ?D2$6=taM zT~bF5&fz%!Y#|acdnhi^pG3XL{Y)M{SC_z;ajpPDj6JlDVKe%B_`6B}FN1F17>EqMpB8Z#fY*&ro@%A@1 zWW29`Q=iTqs1%2OgTEHAgNvuoD`LF5or%z4_&pa%G6M^lvPo4X8BgSDZ7-vl{i#a& zsPD5d^>b`IeVIkfXiJuYMZ~yrtJS48g-E(LxY)RI@X}H_4ZDZZHU)p2o)03HyfDtu zMkWZAW_)W$%;wGZBis~~z%C|=iO62zZ!G7B&Y=m}VpH^H``Opn$Na_XZRLG;#MGTu?SL=YQOgkS6CHAIp7`@6N!&*c*J^9{9;$8QKEGUN(SycIrU zkC_ISgj0Tbo(dX&ZxbTerBUhW{wpE*yEM-PXFf#{800(7MmVA!5%c_|#2Nl!ALI8V zl^!v+&EQIgrAaS34O8(phU-NbZ3m|ZnSLMdN4+rRxfI_9PkQ5eIn=cG7_U?QCSW(3 zri87e2`H%g&0TeHiCQ0shNB;7V8PSTM=MiUQln|cb(dP5Ddi46Z@$XZCFRp$R0!g7 zn6O(H<>Nl#y0kVaejJALgf3pveSl1cEv%lZ)rd&!!1>8P^=&0HWfE$WX)LbXHKwKx z742nv?#ihv{W-Ri4ogjboK8L@g-4{YJOKxaiFuQ2^+U$Aj7IJ0}9rfXVN1#rX(sT>v`W?3+L_^YPL!ZVS*bJ65nyZ#iLfJ=_pu;g;=_H%I$!_g$A-yPS{I3B<3RsDq@Rn9bF z93=(xL~nBN=*6%xzzEl9{D<5Kh|(_)ReJv5H{59Fly%B>nrwKm$RrC5ll+LNP!Wh;2!Ult385MO&mq141hY@CM*)o^w1ZR0NpSUvN9=DP68>Ol1~nLH33{s0sHchD_r!FF-G1vz%mk$(P9k; z0kpED^sxXzEC7r^P;k-rG12+ZpxP+t$uR<Jl)w*x4&X3aPeJ!a zSc^kwLqjCy6)2IFDe+JVLqa)il1K;o(dDPX4UvRnf$0RXu&NfEeHn}lhM?IfG}2f?x2DPOnoQWf+ATaDRHLZR6=#_4 zho(_;mhKcNij16HZG zgpPOH_~)IJXy#bKFy_lhH{ByApYS7)p%WzBV`@oxnEDCehXyb#G52s8e&P?z?szkp zt%YAb%^su`kaj}2iP(Vftfda!AAM^YER#;k&7tFV>Pg6MAfUKa;yEpx?Q$ubj=FTZEkW}~TauX?1XX1z&au`{*U@blsIj-A|9pjC&ZL&kdyJu{%vo7u zo{B?F>*0x$-Jv{;{ti-!!vxMwG}0puhH6*p%x+EOGc9kedvsMsl?zhH?7!e^Wbc7| zT=M6||Ha;#L~C8{7K4%@>X2`o;}UVYt#YD_vL_#h99|` zh7ihZ=y`6tVQWpVmWe4kER=njgJm3LMV*C>5L2nyyOEkzFCjlbx0d!nY!e)dUPZjx z=@7LonJ;O6!Bh&v(4glhIuV#zPRtBOu~lZf@xcH<6{wESyLRCp|HLrvT@B}27j0CU}ZuVFrfQzYnct;R)^ zxf3&_V`b0FZ<2i)^c$;lMC@Z*pVya0?v+33SvP7`VR~HY)WvLil#~8A+1e$bPS#AU znz44QD&y=Wt4)sVfRNfo=0;(5T_^i61V&sH zmTPSVzvOLQofhmrWPK~V)LynfmN4U%55>i6>bDSlwXe&{me>=@{*kKtPrM!xpEvrR zyL0%a)FPu$+gH&u>7fntz10`7aXtMXslz&sOn$@~hcw-WSyUwuuwAK+TqZ(jFDSEey|ei*@#iJhwl8WP=>wG zkV(g)?4sMPC)T^kU%iv#7taZHTEo|!;}|}rwppBW12R1yFH@S|feA9r5TuR3-{BK> zO*dnT#)+){4-lc&wKjJFZaLf9ALOaj8!Ms-->lehHhY;=bNgtuA6^uIdUP{oU$1|n z$s8u={v^{`r(vT+XQEPDd^qx&=0>brPl zH1rR)$7|1f2lG{>gGTHP^jA7U$%_fkT@&RitqleX%}fE8$zV=&k4;#h;*J{=B{tUJ zAH?#pKt(nFMUg+MuRV7$3z2S%A{cAy&rJ)fZv!XV?UhR~+i)JJimQ#3tM2 z%^d0cLpi>M>rCNQ4@C}=ob-|nJ+F42dfwc8b+J#+3Hl|Rn7B#7oD+D4L_!Q=U;ZTa zLbts|gn!Spq9Rp&N3B3}eYw+%bOL9K`wX=(!!q4E7*NI;t^1MiXay?^F)@2P<~NI9 zM=kw>Ec+l`n3W!fnIbzk=$iW_Ygf89*R-;_JW+r=>0sg%H|enX^SvlbZ`N}~fwJAp zOvj@loyNm}zv@4fB&f2%CzcD_M<;*NZ8z#O{zS`dd>IZ46Yp;3gr@Pa?luhm68C z_o&sN-$@J%>g``o91?Xpt#2MCJFtUX4C|yWO|$syZegl2{c&X-oWjeYR4UZrBQGwz zE*f+Pd(SFCU4l?t=~HEUBenBlFva|NZ|4&L`8WY?PWTaglDRBveZ-Asl6+O({#9g4 zsD{K-jSc!jde{hcmFWQO^_4rc5rh8CMbPPbrG*K@^lG~s=|}e0o3oVaZ-abaZ#i&= zoSYP&7T87d{a*pv9wp(}Yeijg)S}5*qH6n~=REkBNC&?E0PMzHmf5@4j8wNX6-0u- zE?pRu*uY)-T|+Rqpi?QR6<03~U|a_C>ZQa%K-s>=BT7hAr8cjgAfskg-80}I6_-V0 z=D)a5V(mbu;^WAJW1w%&SWdXQ#@erEmmOR_K&Gn`G`hb52m%}e4Z8yz{w3;J>tOD2 z@c#f<)1Wv%Qpv%o?&tmY8VX(JoSjs2?pKtgALIW3uGc5PirAw5``Ie?}D-^)vV`Qz@uCl`InYjQ^hHATI<1SZa^V>UCk@1}M^)K`u z#MTo~niblr$K2~{URVR-`=N*E1p{0|khfgHg&Q+;xa9-!DlXet{g3VxVI5}oGb%5< zB&|Z`?Gjxrm79IY0+#LR>*6m^!+!+sT;(3{9?@>6X6*LnUNT;krt|(jrJ|ToDNp?W z0BRzxMe|rZXX*t=M~-lvClQjtCf+`Og){Q5Pc}mfqU@ zXo5M7#}&x_y}ZEUMJcV(L#I`|)X6Xw!R}{T<_6ZXe>c)yO2G?VLGnWoErkV27FTkg zFsNk>VqWeW%RQmoF2Jz*jis04RS(AFTGPf>+t;)iczh1`O1}grg1}_h03g?BXUl%M zcD)cQ!0vN<~+EGUQTQJj%JPXWp>8vf&Bg@)LecSEFEIe=K10qDN(nC&_#Zaxbv#2j$l{4 z`pHu`w6*Y>rE#)~m1uC`f4aGORjE6_K77S`%StMZ=k+Tugi5=41sm<|0L7apK;b_z zDp#k8n!P|J)UYZXV~Kh1(ypaq1H>@&E*XSkxZW3A7jMnWyH?tza<`%TW7}HZ%-q~- zM4aPIJQ~cQELDyJ!O%ce7J;AA2&C@8L0fCkhR|GGuk;QPl#BfR%U>3qx2u;H!D|PI zr^uIeUxHthI73m&0oOJE040U7R6V%=020~5Gy6wzLuB&-{b|3r2awJwn)7&qyW_sP z{v$h@MrQswf4>t$tML^s5w1LB{K|_$tD9(|t`Ix#)^U1&+(6~rI;VN(_<*7sFPrK9 z;ps0@f~qSS4QF}D#4hWo-N!}2r%-rv<_=-o0%{FzaZo-#@*XBhtBMn#t+B|nomlpn z0Cfwp=o}Soy>Bx^bZz;8e8wKDsZeFM2RX05>KXGp)4wqJ{#hGE}_Jrk}mz^@ErmSVOm`JB#pHHn-NwHyQbmlbi&IWpi4 zr-xW&wOcjHql}k#`+IW56pC$O&87AEiEG|}-!Z-gFNfiUzymd2Ojn-a!!!%LUfSNc zj?Q-Q{=*z3tP@Bb-8ac&DB>Ak6QLS$C~(B|hT|*kEfN&(b9iBlm~jT?IF~Qc?=x)7 zAx7(;nY8($vw*)mK(3AtX+Y7;UF2nvI_>-&#x#*}3*PdpdaH@(1G>E4E?;XlGP_WJ zM7Z#8Aeop&y4_O>Vf)*l!pV8 z9@cp(x8gVSujk$~Tv0*GZlWc#rmas9)5r<@KpZ6~!nuXH!2QEE4&(ee_KLl=AF7U? z7mi@cSR46?QBvb&y!=YL+V7kGVWq2-+S;p#1dy50{d|2!baQV2YAyvOumUOA>)YZt zD@ryVlA6DtxTaiUDzNCl)?4c4kMlNt_?PzLTc#JN@li$B%)56AORd1pAx7b6v=Y5T z)Y50$6)v%b;@Lk@ukWQWY6Y2vc4E>GZ!)A~6MLM;-R;cI6l*S0k#!XXt@wgChGSia zoWA8yG7<3+BEk0JGpss_@VD5|{{XF=_}n5jyt!l0b+LG5TjLexHuaU<`}qF=ZxPnN zlx6qkC%_AM*B*PEtS@&(!SG7ar;G2}8d(>7r=E_!=B3vsPhvN7=JDOvj^nyZc|}*U zyk{-q0_%taad^h&>L(pT1}B&Y5C-5Lg$o1IN1@yn{Rx8vgRw1D#hc39QSMYHKZwV{ z9@m62zR|8)Yf_J&pvt8K zMOyTT0LFQ^SK*_m=oIK-ub4E$vtP>RpmsB2;43=~;iwpx5+9wsfyiDXzfTemz_+_=;V zx#D5oCT>y0s@E_VF_!-T5W^2Ln}MJFH7S8Es8(MGw{ZJal})@cUU-)rHkDByr*eba z7>wV`80d;^3l7r*{BQZ;+g5z*iL>2+UqMs7SkouA38+?C)Ls&3epi*KKI`g*Szo&&HwPhYDby3`s7~@t=Ru zDf|ob&zWnn$IQ>t(}L8a`kVTO!(uqUkF<*tqHBDAm&CRf=ABk-@7ai;Eb;a~?9C-= z3vEY0tN~Kg0P=RZN0vI0?1uT#$1jL$UV~K1*_3V%1irlsoWWSI^9z>=cMN6X9Jqfx zIX^LvJ9E%ObKBnRqxeI*quwsEBfN3@o4TwuBR%S7i4!1R127GxG#5T^H3~REQ7`~? z7=*(WN&p%w{=juZnmWAnV1}TjOv5a&I)$k?HLx@F3MHGt;9~*0<)c?0>0E_fuXp1F zypdMIqq5t7GVBKgWcr!vbG%FzYHVnYPI>dFWWh$GJe4Xj7C!uQ8ySWRMGfcP5PPsV zhp+-&R&e8W=h|=L>raeArIP3XTQ4dVa9=$FgAM8B^8H-99EMDl{yt%A7=rHLjAKPZ z5IKgb5tX1PSCt{6TFd=96vXoDt!RjT=7}l^*l(V3?NvBNqm`&%7?4wG7C{ zWzEmV5mwe~SK+7+>Slo2A~NMxRbzL;k7gA2e=^Pp zXqtFi^ZZK>YsoJ>-E_I^nf#kqAomv5KNE8TT#l@aU^R5$)_x%>vo86^8E+F1hG%u0 z1V*&U@^?5op2!NB(aQ$N*=n{|SPZih${tm_)vMx$rh&UoH}BMEE5ptTzqw4IEH*;! z!s!TnZhRJ8KC!VmA`&~H|^=r7Glfc4Ht%^QfwQFv8ckh zaT?0A6qScHx6Gk28kx<-H>UogJjLLj$Pv|8bq@qZ$DPAUH{S(4`II-JTN5E4D4`s=3cQbdPeaoQw+>LfnJs9 zTnG^2?GPOZt}a$W$aFLe7^p80oA-4M2;_sz5)4+RRByQMu#%#-?gN1YvvQG>%`v(; zh(m$ydy;e1sPI7ej$eP>N4*4Hn91^TaULyjB>h?7`j;ggwyD!H6Kson{{U4?!LvED z+u8xT_g8ZP4Hq+Z2iOzuXsGG+LJjV}SrK1BsWgNNo; z$jUkLHR7rptxD8wg9W~W9hes}uU4T<4_sTM%iW6it^G^6rF*Bl0B%+~u$!pYl4g5L zGQciz0JUleU^qk696<^;=gbqCdyQ*^!R+c5Zs>;}#0H%?j`aPfLh&3dE*yckwphcZ&{K6^ z+#@oeb{wC^{9F~=#44$Pb1|Y9R|}|3!8n3nP?ZC@P=v2fKZoKV=|kOWa1jTb#<<>q zhakNC%F-=cm@mw_WiOP*rLEND7MPx?QrGN^C#PXi0!b7g??P-;ED@Y19^!76NLV zIBvDXFmS`K_tX)=2(Ya{%(-}kBq}q>22{kyqV5oh906Q4%8KuUJWCmyFSM=!1f!To zfw^-SKviZd!Yh5FFA6^|^()a;qxCB5Pe%=qM$aDwpCFzF~v3 zC__vDeuJ-GKzzolCMfwk*l7^)vgmdDmf-)J#9lyZ=$zhD}Wl$#)v2 z97;DLdB;#ip;m1xZ$+@R~Au3qelx3V+juN-+JSgftI5t0X0BIfe5AiGxA0V_LQ zMas@l&D~I@EKl{zkRi=h3YqZ+FNvH%156m)yMiymHJBD#a^=G1ULaOw`c>{?ro*IL zPk+?uQI0Q&P`x>~ZbFsuqwPx=qHnOL^EY02qlRS8y@u$PY#4+tM0c+lPPDijm>@Fy3 z^Y7r%;E6#{2^1}ZZ@DpAZw-@XRA6-uR6O;n-!}Y0j4PjU$!H>AcMuDg*$Us#>*+o~r>R{4j zUFUIxS4iS9q(YqW9hPSU;%6b`de1`#Bl#;+PmjYimE;9{yOijwDK;m(5r!&kC{0FEY$;5K!4kFUvJ>HKu3#9n# z2txAL)FIpqT^xMFtz}oHI={rJHr<1_h;C_+I48H({*Sz|0g-7dG4p3fD$^XG!kAk1 z{LW$}6uWjyyvtvjb;LJ{qgh^GW@1!e_m0Eu5t|GsbVb^tw_+jYB~ZM@0*agHd%BhYe5IBIJ z`43gVmuL)2j(i-fe9;ubG72Rs!p{NX8DT{BIA4AvrV{|zb1L1d<<5vl0msV++nBw^ z?C>x1H%>##!B=pDg%AUqRjp)xA>uA(gshZ5aIl518u3vImh9pbW;rJ`Z0MJZ>2(Xm(_R`9O!W3yq(GI#)82;6?f- zyy(Z{eM?+0;(*U$?~kHWRNPPc^2#A-#^5PDGtB^P8y{6DGPb#!a4)&v5WdhR+Vml- zhj3wtf8d9p2qymkHji%O3Ow!t@EivOa;VmpEGLx$75cJukixt~D~F93o6;AN;Df>i zuYcqv#D=mtQ~Q?_a7F#gnxl%h#boXpf`NG*%iE(f%l-L@L|rS&7yiVk8XZ?(h&;wm6*2bZmF*2pg=y|L9tnRdR<+|X zTLc}(-x!sfM{BEB%H{JaC!*3Ua)wq^1B@Z(!dy~jWfXy|&`s)ejxofk;D)C%=8*Lv z2heT6r^ecyMYbE^0WdQALlu#`;iB=;5zbsKDDt~lV_H_Dx-hVCxd)nzwMD-@67xX0 zzSu%!yu&+Cq1R)X&F1q5$xum|m3jv^$L2o-mtfUvWE$=OeXhUV!*&g+@CEC*Q;9f_ zd(0K80{r&*nPnqfe~2NemVXlx0`sJ&aLUJ~FYXdB@zb@R`ON)$eV*?U8|M{(IT&UG)o9j35=-*DV#<`?*p zkFoydVWIp%skK$y2DT}x(JS>UNNsiS2~Xyu33XpgR(Fo<{YMCvwXri^`NVbWQSUG~ zckG|3%)-#*ij)n%Ta;~3ecogEAiV>oV>YV%e>&8$foKNYP)^LfyEdpdq3x_6YGLeT zY?Avf{c3%C>@fMTlw8H+cJq7rm)4!jgJdT-m)tzSVgCSu4Ek@dG;??fos<}@&-wg7 zZx_XCQNtB1qBY9Mee2>;N-ea5m(G2qhXOfV&3VoP^*4DGD~^|y{{V3~%dBFKLI_xB zuf}_a!L7M_^9-!-9@x~rvds2Ys-||%{x=&?7dbuZAo6MM88yl-vvfR)A1MyGItUm8%-q_yIQc?{3r}PtlEvw-Xj|Az-`*7!Sn@p46!A@O zr~B?Hxm|~Yfc?uNyoY{kiINnQiu2}yjjaKjUH2DQy%vu~3LvasFZua_XtWuwFGC2gPEsNX)nEl|b|@O79Q1QOW`%Krc^ z{fNavuYyg#GaHcL+u9booVj~^!r@EdsdnUH@7fycee(v$T-FBsK+748;sPLKoE4eP zdKY^Nha7dzR%I{R28>be`1h2#1+~M}9($jS)x`Y&05Zk0(*EnlX8!<)siTi=RL)BI zZuMUIl*VSyDl&f$6*$1Fkp&lB!wek*VcHs{&fvDk9C?@US_6}Hf4HJjn)Y%2_JFS| zmqh66EWg03o|?qN3GJh0EE=ZTd#w=au(C`nzb%L^VQGnqnwD-A3Wg;vr6naJ6|qyp zbz|SC^#qZ%C{gO;(_1N>gXivH?h?6O`TnIhUYNk$($z@rvkHI>qgI{_Gt_sK@Qn(h z^PJnk^ED`J>|iThzB$ZbDskYhB|?A&!kyJ0nTBN!z{@$+Q+>Qd!H?oa+jTiVuU-CQp@)s}0ocjVqgS3P12)4oyaCK>=C;C*82d=${J`l11_zxu#ID@fq~5%96RozW$`3dR#yON4(26u+{7n8MRi2op zb19-d@hDxau{XeFJ0|EqakH9MQoKR#ArOaZ=2K)Vhq&v&+`Njew*00ogN`oOiHYFb zYou2c-&2mv&TF3)4KII3ZI6Z@@isSJLPqZ$F(%xO7!$nU1HPji=Dv#Noir)}>;mh_ zdCUV02WC9^U?{bjJiSif_ImJld<5+;``@ zO5Q`IxPDj9E-_yEjLbFUTx*45Qoyyk$cddwp&t$vbUhdM1<-f{3JWgr{Xor{mp8NK zGc|Q|zX8-gZ7zb`-{&_L;kLD&mC( zR1aQdc#UTxx_N=`F`N$>{-BLoxwBWnMh|>S*yAGlBYaqZFIKpCd_t6!FRH#^9=uN>8a!V^tLSkC`#Wpq&+PM#QMYz_XK>`ALuoG~V+Aq>*%92I3WJ6v5;S ze&!E{GRKF%H4Pl}pjNQFO``=Mg;;Wa<}Rg_fwUc5UO-5+I>Z-=!%9ZS#WBJojtXh) z(&9CWw?O1|=y8}GG!O0{0I!hC&gU&ciP#Z+kh-;LOxG4%SjIFx&&P1p?GZShCs~9Z za~SSN8NY9dxP&iezwE)vfcJBrf(10+5IBw8@}?+jJ~*Fw(k)x%o8$uIJqx)0%<~o4 zwZ+S8ktQvHz4QL4Sa8(^PzbumKf27QbzdcWOi=TTOQHo(0SB7xdyJj!0lGST>M@~Y z$AX3-7=~NJUp)R|7O=5P%4U3?nl}M={?u=V7wmiSEGud_ZmDgizxx={JFUJ?Blw1I z#Peap%%f#QB{{~f`I#W5Qi&AR2)6Z^MIAw6!xj$?Ys5Cd#e9+83wX(?P4#F}x(!ji z`*j>cBLP$f6}Izt3fk_vs_Kg6Hu62)f&SnXB`*rAf!XHgGtKI9wOLPWM$`$Q_Tl$& zY6{!3`_cTtOI=yt=3*-7x+XrLu!=dwJ4#pDVM$`SZWt&0pv#EpHDu`COz|EF1lD|$ zTCpf#4y?bJ=K+m@@VUg+8G{Nnhs<=)X4zR>&x}xEOdA0CA!z{P#|(@z_)j6UeQia^;&Nt zTsmupr&&H4xDTG%q(#3tZrTm{(JVd)4QRN6J9N6Kj>Wd=Lh3g3@01=*`}r@znpn854uE3|Vp`E%3pMZG5QxV_u=%gzKlj5|k)y}z2n1f07Tp2xzavg1+M3 Mb7ltn_VGXe+3&0UHUIzs literal 0 HcmV?d00001 diff --git a/docs/redirects.js b/docs/redirects.js index 52a8281777f..e4beb19507c 100644 --- a/docs/redirects.js +++ b/docs/redirects.js @@ -106,7 +106,12 @@ const ORIGINAL_NEXT = [ const CURRENT = [ { source: '/docs/guides/keystone-5-vs-keystone-next', - destination: '/docs/guides/keystone-5-vs-keystone-6-preview', + destination: '/updates/keystone-5-vs-keystone-6-preview', + permanent: true, + }, + { + source: '/docs/guides/keystone-5-vs-keystone-6-preview', + destination: '/updates/keystone-5-vs-keystone-6-preview', permanent: true, }, ]; diff --git a/tests/test-projects/crud-notifications/CHANGELOG.md b/tests/test-projects/crud-notifications/CHANGELOG.md index 4315359a821..d1ab06577e5 100644 --- a/tests/test-projects/crud-notifications/CHANGELOG.md +++ b/tests/test-projects/crud-notifications/CHANGELOG.md @@ -1,6 +1,7 @@ # @keystone-next/test-projects-crud-notifications ## 0.0.3 + ### Patch Changes - Updated dependencies [[`e9f3c42d5`](https://github.com/keystonejs/keystone/commit/e9f3c42d5b9d42872cecbd18fbe9bf9d7d53ed82), [`5cd8ffd6c`](https://github.com/keystonejs/keystone/commit/5cd8ffd6cb822dbee8555b47846a5019c4d2b1c3), [`1cbcf54cb`](https://github.com/keystonejs/keystone/commit/1cbcf54cb1206461866b582865e3b1a8fc728f18), [`a92169d04`](https://github.com/keystonejs/keystone/commit/a92169d04e5a1a98deb8e757b8eae3b06fc66450), [`5cd8ffd6c`](https://github.com/keystonejs/keystone/commit/5cd8ffd6cb822dbee8555b47846a5019c4d2b1c3), [`b696a9579`](https://github.com/keystonejs/keystone/commit/b696a9579b503db86f42776381e247c4e1a7409f), [`f3014a627`](https://github.com/keystonejs/keystone/commit/f3014a627060c7cd86440a6937da5caecfd023a0), [`092df6678`](https://github.com/keystonejs/keystone/commit/092df6678cea18d639be16ad250ec4ecc9250f5a), [`5cd8ffd6c`](https://github.com/keystonejs/keystone/commit/5cd8ffd6cb822dbee8555b47846a5019c4d2b1c3), [`6da56b80e`](https://github.com/keystonejs/keystone/commit/6da56b80e03c748a621afcca6c1ec2887fef7271), [`4f4f0351a`](https://github.com/keystonejs/keystone/commit/4f4f0351a056dea9d1614aa2a3a4789d66bb402d), [`697efa354`](https://github.com/keystonejs/keystone/commit/697efa354b1066b3d4b6eb757ca704b458f45e93), [`c7e331d90`](https://github.com/keystonejs/keystone/commit/c7e331d90a28b2ed8236100097cb8d34a11fabe2), [`3a7a06b2c`](https://github.com/keystonejs/keystone/commit/3a7a06b2cc6b5ea157d34d925b15494b471899eb), [`272b97b3a`](https://github.com/keystonejs/keystone/commit/272b97b3a10c0dfada782171d55ef7ac6f47c98f), [`78dac764e`](https://github.com/keystonejs/keystone/commit/78dac764e1860b33f9e2bd8cee6015abeaaa5ec4), [`399561b27`](https://github.com/keystonejs/keystone/commit/399561b2769ddd8f3d3fdf29838f5784404bb053), [`9d361c1c8`](https://github.com/keystonejs/keystone/commit/9d361c1c8625e1390f837b7318b63547d686a63b), [`0dcb1c95b`](https://github.com/keystonejs/keystone/commit/0dcb1c95b5200750cc8649485425f2ae40d023a3), [`94435ffee`](https://github.com/keystonejs/keystone/commit/94435ffee765824091899242e4a2f73c7356b524), [`5cd8ffd6c`](https://github.com/keystonejs/keystone/commit/5cd8ffd6cb822dbee8555b47846a5019c4d2b1c3), [`56044e2a4`](https://github.com/keystonejs/keystone/commit/56044e2a425f4256b66475fd3b1a6342cd6c3bf9), [`f46fd32b7`](https://github.com/keystonejs/keystone/commit/f46fd32b7047dbb5ea2566859f7ecee8db5b0b15), [`874f2c405`](https://github.com/keystonejs/keystone/commit/874f2c4058c9cf006213e84b9ffcf39c5bf144e8), [`8ea4eed55`](https://github.com/keystonejs/keystone/commit/8ea4eed55367aaa213f6b4ffb7473087498e39ae), [`e3fe6498d`](https://github.com/keystonejs/keystone/commit/e3fe6498dc36203d8080dff3c2e0c25f6c98733e), [`1030296d1`](https://github.com/keystonejs/keystone/commit/1030296d1f304dc44246e895089ac1f992e80590), [`3564b342d`](https://github.com/keystonejs/keystone/commit/3564b342d6dc2127ae591d7ac055af9eae90543c), [`8b2d179b2`](https://github.com/keystonejs/keystone/commit/8b2d179b2463d78b082182ca9afa8233109e0ba3), [`e3fefafcc`](https://github.com/keystonejs/keystone/commit/e3fefafcce6f8bf836c9bf0f4d931b8200ba41c7), [`4d9f89f88`](https://github.com/keystonejs/keystone/commit/4d9f89f884e2bf984fdd74ca2cbb7874b25b9cda), [`686c0f1c4`](https://github.com/keystonejs/keystone/commit/686c0f1c4a1feb609e1584aa71738709bbbf984e), [`d214e2f72`](https://github.com/keystonejs/keystone/commit/d214e2f72bae1c798e2415a38410d6063c333e2e), [`f5e64af37`](https://github.com/keystonejs/keystone/commit/f5e64af37df2eb460c89d89fa3c8924fb34970ed)]: