From 194d7bcc564469b82bcfc4353f971f740ab1e6bc Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:00:59 -0700 Subject: [PATCH 01/19] update interaction.drilldown code sample (#1198) --- navigation.mdx | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/navigation.mdx b/navigation.mdx index e00754d31..bbc801c64 100644 --- a/navigation.mdx +++ b/navigation.mdx @@ -610,24 +610,22 @@ Control how users interact with navigation elements using the `interaction` prop ### Enable auto-navigation for groups -When a user expands a navigation group, some themes will automatically navigate to the first page in the group. You can override a theme's default behavior using the `drilldown` option: +When a user expands a navigation group, some themes will automatically navigate to the first page in the group. You can override a theme's default behavior using the `drilldown` option. -```json -{ - "interaction": { - "drilldown": true // Force navigation to first page when a user expands a dropdown - } +- Set to `true` to force automatic navigation to the first page when a navigation group is selected. +- Set to `false` to prevent navigation and only expand or collapse the group when it is selected. +- Leave unset to use the theme's default behavior. + + +```json Force navigation +"interaction": { + "drilldown": true // Force navigation to first page when a user expands a dropdown } ``` -```json -{ - "interaction": { - "drilldown": false // Never navigate, only expand/collapse - } +```json Prevent navigation +"interaction": { + "drilldown": false // Never navigate, only expand or collapse the group } ``` - -- Set to `true` to force automatic navigation to the first page when a navigation group is selected. -- Set to `false` to prevent navigation and only expand or collapse the group when it is selected. -- Leave unset to use the theme's default behavior. + From dbf5ce2c2d92619544c06aa2ed1934626c15a2a5 Mon Sep 17 00:00:00 2001 From: RoyceWilliams510 Date: Thu, 18 Sep 2025 12:49:46 -0700 Subject: [PATCH 02/19] removed quotes (#1203) --- guides/hidden-pages.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/hidden-pages.mdx b/guides/hidden-pages.mdx index 18adab382..5aea5d0c3 100644 --- a/guides/hidden-pages.mdx +++ b/guides/hidden-pages.mdx @@ -76,4 +76,4 @@ By default, hidden pages are excluded from indexing for search engines, internal } ``` -To exclude a specific page, add `noindex: "true"` to its frontmatter. \ No newline at end of file +To exclude a specific page, add `noindex: true` to its frontmatter. \ No newline at end of file From c6b60fdf4608c86db448f3d1f998f8512433b64d Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Thu, 18 Sep 2025 13:38:56 -0700 Subject: [PATCH 03/19] Add missing hostnames to CSP configuration (#1202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add missing hostnames to CSP configuration Added 13 missing domains found in comprehensive codebase search: - *.mintlify.com (dashboard, API, analytics proxy) - leaves.mintlify.com (GitLab webhooks) - d1ctpt7j8wusba.cloudfront.net (mint releases) - mintcdn.com (asset tracking) - api.mintlifytrieve.com (search API) - mintlify-assets.b-cdn.net (BunnyCDN) - mintlify.s3-us-west-1.amazonaws.com (S3 images) - fonts.googleapis.com (Google Fonts) - cdn.jsdelivr.net (emoji assets) - us.posthog.com (PostHog analytics) - cdn.getkoala.com (Koala analytics) - browser.sentry-cdn.com (Sentry error tracking) - js.sentry-cdn.com (Sentry SDK) Updated domain whitelist table and all CSP configuration examples (Cloudflare, AWS CloudFront, Vercel) to include required domains. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * Apply suggestions from code review Co-authored-by: Mayank Shouche <43075711+mayankshouche@users.noreply.github.com> * Update guides/csp-configuration.mdx Co-authored-by: Lucas <18381968+lucaspunz@users.noreply.github.com> * Update guides/csp-configuration.mdx * Update CSP examples to match revised domain whitelist - Remove mintlify-assets.b-cdn.net and mintlify.s3-us-west-1.amazonaws.com - Add *.mintcdn.com wildcard domain to img-src and connect-src - Update all configuration examples (main, Cloudflare, AWS CloudFront, Vercel) - Align with reviewer feedback from PR #1202 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * remove redundancies in examples --------- Co-authored-by: Claude Co-authored-by: Mayank Shouche <43075711+mayankshouche@users.noreply.github.com> Co-authored-by: Lucas <18381968+lucaspunz@users.noreply.github.com> --- guides/csp-configuration.mdx | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/guides/csp-configuration.mdx b/guides/csp-configuration.mdx index 5f4527f1a..c729cdb87 100644 --- a/guides/csp-configuration.mdx +++ b/guides/csp-configuration.mdx @@ -23,15 +23,27 @@ The following CSP directives are used to control which resources can be loaded: | Domain | Purpose | CSP directive | Required | |:-------|:--------|:--------------|:-------| | `d4tuoctqmanu0.cloudfront.net` | KaTeX CSS, fonts | `style-src`, `font-src` | Required | -| `*.mintlify.dev` | Documentation content | `connect-src` | Required | +| `*.mintlify.dev` | Documentation content | `connect-src`, `frame-src` | Required | +| `*.mintlify.com` | Dashboard, API, analytics proxy | `connect-src` | Required | +| `leaves.mintlify.com` | Assistant API | `connect-src` | Required | | `d3gk2c5xim1je2.cloudfront.net` | Icons, images, logos | `img-src` | Required | +| `d1ctpt7j8wusba.cloudfront.net` | Mint version and release files | `connect-src` | Required | +| `mintcdn.com` | Images, favicons | `img-src`, `connect-src` | Required | +| `*.mintcdn.com` | Images, favicons | `img-src`, `connect-src` | Required | +| `api.mintlifytrieve.com` | Search API | `connect-src` | Required | +| `cdn.jsdelivr.net` | Emoji assets for OG images | `script-src`, `img-src` | Required | +| `fonts.googleapis.com` | Google Fonts | `style-src`, `font-src` | Optional | | `www.googletagmanager.com` | Google Analytics/GTM | `script-src`, `connect-src` | Optional | | `cdn.segment.com` | Segment analytics | `script-src`, `connect-src` | Optional | | `plausible.io` | Plausible analytics | `script-src`, `connect-src` | Optional | +| `us.posthog.com` | PostHog analytics | `connect-src` | Optional | +| `cdn.getkoala.com` | Koala analytics | `script-src` | Optional | | `tag.clearbitscripts.com` | Clearbit tracking | `script-src` | Optional | | `cdn.heapanalytics.com` | Heap analytics | `script-src` | Optional | | `chat.cdn-plain.com` | Plain chat widget | `script-src` | Optional | | `chat-assets.frontapp.com` | Front chat widget | `script-src` | Optional | +| `browser.sentry-cdn.com` | Sentry error tracking | `script-src`, `connect-src` | Optional | +| `js.sentry-cdn.com` | Sentry JavaScript SDK | `script-src` | Optional | ## Example CSP configuration @@ -42,12 +54,14 @@ The following CSP directives are used to control which resources can be loaded: ```text wrap Content-Security-Policy: default-src 'self'; -script-src 'self' 'unsafe-inline' 'unsafe-eval' www.googletagmanager.com cdn.segment.com plausible.io tag.clearbitscripts.com cdn.heapanalytics.com -chat.cdn-plain.com chat-assets.frontapp.com; -style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; -font-src 'self' d4tuoctqmanu0.cloudfront.net; -img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; -connect-src 'self' *.mintlify.dev www.googletagmanager.com cdn.segment.com plausible.io; +script-src 'self' 'unsafe-inline' 'unsafe-eval' cdn.jsdelivr.net www.googletagmanager.com cdn.segment.com plausible.io +us.posthog.com cdn.getkoala.com tag.clearbitscripts.com cdn.heapanalytics.com chat.cdn-plain.com chat-assets.frontapp.com +browser.sentry-cdn.com js.sentry-cdn.com; +style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; +font-src 'self' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; +img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net mintcdn.com *.mintcdn.com cdn.jsdelivr.net; +connect-src 'self' *.mintlify.dev *.mintlify.com d1ctpt7j8wusba.cloudfront.net mintcdn.com *.mintcdn.com +api.mintlifytrieve.com www.googletagmanager.com cdn.segment.com plausible.io us.posthog.com browser.sentry-cdn.com; frame-src 'self' *.mintlify.dev; ``` @@ -66,7 +80,7 @@ Create a Response Header Transform Rule: - **Header name**: `Content-Security-Policy` - **Header value**: ```text wrap - default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev; + default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; font-src 'self' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net mintcdn.com *.mintcdn.com cdn.jsdelivr.net; connect-src 'self' *.mintlify.dev *.mintlify.com d1ctpt7j8wusba.cloudfront.net mintcdn.com *.mintcdn.com api.mintlifytrieve.com; frame-src 'self' *.mintlify.dev; ``` 4. Deploy your rule. @@ -81,7 +95,7 @@ Add a response headers policy in CloudFront: "Config": { "SecurityHeadersConfig": { "ContentSecurityPolicy": { - "ContentSecurityPolicy": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev;", + "ContentSecurityPolicy": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; font-src 'self' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net mintcdn.com *.mintcdn.com cdn.jsdelivr.net; connect-src 'self' *.mintlify.dev *.mintlify.com d1ctpt7j8wusba.cloudfront.net mintcdn.com *.mintcdn.com api.mintlifytrieve.com; frame-src 'self' *.mintlify.dev;", "Override": true } } @@ -102,7 +116,7 @@ Add to your `vercel.json`: "headers": [ { "key": "Content-Security-Policy", - "value": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev;" + "value": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; font-src 'self' d4tuoctqmanu0.cloudfront.net fonts.googleapis.com; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net mintcdn.com *.mintcdn.com cdn.jsdelivr.net; connect-src 'self' *.mintlify.dev *.mintlify.com d1ctpt7j8wusba.cloudfront.net mintcdn.com *.mintcdn.com api.mintlifytrieve.com; frame-src 'self' *.mintlify.dev;" } ] } From 7c71d9cd8ebf93b599004df3f02839326c540e4f Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:23:04 -0700 Subject: [PATCH 04/19] Added custom reverse proxy configurartion. (#1200) * Update advanced/reverse-proxy.mdx * Update docs.json * Documentation edits made through Mintlify web editor * Update advanced/reverse-proxy.mdx * Update advanced/reverse-proxy.mdx * Update advanced/reverse-proxy.mdx * Documentation edits made through Mintlify web editor * Documentation edits made through Mintlify web editor * move from `advanced` to `guides` * copy edit * remove Custom from title * fix group casing * concision * update header * replace lists with table * more active language * remove redundant example * update placeholder * remove propagating snippet * copy edit troubleshooting * make limitations more solutions-oriented * update example config --------- Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> --- docs.json | 7 ++- guides/reverse-proxy.mdx | 133 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 guides/reverse-proxy.mdx diff --git a/docs.json b/docs.json index e364b4726..6d1555857 100644 --- a/docs.json +++ b/docs.json @@ -154,17 +154,18 @@ "settings/custom-404-page", "guides/monorepo", { - "group": "Custom Subdirectory", + "group": "Custom subdirectory", "icon": "folder", "pages": [ "advanced/subpath/cloudflare", "advanced/subpath/route53-cloudfront", "advanced/subpath/vercel", + "guides/reverse-proxy", "guides/csp-configuration" ] }, { - "group": "Dashboard Access", + "group": "Dashboard access", "icon": "gauge", "pages": [ "advanced/dashboard/sso", @@ -551,4 +552,4 @@ "publicApiKey": "pk_76a6caa274e800f3ceff0b2bc6b9b9d82ab8" } } -} +} \ No newline at end of file diff --git a/guides/reverse-proxy.mdx b/guides/reverse-proxy.mdx new file mode 100644 index 000000000..8b033e68b --- /dev/null +++ b/guides/reverse-proxy.mdx @@ -0,0 +1,133 @@ +--- +title: "Reverse proxy" +description: "Configure a custom reverse proxy to serve your documentation" +--- + + + Reverse proxy configurations are only supported for [Custom plans](https://mintlify.com/pricing?ref=reverse-proxy). + + +To serve your documentation through a custom reverse proxy, you must configure routing rules, caching policies, and header forwarding. + +When you implement a reverse proxy, monitor for potential issues with domain verification, SSL certificate provisioning, authentication flows, performance, and analytics tracking. + +## Routing configuration + +Proxy these paths to your Mintlify subdomain with the specified caching policies: + +| Path | Destination | Caching | +|------|-------------|---------| +| `/.well-known/acme-challenge/*` | `.mintlify.app` | No cache | +| `/.well-known/vercel/*` | `.mintlify.app` | No cache | +| `/mintlify-assets/_next/static/*` | `.mintlify.app` | Cache enabled | +| `/*` | `.mintlify.app` | No cache | +| `/` | `.mintlify.app` | No cache | + +## Required header configuration + +Configure your reverse proxy with these header requirements: + +- **Origin**: Contains the target subdomain `.mintlify.app` +- **X-Forwarded-For**: Preserves client IP information +- **X-Forwarded-Proto**: Preserves original protocol (HTTP/HTTPS) +- **X-Real-IP**: Forwards the real client IP address +- **User-Agent**: Forwards the user agent + + + Ensure that the `Host` header is not forwarded + + +## Example nginx configuration + +```nginx +server { + listen 80; + server_name .com; + + # Let's Encrypt verification paths + location ~ ^/\.well-known/acme-challenge/ { + proxy_pass https://.mintlify.app; + proxy_set_header Origin .mintlify.app; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header User-Agent $http_user_agent; + + # Disable caching for verification paths + add_header Cache-Control "no-cache, no-store, must-revalidate"; + } + + # Vercel verification paths + location ~ ^/\.well-known/vercel/ { + proxy_pass https://.mintlify.app; + proxy_set_header Origin .mintlify.app; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header User-Agent $http_user_agent; + + # Disable caching for verification paths + add_header Cache-Control "no-cache, no-store, must-revalidate"; + } + + # Static assets with caching + location ~ ^/mintlify-assets/_next/static/ { + proxy_pass https://.mintlify.app; + proxy_set_header Origin .mintlify.app; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header User-Agent $http_user_agent; + + # Enable caching for static assets + add_header Cache-Control "public, max-age=86400"; + } + + # Root path + location = / { + proxy_pass https://.mintlify.app; + proxy_set_header Origin .mintlify.app; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header User-Agent $http_user_agent; + + # Disable caching for dynamic content + add_header Cache-Control "no-cache, no-store, must-revalidate"; + } + + # All other documentation paths + location / { + proxy_pass https://.mintlify.app; + proxy_set_header Origin .mintlify.app; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header User-Agent $http_user_agent; + + # Disable caching for dynamic content + add_header Cache-Control "no-cache, no-store, must-revalidate"; + } +} +``` + +## Troubleshooting + +### 404 error + +**Symptoms**: Documentation loads, but features don't work. API calls fail. + +**Cause**: `Host` header is being forwarded or `Origin` header is missing. + +**Solution**: + +- Remove `Host` header forwarding +- Set `Origin` header to `.mintlify.app` + +### Performance issues + +**Symptoms**: Slow page loads and layout shifts. + +**Cause**: Incorrect caching configuration. + +**Solution**: Enable caching only for `/mintlify-assets/_next/static/*` paths. From 0f9cb3cf863550953f6df050271a38b958464ece Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Fri, 19 Sep 2025 10:05:27 -0700 Subject: [PATCH 05/19] Update Vale configuration (#1194) * add CI workflow * add script to find new vocabulary terms * add vocab accept list * add modified Google styles * add Mintlify headings * add vale.ini * update vocab with Mintlify defaults * add README for vale * update vocab * fix vale.ini * remove redundant workflow * update vocab * add running vale to the Claude review command --- .claude/commands/review.md | 3 +- .vale.ini | 30 +++ .vale/README.md | 45 ++++ .vale/scripts/discover-vocabulary.sh | 33 +++ .vale/styles/Google/AMPM.yml | 9 + .vale/styles/Google/Acronyms.yml | 64 ++++++ .vale/styles/Google/DateFormat.yml | 9 + .vale/styles/Google/Ellipses.yml | 9 + .vale/styles/Google/EmDash.yml | 13 ++ .vale/styles/Google/Exclamation.yml | 12 + .vale/styles/Google/FirstPerson.yml | 13 ++ .vale/styles/Google/HeadingPunctuation.yml | 13 ++ .vale/styles/Google/Headings.yml | 39 ++++ .vale/styles/Google/Latin.yml | 11 + .vale/styles/Google/LyHyphens.yml | 14 ++ .vale/styles/Google/OptionalPlurals.yml | 12 + .vale/styles/Google/Ordinal.yml | 7 + .vale/styles/Google/OxfordComma.yml | 7 + .vale/styles/Google/Parens.yml | 7 + .vale/styles/Google/Passive.yml | 184 +++++++++++++++ .vale/styles/Google/Periods.yml | 7 + .vale/styles/Google/Quotes.yml | 7 + .vale/styles/Google/Ranges.yml | 7 + .vale/styles/Google/Semicolons.yml | 8 + .vale/styles/Google/Spacing.yml | 10 + .vale/styles/Google/Spelling.yml | 10 + .vale/styles/Google/Units.yml | 8 + .vale/styles/Google/Will.yml | 7 + .vale/styles/Google/WordList.yml | 44 ++++ .../config/vocabularies/Mintlify/accept.txt | 213 ++++++++++++++++++ 30 files changed, 854 insertions(+), 1 deletion(-) create mode 100644 .vale.ini create mode 100644 .vale/README.md create mode 100755 .vale/scripts/discover-vocabulary.sh create mode 100644 .vale/styles/Google/AMPM.yml create mode 100644 .vale/styles/Google/Acronyms.yml create mode 100644 .vale/styles/Google/DateFormat.yml create mode 100644 .vale/styles/Google/Ellipses.yml create mode 100644 .vale/styles/Google/EmDash.yml create mode 100644 .vale/styles/Google/Exclamation.yml create mode 100644 .vale/styles/Google/FirstPerson.yml create mode 100644 .vale/styles/Google/HeadingPunctuation.yml create mode 100644 .vale/styles/Google/Headings.yml create mode 100644 .vale/styles/Google/Latin.yml create mode 100644 .vale/styles/Google/LyHyphens.yml create mode 100644 .vale/styles/Google/OptionalPlurals.yml create mode 100644 .vale/styles/Google/Ordinal.yml create mode 100644 .vale/styles/Google/OxfordComma.yml create mode 100644 .vale/styles/Google/Parens.yml create mode 100644 .vale/styles/Google/Passive.yml create mode 100644 .vale/styles/Google/Periods.yml create mode 100644 .vale/styles/Google/Quotes.yml create mode 100644 .vale/styles/Google/Ranges.yml create mode 100644 .vale/styles/Google/Semicolons.yml create mode 100644 .vale/styles/Google/Spacing.yml create mode 100644 .vale/styles/Google/Spelling.yml create mode 100644 .vale/styles/Google/Units.yml create mode 100644 .vale/styles/Google/Will.yml create mode 100644 .vale/styles/Google/WordList.yml create mode 100644 .vale/styles/config/vocabularies/Mintlify/accept.txt diff --git a/.claude/commands/review.md b/.claude/commands/review.md index f75a18c3d..094dd4ece 100644 --- a/.claude/commands/review.md +++ b/.claude/commands/review.md @@ -9,6 +9,7 @@ Please review the changes I'm about to commit and check: 3. Are any code examples accurate? 4. Is the frontmatter complete and correct? 5. Does the content match our existing style? -6. Are there any links that need testing? +6. Run vale on the files being updated and make a plan to resolve any errors, warnings, and suggestions. +7. Are there any links that need testing? $ARGUMENTS diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 000000000..9c3a813f9 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,30 @@ +# Vale configuration for Mintlify documentation + +StylesPath = .vale/styles +MinAlertLevel = suggestion +IgnoredScopes = code, tt, img, url, a +SkippedScopes = script, style, pre, figure, code + +Packages = Google + +Vocab = Mintlify + +# This is required since Vale doesn't officially support MDX +[formats] +mdx = md + +# MDX support +[*.mdx] +BasedOnStyles = Vale, Google +Vale.Terms = NO # Enforces really harsh capitalization rules, keep off +Vale.Avoid = NO # Too aggressive about common technical terms + +# Token and block ignores for MDX-specific syntax +TokenIgnores = (?sm)((?:import|export) .+?$), \ +(?)(?!`), \ +(<[A-Z]\w+>.+?<\/[A-Z]\w+>) + +BlockIgnores = (?sm)^(<\w+\n .*\s\/>)$, \ +(?sm)^({.+.*}) + +CommentDelimiters = {/*, */} \ No newline at end of file diff --git a/.vale/README.md b/.vale/README.md new file mode 100644 index 000000000..98d533d45 --- /dev/null +++ b/.vale/README.md @@ -0,0 +1,45 @@ +# Vale Configuration for Mintlify Docs + +This directory contains the Vale linting configuration for Mintlify documentation. + +## Philosophy + +Start simple and grow incrementally as needs emerge. The current setup uses: + +- Core Mintlify-specific vocabulary +- Customized rules from the Google developer documentation style guide + +## Vale files +- `.vale.ini` - Main configuration file +- `styles/config/vocabularies/Mintlify/` - Mintlify-specific terms +- `styles/Google/` - Google developer documentation style rules customized for Mintlify docs + +## When to add vocabulary +- **Mintlify terms** - New components, features, platform-specific concepts +- **Frequent false positives** - Any terms that repeatedly trigger spelling errors, but shouldn't + +### Discover new vocabulary +Use the included script to find vocabulary candidates: +```bash +# Discover terms from all files +.vale/scripts/discover-vocabulary.sh + +# Discover from specific files +.vale/scripts/discover-vocabulary.sh "components/*.mdx" +``` + +This script: +1. Runs Vale on specified files +2. Extracts spelling error suggestions +3. Saves results to `.vale/vocabulary-candidates.txt` + +## When to add new rules +- **Consistent patterns** - The same style issue appears frequently +- **High-value, low-noise** - Rules that catch problems with minimal false positives + +### Testing new rules +Before adding a new rule: +1. Test locally: `vale path/to/file.mdx` +2. Run on sample files: `vale components/*.mdx` +3. Check false positive rate +4. Start with `level: suggestion` then promote to `warning` or `error` diff --git a/.vale/scripts/discover-vocabulary.sh b/.vale/scripts/discover-vocabulary.sh new file mode 100755 index 000000000..2c57423e4 --- /dev/null +++ b/.vale/scripts/discover-vocabulary.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Script to discover potential vocabulary terms from Vale output +# Usage: ./discover-vocabulary.sh [file-pattern] + +set -e + +PATTERN=${1:-"**/*.mdx"} +OUTPUT_FILE=".vale/vocabulary-candidates.txt" + +echo "🔍 Discovering vocabulary candidates from Vale spelling errors..." +echo "Pattern: $PATTERN" +echo "" + +# Run Vale and extract spelling error words +vale --no-exit $PATTERN 2>&1 | \ +grep "Vale.Spelling" | \ +sed -n "s/.*Did you really mean '\([^']*\)'.*/\1/p" | \ +sort | uniq -c | sort -nr > "$OUTPUT_FILE" + +if [ -s "$OUTPUT_FILE" ]; then + echo "Found vocabulary candidates in $OUTPUT_FILE:" + echo "" + head -20 "$OUTPUT_FILE" + echo "" + echo "Review these terms and add appropriate ones to:" + echo " - .vale/styles/config/vocabularies/Mintlify/accept.txt (if valid)" + echo " - .vale/styles/config/vocabularies/Mintlify/reject.txt (if misspellings)" + echo "" + echo "To clean up this file: rm $OUTPUT_FILE" +else + echo "✅ No vocabulary issues found!" + rm -f "$OUTPUT_FILE" +fi \ No newline at end of file diff --git a/.vale/styles/Google/AMPM.yml b/.vale/styles/Google/AMPM.yml new file mode 100644 index 000000000..37b49edf8 --- /dev/null +++ b/.vale/styles/Google/AMPM.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Use 'AM' or 'PM' (preceded by a space)." +link: "https://developers.google.com/style/word-list" +level: error +nonword: true +tokens: + - '\d{1,2}[AP]M\b' + - '\d{1,2} ?[ap]m\b' + - '\d{1,2} ?[aApP]\.[mM]\.' diff --git a/.vale/styles/Google/Acronyms.yml b/.vale/styles/Google/Acronyms.yml new file mode 100644 index 000000000..f41af0189 --- /dev/null +++ b/.vale/styles/Google/Acronyms.yml @@ -0,0 +1,64 @@ +extends: conditional +message: "Spell out '%s', if it's unfamiliar to the audience." +link: 'https://developers.google.com/style/abbreviations' +level: suggestion +ignorecase: false +# Ensures that the existence of 'first' implies the existence of 'second'. +first: '\b([A-Z]{3,5})\b' +second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)' +# ... with the exception of these: +exceptions: + - API + - ASP + - CLI + - CPU + - CSS + - CSV + - DEBUG + - DOM + - DPI + - FAQ + - GCC + - GDB + - GET + - GPU + - GTK + - GUI + - HTML + - HTTP + - HTTPS + - IDE + - JAR + - JSON + - JSX + - LESS + - LLDB + - NET + - NOTE + - NVDA + - OSS + - PATH + - PDF + - PHP + - POST + - RAM + - REPL + - RSA + - SCM + - SCSS + - SDK + - SQL + - SSH + - SSL + - SVG + - TBD + - TCP + - TODO + - URI + - URL + - USB + - UTF + - XML + - XSS + - YAML + - ZIP diff --git a/.vale/styles/Google/DateFormat.yml b/.vale/styles/Google/DateFormat.yml new file mode 100644 index 000000000..e9d227fa1 --- /dev/null +++ b/.vale/styles/Google/DateFormat.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Use 'July 31, 2016' format, not '%s'." +link: 'https://developers.google.com/style/dates-times' +ignorecase: true +level: error +nonword: true +tokens: + - '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}' + - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}' diff --git a/.vale/styles/Google/Ellipses.yml b/.vale/styles/Google/Ellipses.yml new file mode 100644 index 000000000..1e070517b --- /dev/null +++ b/.vale/styles/Google/Ellipses.yml @@ -0,0 +1,9 @@ +extends: existence +message: "In general, don't use an ellipsis." +link: 'https://developers.google.com/style/ellipses' +nonword: true +level: warning +action: + name: remove +tokens: + - '\.\.\.' diff --git a/.vale/styles/Google/EmDash.yml b/.vale/styles/Google/EmDash.yml new file mode 100644 index 000000000..6068c2c75 --- /dev/null +++ b/.vale/styles/Google/EmDash.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Don't put a space before or after an em dash." +link: "https://developers.google.com/style/dashes" +nonword: true +level: error +action: + name: edit + params: + - trim + - " " +tokens: + - '\s[—–]\s' + diff --git a/.vale/styles/Google/Exclamation.yml b/.vale/styles/Google/Exclamation.yml new file mode 100644 index 000000000..4d9bb874e --- /dev/null +++ b/.vale/styles/Google/Exclamation.yml @@ -0,0 +1,12 @@ +extends: existence +message: "Don't use exclamation points in text." +link: "https://developers.google.com/style/exclamation-points" +nonword: true +level: warning +action: + name: edit + params: + - trim_right + - "!" +tokens: + - '\w+!(?:\s|$)' diff --git a/.vale/styles/Google/FirstPerson.yml b/.vale/styles/Google/FirstPerson.yml new file mode 100644 index 000000000..0b7b8828c --- /dev/null +++ b/.vale/styles/Google/FirstPerson.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Avoid first-person pronouns such as '%s'." +link: 'https://developers.google.com/style/pronouns#personal-pronouns' +ignorecase: true +level: warning +nonword: true +tokens: + - (?:^|\s)I\s + - (?:^|\s)I,\s + - \bI'm\b + - \bme\b + - \bmy\b + - \bmine\b diff --git a/.vale/styles/Google/HeadingPunctuation.yml b/.vale/styles/Google/HeadingPunctuation.yml new file mode 100644 index 000000000..c1729868b --- /dev/null +++ b/.vale/styles/Google/HeadingPunctuation.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Don't put a period at the end of a heading." +link: "https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings" +nonword: true +level: warning +scope: heading +action: + name: edit + params: + - trim_right + - "." +tokens: + - '[a-z0-9][.]\s*$' diff --git a/.vale/styles/Google/Headings.yml b/.vale/styles/Google/Headings.yml new file mode 100644 index 000000000..756f95209 --- /dev/null +++ b/.vale/styles/Google/Headings.yml @@ -0,0 +1,39 @@ +extends: capitalization +message: "'%s' should use sentence-style capitalization." +link: "https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings" +level: warning +scope: heading +match: $sentence +exceptions: + - API + - APIs + - APP + - CDN + - CORS + - CLI + - CSS + - DNS + - GitHub + - GitLab + - HTML + - JavaScript + - JSON + - JWT + - Linux + - macOS + - Mintlify + - MDX + - OAuth + - OpenAPI + - PDF + - SAML + - SDK + - SSL + - SSO + - TLS + - TypeScript + - UI + - UX + - URL + - URLs + - Windows diff --git a/.vale/styles/Google/Latin.yml b/.vale/styles/Google/Latin.yml new file mode 100644 index 000000000..ca03b9154 --- /dev/null +++ b/.vale/styles/Google/Latin.yml @@ -0,0 +1,11 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: 'https://developers.google.com/style/abbreviations' +ignorecase: true +level: error +nonword: true +action: + name: replace +swap: + '\b(?:eg|e\.g\.)(?=[\s,;])': for example + '\b(?:ie|i\.e\.)(?=[\s,;])': that is diff --git a/.vale/styles/Google/LyHyphens.yml b/.vale/styles/Google/LyHyphens.yml new file mode 100644 index 000000000..50dacb40d --- /dev/null +++ b/.vale/styles/Google/LyHyphens.yml @@ -0,0 +1,14 @@ +extends: existence +message: "'%s' doesn't need a hyphen." +link: "https://developers.google.com/style/hyphens" +level: error +ignorecase: false +nonword: true +action: + name: edit + params: + - regex + - "-" + - " " +tokens: + - '\b[^\s-]+ly-\w+\b' diff --git a/.vale/styles/Google/OptionalPlurals.yml b/.vale/styles/Google/OptionalPlurals.yml new file mode 100644 index 000000000..4a8767d6f --- /dev/null +++ b/.vale/styles/Google/OptionalPlurals.yml @@ -0,0 +1,12 @@ +extends: existence +message: "Don't use plurals in parentheses such as in '%s'." +link: "https://developers.google.com/style/plurals-parentheses" +level: error +nonword: true +action: + name: edit + params: + - trim_right + - "(s)" +tokens: + - '\b\w+\(s\)' diff --git a/.vale/styles/Google/Ordinal.yml b/.vale/styles/Google/Ordinal.yml new file mode 100644 index 000000000..d1ac7d27e --- /dev/null +++ b/.vale/styles/Google/Ordinal.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Spell out all ordinal numbers ('%s') in text." +link: 'https://developers.google.com/style/numbers' +level: error +nonword: true +tokens: + - \d+(?:st|nd|rd|th) diff --git a/.vale/styles/Google/OxfordComma.yml b/.vale/styles/Google/OxfordComma.yml new file mode 100644 index 000000000..b9ba21ebb --- /dev/null +++ b/.vale/styles/Google/OxfordComma.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use the Oxford comma in '%s'." +link: 'https://developers.google.com/style/commas' +scope: sentence +level: warning +tokens: + - '(?:[^,]+,){1,}\s\w+\s(?:and|or)' diff --git a/.vale/styles/Google/Parens.yml b/.vale/styles/Google/Parens.yml new file mode 100644 index 000000000..3b8711d0c --- /dev/null +++ b/.vale/styles/Google/Parens.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Use parentheses judiciously." +link: 'https://developers.google.com/style/parentheses' +nonword: true +level: suggestion +tokens: + - '\(.+\)' diff --git a/.vale/styles/Google/Passive.yml b/.vale/styles/Google/Passive.yml new file mode 100644 index 000000000..3265890e5 --- /dev/null +++ b/.vale/styles/Google/Passive.yml @@ -0,0 +1,184 @@ +extends: existence +link: 'https://developers.google.com/style/voice' +message: "In general, use active voice instead of passive voice ('%s')." +ignorecase: true +level: suggestion +raw: + - \b(am|are|were|being|is|been|was|be)\b\s* +tokens: + - '[\w]+ed' + - awoken + - beat + - become + - been + - begun + - bent + - beset + - bet + - bid + - bidden + - bitten + - bled + - blown + - born + - bought + - bound + - bred + - broadcast + - broken + - brought + - built + - burnt + - burst + - cast + - caught + - chosen + - clung + - come + - cost + - crept + - cut + - dealt + - dived + - done + - drawn + - dreamt + - driven + - drunk + - dug + - eaten + - fallen + - fed + - felt + - fit + - fled + - flown + - flung + - forbidden + - foregone + - forgiven + - forgotten + - forsaken + - fought + - found + - frozen + - given + - gone + - gotten + - ground + - grown + - heard + - held + - hidden + - hit + - hung + - hurt + - kept + - knelt + - knit + - known + - laid + - lain + - leapt + - learnt + - led + - left + - lent + - let + - lighted + - lost + - made + - meant + - met + - misspelt + - mistaken + - mown + - overcome + - overdone + - overtaken + - overthrown + - paid + - pled + - proven + - put + - quit + - read + - rid + - ridden + - risen + - run + - rung + - said + - sat + - sawn + - seen + - sent + - set + - sewn + - shaken + - shaven + - shed + - shod + - shone + - shorn + - shot + - shown + - shrunk + - shut + - slain + - slept + - slid + - slit + - slung + - smitten + - sold + - sought + - sown + - sped + - spent + - spilt + - spit + - split + - spoken + - spread + - sprung + - spun + - stolen + - stood + - stridden + - striven + - struck + - strung + - stuck + - stung + - stunk + - sung + - sunk + - swept + - swollen + - sworn + - swum + - swung + - taken + - taught + - thought + - thrived + - thrown + - thrust + - told + - torn + - trodden + - understood + - upheld + - upset + - wed + - wept + - withheld + - withstood + - woken + - won + - worn + - wound + - woven + - written + - wrung diff --git a/.vale/styles/Google/Periods.yml b/.vale/styles/Google/Periods.yml new file mode 100644 index 000000000..d24a6a6c0 --- /dev/null +++ b/.vale/styles/Google/Periods.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Don't use periods with acronyms or initialisms such as '%s'." +link: 'https://developers.google.com/style/abbreviations' +level: error +nonword: true +tokens: + - '\b(?:[A-Z]\.){3,}' diff --git a/.vale/styles/Google/Quotes.yml b/.vale/styles/Google/Quotes.yml new file mode 100644 index 000000000..3cb6f1abd --- /dev/null +++ b/.vale/styles/Google/Quotes.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Commas and periods go inside quotation marks." +link: 'https://developers.google.com/style/quotation-marks' +level: error +nonword: true +tokens: + - '"[^"]+"[.,?]' diff --git a/.vale/styles/Google/Ranges.yml b/.vale/styles/Google/Ranges.yml new file mode 100644 index 000000000..3ec045e77 --- /dev/null +++ b/.vale/styles/Google/Ranges.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Don't add words such as 'from' or 'between' to describe a range of numbers." +link: 'https://developers.google.com/style/hyphens' +nonword: true +level: warning +tokens: + - '(?:from|between)\s\d+\s?-\s?\d+' diff --git a/.vale/styles/Google/Semicolons.yml b/.vale/styles/Google/Semicolons.yml new file mode 100644 index 000000000..bb8b85b42 --- /dev/null +++ b/.vale/styles/Google/Semicolons.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Use semicolons judiciously." +link: 'https://developers.google.com/style/semicolons' +nonword: true +scope: sentence +level: suggestion +tokens: + - ';' diff --git a/.vale/styles/Google/Spacing.yml b/.vale/styles/Google/Spacing.yml new file mode 100644 index 000000000..66e45a6b7 --- /dev/null +++ b/.vale/styles/Google/Spacing.yml @@ -0,0 +1,10 @@ +extends: existence +message: "'%s' should have one space." +link: 'https://developers.google.com/style/sentence-spacing' +level: error +nonword: true +action: + name: remove +tokens: + - '[a-z][.?!] {2,}[A-Z]' + - '[a-z][.?!][A-Z]' diff --git a/.vale/styles/Google/Spelling.yml b/.vale/styles/Google/Spelling.yml new file mode 100644 index 000000000..527ac07d3 --- /dev/null +++ b/.vale/styles/Google/Spelling.yml @@ -0,0 +1,10 @@ +extends: existence +message: "In general, use American spelling instead of '%s'." +link: 'https://developers.google.com/style/spelling' +ignorecase: true +level: warning +tokens: + - '(?:\w+)nised?' + - 'colour' + - 'labour' + - 'centre' diff --git a/.vale/styles/Google/Units.yml b/.vale/styles/Google/Units.yml new file mode 100644 index 000000000..53522ab2d --- /dev/null +++ b/.vale/styles/Google/Units.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Put a nonbreaking space between the number and the unit in '%s'." +link: "https://developers.google.com/style/units-of-measure" +nonword: true +level: error +tokens: + - \b\d+(?:B|kB|MB|GB|TB) + - \b\d+(?:ns|ms|s|min|h|d) diff --git a/.vale/styles/Google/Will.yml b/.vale/styles/Google/Will.yml new file mode 100644 index 000000000..128a91836 --- /dev/null +++ b/.vale/styles/Google/Will.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid using '%s'." +link: 'https://developers.google.com/style/tense' +ignorecase: true +level: warning +tokens: + - will diff --git a/.vale/styles/Google/WordList.yml b/.vale/styles/Google/WordList.yml new file mode 100644 index 000000000..fee14b3d0 --- /dev/null +++ b/.vale/styles/Google/WordList.yml @@ -0,0 +1,44 @@ +extends: substitution +message: "Use '%s' instead of '%s'." +link: "https://developers.google.com/style/word-list" +level: warning +ignorecase: false +action: + name: replace +swap: + "(?:API Console|dev|developer) key": API key + "(?:cell ?phone|smart ?phone)": phone|mobile phone + "(?:e-mail|Email|E-mail)": email + "(?:file ?path|path ?name)": path + "(?:kill|terminate|abort)": stop|exit|cancel|end + "(?:OAuth ?2|Oauth)": OAuth 2.0 + "(?:WiFi|wifi)": Wi-Fi + '[\.]+apk': APK + '3\-D': 3D + "un(?:check|select)": clear + above: preceding + account name: username + approx\.: approximately + authN: authentication + authZ: authorization + autoupdate: automatically update + check box: checkbox + click on: click|click in + data are: data is + disabled?: turn off|off + fewer data: less data + file name: filename + functionality: capability|feature + grayed-out: unavailable + HTTPs: HTTPS + in order to: to + open-source: open source + SHA1: SHA-1|HAS-SHA1 + sign into: sign in to + sign-?on: single sign-on + static IP address: static external IP address + stylesheet: style sheet + synch: sync + tablename: table name + url: URL + vs\.: versus diff --git a/.vale/styles/config/vocabularies/Mintlify/accept.txt b/.vale/styles/config/vocabularies/Mintlify/accept.txt new file mode 100644 index 000000000..647318c6b --- /dev/null +++ b/.vale/styles/config/vocabularies/Mintlify/accept.txt @@ -0,0 +1,213 @@ +# Mintlify vocabulary terms that actually trigger Vale errors + +# ============================================================================= +# MINTLIFY-SPECIFIC TERMS +# ============================================================================= +autoplay +bearerAuth +borderRadius +camelCase +discoverability +callout +Callouts +callouts +expandables +favicon +isHidden +Mintlify +mintlify +modeToggle +ModeToggle +myName +myObject +onboarding +openapi +OpenAPI +repo +topbar +tooltip +Tooltip +tooltips +url + +# ============================================================================= +# PROGRAMMING LANGUAGES & FRAMEWORKS +# ============================================================================= +Angular +AWS +Azure +Babel +babel +Bitbucket +Chromium +CircleCI +Cypress +Django +DynamoDB +Elasticsearch +ESLint +eslint +Express +Firefox +Flask +GCP +Git +git +GitHub +GitLab +Go +Golang +GraphQL +Heroku +IntelliJ +Java +JavaScript +Jest +jest +JSDoc +Kotlin +Kubernetes +Laravel +Linux +macOS +MDX +Mocha +MongoDB +MySQL +Next.js +Node.js +NodeJS +Nuxt +OAuth +PNPM +Postman +PostgreSQL +Prettier +prettier +Python +React +Redis +Ruby +RubyGems +Rust +Spring +Storybook +Swift +TensorFlow +Terraform +TypeDoc +TypeScript +Unix +Vite +vite +Visual Studio Code +VS Code +Vue +Vuex +Webpack +webpack +WebKit +WebStorm + +# ============================================================================= +# TERMS +# ============================================================================= +APIs +args +async +await +bool +boolean +Blockquote +Blockquotes +cdn +cli +config +const +cors +CNAME +csrf +css +ctx +desc +Dev +dir +DNS +dom +dto +elem +enum +env +err +func +gui +href +html +http +https +ide +impl +init +instanceof +jvm +jwt +lang +len +localhost +md +middleware +Multiline +mvc +nav +next +nodejs +npm +num +oauth +obj +orm +params +pnpm +png +prev +proc +ptr +pytest +req +res +rpc +runtime +scss +sdk +Singleline +sql +ssh +ssl +stderr +stdin +stdout +Strikethrough +struct +svg +tcp +tls +tmp +toc +todo +tsx +TTL +typeof +ui +undefined +uri +ux +val +var +vars +webhook +websocket +xhr +xhr2 +yaml +yarn +yml From 870d812c28c6e946ad2222d9699491042e10c0cb Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:39:01 -0700 Subject: [PATCH 06/19] hide reverse proxy guide (#1211) --- docs.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs.json b/docs.json index 6d1555857..89c231597 100644 --- a/docs.json +++ b/docs.json @@ -160,7 +160,6 @@ "advanced/subpath/cloudflare", "advanced/subpath/route53-cloudfront", "advanced/subpath/vercel", - "guides/reverse-proxy", "guides/csp-configuration" ] }, From 99889c600a2e2a00ae97c3adbba5b31a1456f6b9 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:38:43 -0700 Subject: [PATCH 07/19] Added troubleshooting section for disabled repository options (#1210) * Update settings/github.mdx * add troubleshooting for public repo feedback * add images --------- Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> --- images/github/revalidate-settings-dark.png | Bin 0 -> 178234 bytes images/github/revalidate-settings-light.png | Bin 0 -> 181438 bytes settings/github.mdx | 28 ++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 images/github/revalidate-settings-dark.png create mode 100644 images/github/revalidate-settings-light.png diff --git a/images/github/revalidate-settings-dark.png b/images/github/revalidate-settings-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc5899673c718f5f3333c00e6f73b697e9c844e GIT binary patch literal 178234 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 z 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Ⓢk>%oUFiQ8 z&vyI}JllJgAoM1q^<#Yhd<63fSmaEJF~)zs@h{ur@)>xxM_kM*7dD;gt#kGBjsM%g zf6q8<;F0Flt4{w|H)Q#7^>l4Mm!6xf*c*d+W-0omt~L)GtGwo)Ujr@M1|MQYJl~>4 zvH}%&gfOm>PviBUM?@`ydrRGJ3{1H;3D+GpOV`P;H5UOSKmXQ;$Hn6s+@;k3lQ>YX zwnGqVq4cZ#{TALGRe%kguA621_>jQYBB##uPO$Kemk0W$?G3#B1M)E+3^{%-BKIk{ zfSNC>Jt_L-%|k}u<<1B`t&c~6;J2&fU@qX`Rqd`QXkH!zUtBT{LK=0uk{wjqS4y&+ z>OwuDK{BuuQ|Li7c3BzKvz$0o=7zUbm7b-;gg#euxCv$P_SAagL@80{xt7G{Xu$l6 zbqXA?^;8I3qe@hXQ@!dZy$Zx_TRsM;vxHWgRdP85#gJp zL#hhgYxE%DZ+dXAZnP{}q8%cxUR>&Ndj$jkfaeQ`tPlM>i1Pn>-oSG4Yp0q%VD|f1 z)dHwfBPfMUk00puoJcfAyAyZ@Uau_?M1f8}`Y2X0ijF?|oQ$CQ+_S5KO-0ouiVwUM zT*UdIJ_rr@8OwpRFw+4NtBSvf`?#?!7V`eu{$?*Us8>$t^I zjMyNZ)Z5v;;toYD#6Ewy`aJP=iYkZ7X#EQ;ni`bu;i9Z>x9ftmh|0=b&~o>e;4~b$ zzO8r`__u#~EAff)Da|nw61M~(r^!s$*qL?GWdhct#d5St8^5(#cpeSY| zD>fbb_h2?S`-74;{fKG=LaX!YIPq#vj7nW6Y1z(m34f(`8Aovp;Dt;o-<7Y7-RNDq z=1%Cd_!tU`ecuc@PJ;JlJJy6coF}vN$yH@I;EMp^fB}olEsJTYTQgToor(GLteCK$ zw*ILq+z69@e*1^vM$+-I^vxh_Ou+qn_@5?~`_#_k7h0q>QXpH$@K`lYTJq^;@8CZ} z`+Nc{UP&B7*54h#|F&*O>Ej9eItpz&#b6sYd^d_bt=H6%=90_@u30q^!>`q!JK2{?L(lk%nl+^I zSX#ASzdUVR{z`K0Qy=mO-RncL+ZbFOSFx#vC2tYCYquAhqmBQ_7oNae$^QImVMaGy z`*TOujk*XS6WR7?&riPx72|khsv557&o=3%s@IVH?+4Vj^^HxhlS4XniEEJ@8%7U1 z1w(&b4abAFX%(KTb4g&`yzozz=xn=X-xb((H!(Ft@M;XO_>##aoMMfR%2mqxJkS2< zXXQE>x?^w<&KX?oXLbhHRL*kt>j}$_RJ{feD{mL*Pf>GBTH^0TY8w$lB#h_rou%JA za9C`!Qr~%q>Kh0c9NSKFTe=mH7;6OgKe$U6mwWRpSA7 zcm=3FrINsMR=Lj@6n*T{z2v z+pIY#P>M6{eLITwAw@`)Kks;yXjEpW0$N7b&L@B>h^z;BsWr(&6tn`CR4*@jHOpXC zk`$S+WV^0)3n`D8XX(Ke-+;X$eky+89rg`z9m>Znxtdyv;>gfg>#M6G-*9)52c&-} zB2^o*wdLR6J-LGusJII9f6pbMi~#_KH#CBf`W1m>iU<{i@P#ft6!C(@d1Eh&hy$j$ zjcLeYTX`>f^QxcJLO1vb^z16(v;~{K4!G$_XuY{&;fV1G0lM6~<`lOin|8G7jhs7(-Mv+*wV%`H;NiSY4$V7rDB$B_F?kpN!@lWta^qHAO&P7 zfv->lEguPLlf-u6)GI?(FWzrBnTkUrAo?6}TCc0X)(x$ZJ6glw6ZPV>o_7#!Jev+MBEq6Bu!KmnX(sIj z-0vn7AXz{X>!b9_h!%4GKqK#UD~1Nb{4|;E@{!Xv2lM;(GoL*DG}))i1UhhCgA&DK z*|gcM3rmZx0mIcLQ&WRvhom95o>r><99KE7}Efs$DJLoU`vcUo(o=(mCZ5BHe8Q zw*^XdCn<&h8=*ycCQim@2Muvh*zXXZW{)3c!QbZKYJx%_xt39EW}u{4P}u-6 zP|E(|RYv{{PGT<{EIu6#Y`2O8b|`Y!VfC24BANbJVA3~LES|mk^31Nok78IbM)qyQ zh9yFOQrzk89ZXZ~6=7HK-HytvVtPSQ#uc19U1f7mclhBefLzeuaR0FJPw8tf4l{P7;G|?c^euHYgPvJeDKY9oO4DY>u@&0#%(U#! zVv1U9@?OMCl4i*2)$b5!t0ZRLRZe^kAQ@w6DRE2846-`s$^rr^cJyvwHBTKNlO`dB zskF{K zv+||tqOaMU;wE{%PfKKVIwG~uo2oGX-QLbTM^QQD6yK|t%8U$o1eb$`?9fX#J)y)% zu|K-V3;G>E48B009p~%pl+OL4kIP0Z<(@p0xb2kqy>_K)L)CX=qH05tQBdxxzB+sJkAxlo*hhl> ztAy20s#n)fV1~gxU}~5$IjWbKDRp`gPjY&n z;I-UWPbKj-IW7!6#C~GtGPV~bpL92&wf=A&I)&8Gg@v!m=W3s z(*7hABE?ZlYH}*V)D##3EHR+qADKxn9Sb_^P~t!2$uBr}UfFAcb~_=kK9_!fd` z0O{(nrlo{lwvn_YpV5VWG;!tb_AqZ9j;CrlwM{PtZeTs+uUcB$lHT2alDx7Cy&;_} znIr|B;$EI@5!vot<(f04?bNO!QF`@?=NCRY)twf$9jPULDOu3aOJl5iVCP1UchGDs#@ z?|$kilORjziE>?x(dW??(El05BMtehAI=-DnwALs{24@J%ACk=p>|(4zLguiDZItH zuz+UM&82qYa#nnR8_zsY-t1V6wl2~FFEn~|7u2)m_2rM# zj)8Nu@Wti={z{5CA9uFYq7~-qc3HjJ<8l z6H@P~+NeNz{jH&hIxen*J7@Ui(-Y#dtx|vEX2&=bi4)g6#S6f<~p$d1kmp1PAoFtdU-u zRzJ18hW1O(!)av+XWMySw&U;D3ierB)Gx5s@Q8MH#0`|p(}*4)@FN)^tH&U;M2&Z} zGFfH_cq{TKmJiWI6PE(6YU_P?%sLQy-ninC|AYSQ!UCukO-`;ZmO9~i8Go@KrI1~g zjl#7mS}fe?esfgZ)o04iw@wTMZK6q}oFw(YfD@#(ny2{C$WmML6 zIk=*A{G{D zy+nTbFkWf^4-NXv6e?E!&;l465dInZ!rgS#bbH7^KJ@+z=+h7Ifm`0ebUIv#(+y4R z#PLvs?X8(i5qv|*@~+7X%iq-K6t(O^h6*w>IMSLHX0-P5_wkNGH56hyCW1S^>w=mc zKZJur5!8U}DM`e5oUYje{Qimyl3!i=3L>mH>`IqhnpKWOrOTsa?wQmWWGxa-(8mx< z#s}q18xZK`NSOpx+7l!xI#@ z=^n|>hpt3A`gTGn%P@D2CBye;G;^&WQq_)jOP~!T$9BvnDuzrMi_c7e)*x|qe(6D1 z4zXKk`NmC#dBWS-qFVbfXkZ7lJ36{ASIr8@eUBS+{a9 zM>Dd6kFHVHh-Puw)$x%B_o~_%K&$wn2=LtKXr3)8gtRUCTA-e{L6<)cYX{Gf6pxlT zv>zleXOumNuh88^N--It3ZC`OIhnHJ``w^n#ggCwfmdw2u6IQl|4>D(x^!gN{+T9o z3&$xyKqa4`6Fa68(0Z@jxEJ7cpO~gkQ$wzU2BFo=4{S@9lrL*l`dm)RU94DmM$^9J z($+EWzEZ_l&kST^N^31MPS+#yT1gSQ2gE;!w;9>>d22oO zv2gyHg68U;a1`QAOZyNM)FsKH*3LO&sDX`|!Kp$}S(LvIQ`;UJq;y?LdU6}F!+T^l zE)V^MgjNABPyL<18U44(WpSQqnr~3dLT^+a?LR@&{!}SlIiJ=V<#R%%JNs@d$F=TH zWN7}`ASZrw0P*#q0i5yM*i!MCwd~a=2l=Ms#<5lj&*((m`zt2<3h9uM@7fFOF6N+Y zJ9;(*eb&T2_?9Q94HT9myLS!ChpnTarC9mNldgteY@NqA`K?9|mS+b=7S3uf&$ z*b~}CyvGUSwuiorNB8rcSR)dFeS0vimm=#nZQYTY7~fs?O+}ALG^hOqHa71Buu(KD zddor}rw@7#-;Zn%zzmE?C@8pwFm~eXF@+M0*Ld&FL1H=T&DF@&(Q+oTStW(htJ{=g$oxr*v0Li>bL9)k+`H_UwMX@$=gQ(8ZP=i-du z4L&j-%Km48YO_WR)w9e0_}$AP24+J1LscXMEOq^^RwtH$Hb^c%S05q3{wXN%D>87S z`SxIWZ`RfAT5rC7c(SpfJm-76uYk|NY`WSl^Bqu%MZkG}O(k)1Jq*>6ZOem>>-{XT z_=-+fg2Bt`t5&Galiy{7tPb$%Wyk7ukjsI*5=?1(c5q0qS|*Ecz`bx0{D2TNFWMdp3zAf09hGRAf}ULFso4j||Dp5qBBmazEGU zZdsK-JT3~g^4i_kzJ!`n$eoTGrEd6JgUkwZucVLuOe@aCR@ZpVgqGag>~qL-Ke)>g z8>(@pF$kKhm==U)%AnpFJyN_*8JBBp7^+cwb=df~VLHOSBpNF8R_0k+RM8qcDJ6+I z#piT~yDceB zn5IWAdGPj3SeW_uor9^%|=&9B2x_`*36JzNB0?tDlz6;5upOWqhLsi`g= z6h{ac7JmXJx^acn8`_7AHroEGSKU+g`<;@wt*kGH=&P_6tFqkt=%vUSsxxz!`;~>2 zp7B31^Yui><;u@Ie?$3jiH?AV(s&6m%2{cP)!u=0N+{HPbH(PoPeAKMC1<<7@6dJm z8u4t*RZpWl4YmethI0fy1E%m=4HYE{z@b(i@ibj!f)I~+P2RY%-=bB|C8Vv7z z&}kA|7CN7_6nSaSYrMahzABI<>$jq_u~&iQy^wOOTQ(${ zB?ZFb<+6@M?pD6M3chN$w_V?w>@V}g7W&>p>tLSWi;wha=U}5tl4$v!H?ilm#dIOTX7v1m?e)p8LJ-Mbz2T|5hvtFnj8IcxYz^n9HKZ& zT<&wSG=Xe`ZQ5N`Wh0&_{mTwF9RQ8zSW<)a7Ei_e_1&)SA}vop-%}d_kc|gxK4F^ zkomZgywe(G7c$cw|E%k1S4Ug4cbQ>HgiZZogF_kNoT$@~8Q-b#r&&PV7*{3cjP?Ds zw@z1c+W3uzum|!qumkbIe_eQqt(xtTy&9^*Z>=a*Gmqx(;N^6o-e-dfK7Zyb_Q=6a z4W_9wq^AR5!4SkTGS;Im8ag@D`B^Ov7TxY`gMx`uRPBF?Po~FeAdBoZw~+5H)V3Lo zOA@16Z*8^$pDu2v&z>#}6Q_|7X!iuxY7fi3G<_Q*t?LT==$lI2 z%D(K1z}X-4{QgWau7CU0GE|hXTbT!HV7j9^N9#FH3TO z@Y7%-?OYm8*sW>y8O&pbu9bIL1Ek8XolngO1pI07i}i&h!hy>l9=|ygzt_0!*iq#i zL&@`^^2PpcuRez!KY)N)jETl6HKZ=*bZ?o%DD z!5oN>8yT>9OwQzxDXS7qn|!_OgOChA&2?I03qWVH4|<{9PFQ|)D$cajJw%47l;+RC z9Wpl$isiOLd8myQmY~GNVY-9G{~g(9W%RHLfPl#WiSA_JAhbRhT=-_(%PBMCLi^EJ zcHIk+CY}YtpUp(89=rc7g^l#$4Z66X5P+=fUtF!cQLdNH-T1NcY zmhFPpIVRbYeZa)OQbkYA8XP?OBtq;DPx2}g<@d(i7Ra5*aSaxazKo&ed9Wz6422&w zAKoc6fe;>_(?FB;%67L2Bq(~JfePV}(0*^T%d9nuJ=g;!ha?)=KjAVN;h5jWn z-jzUm^M8H{l2wjMeZR@BuT(p@jZF0BD{(ua@Ad#*Zf$^ZVC98qj*D)t{#wjAfm|Y3 zO9_cV&kLsUFAu3RFl2e4f{a{W%7_#IpswVrPKZL))*^XCuH(~p7O$8Y6g*FhF-&fk-U zJPV4NqeQ!jd-o1&Q@hR6h1%KrL_I(-6#~BH3Z>u)kMHk3{KlZ!2*on3F>UbiHRPR; zrsb9S*fN|w^oe{d@5dk|3c8BbCl(#1$o%>u7FaiX(!`yryebyt^FN{*{H;v#=`zQ(gSyGoncv$w2U#aNp27y8=2qj#xb1#8V4nh7GyEl9g9)S<#^pR&0YYg+GqL}*|rb_m7s4(fJ4S{GK*(~cBVMH)UAHm{ znu6vap+k=eykB`?H5A{j%J!MlMv`>yp%jx~h$8B9l52)=C ziT8cx&2Mg$p%fP9zwKkTx&m(*Cx_Nu0-&WzsQrDia$Q9*&FE}2vgfy$VQxLqI#n;TdL#%XtEGiRm0`zUarZJ~YY ztTyiV3bkP(37k#VS)+$tOW=Bno;5HS6+@9Ahn|G`O4Qq{k0Uxg%OXs1=#4)B@Gzy6 zh3IJ@X9b*_bi$N!g1kd{@)5zf017=x;*($oNfVdv)MAKw4$fVFUhgfCQZfOgaUR$R zt6q*5+_#IN%Dvp^b?Ps}!$RGuLdU{IB zPtQD!Z>+Z23i1xBN)P+BUNmP^RW0S;+_H8M`O7pvLu?^d>|s1(P|y=~YxU$jE z>mR62Q9P}9h3(D?Y`9l3jt;~Dwbc}B(vBs zA=T(V$}a?kD%PN^ySuF~XEpmls`=s`+xz(7ml&d)<_*_4#oK+K*==lzUnYvAe0cZT zr;u=AGW&Z35!NlHm_Wr$W;#F?L~_dK(hszhpT1?qlq2iM(&=>($Kn@OdwKgip{n)z z0WYh%>iJg6!pZ(Y|C6m#PxL6zbk7;RT3JWfwl~da%1PL?T0V(+_tN5PKisrC#A*l_ ziG=&Pu_XwvU1?(>9C&1)YR@jUAn7p{)IiB514f9%PkEeZ1^GZa7ZMhWZQ37xO((2U zXtmKEN9igij)K2=vy$Tdw)G((bhs)gf)VZX*$4eIEBp9jF=214Zb1EO$A|I_O3*$W zLnqYoA3L?zFUU+()alW6`_By?x`)XS-k?ZDF)L)!ku;jGQrTAMjV6`Y^Pel?VRfuM z(j%@_RpqT~iVyVe6Lj2Ay~y7z`}4|14hT4@hadaUwy~k65?&y#zLUH?Fk zGKI60-h7)Lk-CJhI0sROwYDcz>|!;Fp?pY$T3wPH9?u>?#J9Bc{Sdl zZW)~PR)zL5A;0~0B{|z%P}F(kOOy7(2kc3HQ*Y>y_9ml*?FHoPnMh^H3AvSW06mDn z>R!|HdvoQ5bINZ*+NrtiN6ag=y1yPBHvzs^_U9t|8;#)7qWg~--PKTS%g@$GLQAfH zuf;O&oZ@|Js&FfR&&4#68HcRqthA36$)SIQD{A@FCHYN}UVAUvqG5zhM8)4pm@A@3 zl2ZhYE>y`FI3y^CzXn==XH)4!IKuv-T{ChZ$0vI<(=B_gi#$c*P2xC81uW*%3<@8w zk=w5AhH+ji?DBnW=`~7{&|sds0i$+?uE1B1YxqIArJip#S)p@V=OA=HU>Qdji>=RW@l;?2_-J6`iWB;A zwqk6r{*>3l=)9AUf5BMP zV+YZHwO5mmWx;QoZ%_CZ7DnEOpHp$t%R?+f0syj6lWr}vo|go-1W-GVhf!%`&G`u@ zwhW)@ox!L7{ zxJ~~)3~qLiYp|k~irjj9{`HrYIpNtp&!4g0^}kr;b5!JihpQl!viU!*!ryN^m8R1A z$MswGZ#}D9CiXvTj=a4W7MW?naR0x(yY*+>Uhr)Hw}HVz|Jw#e9^cQao^Y4SLPdMd z-eM@wftybRR5EO!hVme(lv-=vpIT&jeA0kgl+Ul1eVZ918-uk+<74Ck{DGLDqm`t% zxTo9edksSw@G*7T51zT+Ql+SP&NUwRMj}8L6dwH&8Fu4EB?JGBY{Qabi*`-m!lxgHkiMlxC4i>xm<7LXrgdLoS(li@0IyR#e;LqCA*CbTZ4dO$a8(adny7rdYz6sSg%3#> zDj_92u$_(C5PRY_NVtHQzj&5D?BF$sN(?wv9O%hr+j$$mLd}*0bF5`YoxOQaPrB18 z8Q&ZyQy1&&ynB4GFA8!OJET~lxpjLmm)sz=`ghk6zGWO*h23S)Yh0>k;{uIanlLCG ziN^;}N{)z*aU@w?`Qx7k4mm-?z{;n2#%$y3feMGv&F5O4^Wa}zUUppp=L@r$%8QS_ zqCsKYfA4wS+V0F1xDNXonds{H59514Dv!V*Sp~#$4_7as?-0RT}kR_Ps+C0+?&lY&9ZA}a&cewurI~3 z=j!+q`rI7uR^7m44-P+!w*}HE*3nh1wT=F8tRpau`Ek4kk_0Mf1bMCt#}0vp%p;c^ z(rVpQbZxyf zGeJ>y^8)>`nV!7o^LsGfWtx63&*--SKx3wQD(r1q=zWjW_CK2ASYE*y3StTWRiF2_ z5#zS`t0q@O_OM}_dfVPDMvvQ%1_atK^IB*3oz_0zvFoIq72{#%9VYD_7G`2|2;COL zMG!K=Pvq2oy+rMr=kWcxE>qC`wey7&|+vLd>brMOgpt-OmBsnR0f|w zbXTDsYP%Stj4?mdUH?UDY;XJG1U}lnz_D=43oRaQAPfDiD)x zge==seB>Y#{pA-gg-jd<{YWzNWRl$Zn$Er%u_+}Eo$egn?YD#)0oC$_?(#FPQvgkS zpd;nFCuGZ$*IEq*@ZC8i;ISPxa!mx1n}I2AVX`VpBgt48d?~k-M;pxn(IxE<`+1_o z-;^o3=NOfpbIL}|c5!x35Oy6n8SPlP^06UC0%sJn4z8yp2VLmw6FVbEqw$n@^zvE( z2-vw<_01ObEwoQ{+BHCF$!$R3##BwRtMk#47<)FcR7dEr>}q8&C$v6)%-$2lA@=&l zA{juT8SMoC+h(6&AbHf0W76Dg2kGFb8FB!?x=pDYt7zCgV}Bk9B?XSo>8euzouF^p zZB>9SeTJq4jHB|JNVm%oniWuGtElMC@c8wmC+G9`xSmy$7Une!5q(VY_jpM|yo;`k z7n>BN=B`TG7x1#plH<3jx?5{F{j9|7dFTOgk|?$bj{VQYU%mg6UV=OXRMIh9Zg2Sq zbW%wr1groZxzHMbd z39&L-+(j+dp-4?j>D8<|nU;d^8X6P@DB`Y_Xu1sm*-+xu62)seB%r3aD>d3>ISJX6 zdb#b-)ryy8IijL4^JWn*@d}h(Yf)WT_RCq`JiSoX-0DzAOEmPeP4)+ZD8XpPbrb{} zTGxS1HB*u9QUlbGbrB#-GX+oSIo;5z5i%@pnJCM>_2Ek08UyBl0`Oec=Yeu~Q+9di zf(O~n5p49AR47izTA@{UT!B(}33wKi=neThE+gTE7429nsuWTw(%sPt;;WEKId|{5 z&neW>F=CEcws+^`1$;+Fdr(~bGn%QX-(H&?-(pI@ct2D5Pu%vLz^>r4*{K`4%gD<@J{HcFu$b7Lb@fP%J%cCD3pLkxns){~{k!+{k5{aW#khAddCRUlRaMIh z%|kb1&zPCgtpb9I0^^G8sN}_o~?@voyZswS5ZDc~#<~ zb#KwVm#X};W3|E$n&1>;CjAcy7<4eX`XD+V_{@|@ynX_A=~^ymzXVj9c+uZ4+~J#< zyx0jc^)vE_={c2{bBjvWb{oX1W+x>O-YX|i(H7oRAf2V$z&MOrB>9H|aH;>+{PO#6 zZ2CD(2aGjQKp1@)=_UtE=W=;t)WOP?v3?kT5`GVt?7J_e@u0bF%dNI!tJ4UxwzT^_ zMUN$7^K@-P8VZ7f*&h^yV`WcovwVx-6 z;M@m6wi`FMVY+tx!n{;=>zupyQg0&gHO%&22Ki=Qq({gld& zP@v^WXF2Wp8JPFB(5nD4!gbgBlxo z2HLF8#!&a2!}#B4e`te-ua=4XAHmLd`p2xNEe{R|7?l>3?eGR-5^cNn8og+7B44%H z33?^*tdeKYf&GQpl`@cm+V|wB^QYgDWI$k;MtCg5E>%>_xI=3YY+)tO3#cu}P^%o1 zFHkB4Zk$83e?9Cmzck@NNHrEHURs4>L-PDeVJ$fN_BA`6EX`lDl-~^@ZO(4e}#>1*!l?E9y;RUvx{3OKmi_U{{t%?;s z7MlqD|G9&6sAZ6LYO!mZDPqWnG<8Q^f+g{p=Tx26m9?Pss(NDl;VJXBCg8$ZXsYC8 zv}#Wnw~1FQ7FPI$%WgpOrg~;>G_b~FEdi|%7P&NotwMVwJA;}T(=;=~2U>=W_}10Q zQWl||IpXik-gw$;TkS#s>pd40Qf5?O9sbG!+Bb8}7kj90pKW_XYW__*-bNgD+`~k(RSqWi7OG`)w&lJ^3XP<-BRob_i3nhn~}pPhxZ`u*2c6Ml=R@u_NG-hg5DO0_z>rxX6fm$rV#6X!y3V)=Q`#PB<8(?pTQ0B-W zLnOg?v`cDK|HX8vczP*BDkleb-YI;e9RAM#xtNi!;xqeX?}8?ua&1sqJ@u*TbCj`P zJk-TrX!sg^OeWksN39Cn>x~GNn0t1WP_H>CcgT)Mnw|{eLAO}Pf7?7ZsypkY38Rkl zogNU|{Eo7Gdt|?YOGvao2}^1~5QD`HgrsAkosK;;y+1sN;+bQ-=A&Tg$A3O69GmwH zor7ryQr7fsv_p{6D+%kCYU&*!oRgT=x%(jRP-JhV%n}>kzlN8+C>(vaYQ9NT;|kgl z^K!fLahtSlLWJJub28dWG%})&rArrSXMqAfm+m50I41c^Soeo#evgKMA%A4cen6J< zIMwr|&^fp-f8RG2A~6{Jo0wh=zfL+`{djUP$1B~TLd!kOtBFCJ(S!YuJdHi+0+Rn=vv*Kyu7tZ)UbyT+ z5QiztK}L&r-9~xGD9Wqqtma$7HQ1P+sA>c*WS+4do8RG%hKkd3%tu$ja?yGrlJ250 zFN-SVQf{lot*a!YbsKpYadS0Ur!SyY!sb2flIJCGbolQqmhV2kfApNDFjeaUv>~Ql zdlvWnClTs-ZNo zc(H2I(G7u$LhCW2u#8ptF&S)`hk@Tf~ZriTRw2CiKOIR%LzrH++T!-!s zX75C4J?ULJjGANmjMf5{e>YP!#%^LN{|ANX2ef3o=u|yrd@;@iN^e#D30+pk%$c*u9W(qU&T^bnHH zhvM_YARjEC9{OJf3q-9xvCwTk_S{eP z=*1YzpfL2>@Vom)H1tPuswz=y7?*KDtANC6Yb+?2QDr_yuV=%A#C!`yG(`wj$nDKa zz=Lj^wP5*o8V@56l{$wo5t73KY*R7Dua<7Bqmd>J9cgk5=!cF2#o=C)Zw?Q%&e-O} zg+oz|WuwVV-@;Pmf`i;Q*S*%h(|MGF_0pI37FM5!DMAv~nkZ$0*iHgm#i#dSeDpCR zocIcf(BCgk)tVkyWtKhPlVgM{MAC9Sxvmy3>(?mSENxNlBKF3QT4f%@>`_c;rzqPW z6&bml#C-6-9LBxM0(;j3#?r#_x5~SGDx_ij(;X1)-XekX7G(~_V1AL?vbtU}hp9K) zoGryceP|SL4(X$_hjQ=bgx?#Bu3VQ7K1X7MPTNUiWyDI-TS`hF`rL!Su_uRxsB+x1 zUo2cNAgAF!Mpsb`V$%7I5SsD^1V3QRX}y4S=1j>=OTgzT4xMk-=4gfnk${FobIN$L zshDu_W$EXC9PlCfrJ{H9G-G|P&D&ZeE-cV?O+T1TxHM}H^YGci_A{Cdn-xf-vT>mVX(b|;v42!m2v^63z zb4W!)j->x~?^|(OH^BYfx`>>naRL4pJ49?2bNe0R*(77^A+m;9S`hh(h1mq&pG57TEkA(p4CmW|$JW9rvk@f&co?K@^Y__t0T@j{Le@Q@H zT{+CIz4eyZ!)Pd#h`Lexsw+w4y4F&xao(*(?_Y_q z_iW?66xM|8o5R0cp7__N zoK-@!n=?!ImvCBanKtU37DBBEWsm14{rTf!*laPk{_JTkVDW#Z@oo{?-aMvXsg$Se zaJ`IwOsSXIe8Ft}xSzj$oT}7vlb`XQ>42xjce^@e zg;^ON*$D}6kbtI~WB;$wJvF4_^LVcowyp6c((u@Kh^<~x2?~(|Oc>-p#wtH^2r^~^ zWZx3R*8lil5f@A`@;rRWw{3U+k*xaR=WJdCZV#$t5Vkq8?0+Fs^N@;tGw%)huaoiL zpX`i*wfeu|{@?6UPsaak2I?vO|KX@n>IQv2+Gr&EY*<`8!OPF<^?>`>6~)Vpj~QQe zA3d9pQC6B^)jc08GcGyaxY6m=)LUL!W_igYB;npJbqx*qdv_Cf@5no=Yg9kX-k==1 zA=4@2mlE~=vGQEvU-iWq>3v*XCue!i|M_P`t~|F-x$xO0_&>P3f1b_%-kATrG5`C-{O=R<|6wWHOkIHfPnGOZ zix(f8kwB;x?K10aR9RlC>m+~so659ql3_(6a0hmQD$ z`y-RjLqN=MvME4*E|hzqf+F)}Buvzu*6o0uR~&Fah@<36NSv;3x({}Y0=V#n;?_Ms4Imc1i-yi*NFMwLdm3Xhy1$vZ3!cCr3 z&y?d=j907x#%(cOS6R3Qv=rvRn{4XJTm3Wkp)dZ|ZyR41D+vVjv}_begUn0SVubLG z9r2DG1=;c;&i|^iP6U{b?X7#V>JMqo-|H_Q926(HasD4aZ~G@6KWxF3Ki4Hg+;G^GFiA*VIiy!H&m^2e$Eo88YF7PXTG|d^zYO z?&z>G%wBnuWY6^Ws7t6N4$^{io1;k4T=A8)gbFDE!}Lk^s4)ub8zW8vs- zY=9l_ts^Ap7hG$CfRqJ(>`7CTAm@#kMV8Mn++};)bau!Oa@4thSoJ5>z6PD)xk{yH z%_N`ary>Sa@t-~V$ImSwUsX&@0Gcr_#03A{D&WHo09t+k>R9f1Dv?P2@$Pkc?@Zfg ziZMB0qy1oOqVk#%PGPtVq?rW8BGi1Qc8h2L4)ch#yJdbLpz`}^v@`p7xnfvJ{&|+o zN6;{&yw?o8*0O}dZwyM^BT1td$r4!-1$5PGCO3nhFf*vc;)5M86?@;k%W_iyu8Id< z&SPe!>ryi)Px^z#JgVYy19G*Xz4yq3m(Txk#e z^fHLVGWRu06+?;aAv@^<#zZY#@c|k6W-fWKc+`}UkZ-AonyP-Zm^a|-{M3m(f!BkF zI>w_`KK%o@E*pDCdE~?KDbYM?iWk7iRXB6mz6BTs>te3X*N?&v{NTH^z@T(d% zCbt{}oy^xk32%idEjK5F1uXr8(d+V1r?eC(-^HbEV27tk%I#qv4*PQD{&)W75b6W- zQd%M)1Rcv$=eXCO4^P@?kLryrzS3~Fkk`!2Y}8D6>w!i1p1-KzSa9sm=S1CjVZhcT z4wxeih8=-?Z*L>}7^a8bPoUukDEF9TpKVIqTCkm^==8TS{4A}F02mF4mXsut-dj3< znf4WHsy+XBjxyqvyIG-YDt@Ax*bGlyB z0Jb?%Ik~NJnpeEP-z)^B?`3%zZWlBtXJD}y6w_b9h8Db(=pgN4bBpX0cP&o z;%gYLF&JUlz%humWQ#{ON~mxyo_s^7LtHZsGD1#9!;SNz|9$1!&hWvEp4_Z^Rz`K8ryc+@ zD;Zi$f&MLGL#?JuJwS~uqvsA@*oTRH#&nZh5|v5L&Cr)CCu|*lyc(N%xG~c6?C!rG zi1w8d!^J3N3A1sTeu9&fRJ$j0a^y!Ir{h2<{EGhIaFoLC)F6Efc(68oS4)97S+WE3 zg$E#1AQ#DSzUP_fX2wSSN}&bHK^*4Z;$-bX%0BEEjVNio-uv!h@s0p$CB_JNW%)?r zcoREfa+;@X``6Gk+@VHM@l+ylWL+a&O30 z^|>gP?X~SoKPQBl%=LqW` zq)EBN^luw173C}UOC{Y8tsH?xQvma8(rgwD2hic;XH$>!2vm*)t{5W&Nz!L>%==slzRHVR7A(wjsA3 z^w`kP&Tq{$PM$9Dcsa$+m1>>p`zt<U-$h>OP6?Fy^UWR0)D-o8?gqL@HC|v>*X^ zCHc#(rAaJlj)d~)cr)QENfPE7&s0U#c4L=2Sw*TDbfb@K-diJ1uZ zS0pD%tiXx6m~|1b4~z{YBp6v zcpMZi-vTWj%#fkc^W|ef5jvt*fp^|p97zul85`KwuF`u30TSisYe%V!&Ba7!=!0Uf z7fUFQ3o4>|cHdFXyjQolW;&{DvEyLU8-Dq+pj)WhXMy)Mk8Txb@rst6>L=sW?lTa? zo_&8yHj0J%kmqp85PNV~at7!o@Yzd8A^iRK0s0bH!KwwK!GxBwP(2EcM+Q$fS|{DgQR4jEmM%* zH80TG4iW1&4g?X~6aFF^+<0e84SW4gvCF{1NHAYRN_^FhKNK3HF?p3}Be^-oWhlFE zkOUgm3sT-c+MiOK6e8*5#R|7<8JkkM!P4u#Ev3P0G?&YIF5@N!#=V>Df)QB|iaczW zSh|uDi8)sd@QCkrH$j+ zO|rZbadswp$?eCNZ<~4%(E$nX+|6D{$2m`8C~z`e21}`3`ffKRar6;_-h*DbtO+(P z)GOXaHw*I6ZSE_<1OOmt|6M!W;=nHf^SW2(Ibs=S=6M|IGuyWT;LV+FY2{%wRtBdv z283DTaTY&EL)X+(!&jpPzktbXJEpM9%{pu^A_U{6x_T5L7`TWwIO9h(5Lb#zEbHHp z;uHnT(%>*X>Y(5H4Ubyy>TcQ8#xKrp^be(65LV*!M@1kT7JIfS5 zLDY1tzO(kXJ0YD<@3!EJd6}6d<3!W8F{4OVy{OR|`!TbMnvSxI8(YAec$6KMt(=+? z9deE4{;LlnAR&_>D&Ny|$ha)Wun7vBt2+__!3C((Y>pR?;bKBK#2B)~yjCMt1 zGk-~zFG)!tW#7${E%)>tqzAmNcC{SIi@D7)Psl&?*uIyZYzyQw>r+$kvCYIyEsHY~ zKtAvWO0q;PSoeETAy>}o+7J{Dp-=4hS5-;;pzbr3r2wD9w?;aEK)RRptL@XpYY`Wp z_6N~O2`e~qJ-Y)NR+`NBa6*-TKHvV1#mEP~GE$(u$F3Tcu@on>}CGos=#5I^0Ub*#XaH$i_T|^=a&p!b3bppN!q-TBIINCe6dI!@4iD zuL9e2GJh0n0~ypB&?yDk4pYFgS!K|<>+WTlo&`x63}$?w!eZnwRs$}VZ;f7BImJ1B zcV86b6n%d@C$q`m?|N&y?j~HC@+}IoiW6sB@^ku_&ZW@DZr$PI8s*^OAzmnZ)lB6X zT+_~mIpQxYjpv(jT?pU$$}VZxPi?;H$R-2Uccnfty~zEyXz`$&SXia5$9xmf5iKO@ z;$xFe12YLwh#v()ho^hqFADWt6Vjs(Gn9=$EnlY-6F$}#Y8Kn=g8u;SE0JIQjKCu# z;92hH*JD4AmCg}okxjs2({As&v#jYy3L&CO(MgW|f`BtDNGx&u`K-UKSDj|TLyQ<( zH-N}+7aTk4Y42Up3PJLwIV&JAZ{mE7fY4sb+p~7wb6Ub#Jm*DQ4lxYw93FaD(ZW{)5Tmm zV<>S1ksovQAUCd^cnC`yXo(cbMJ!y8xyTVkAGd@|#Og zx)s526HL@HB%MB!8DPGjm?$(q$=JN7g6g_(R+r!NXzbjTXh&DLyi$#oS2;9^*_Lmx zMIW8+S#80>V_|N0Eoy7DOho6V(I#m`N8xPVfh$ajQt81jh8e&3$ja@x)^U$Re~4)GLdxLsPKNo}GB2(E}qf z0#F&ht`j8q|L#MfVDx!Bj?*5%3hegRNMu(h$OZ?LT_}MnZ;@tvQ@&Z zEHKy%`PhDE@23(7((ML!3?hm=^#q#9+kdjw4kM!OBnqT~u?{Va|qiG7HRHhMxg3&M|EDYByg!9)9~ z8`xYsKR)bQyifR;HPdg>g5~8{p{_ZrcKo+a{q#g~23zt^_LlZjV)eqAotX%no^@Kx zF?8N+w%MD6Y7TN?tl6GwjBTbHMpf`2m%iv%DXr;Ox_ovPLXv1NtpKK4nxo(NyN&P80L0{!Z>22NTlJLCpaA7*Xn$Gf&OerxQ93x~vbP3~n^Ng^&U(u#^EH_8-K2E7&QMq}aX4Ysy&H@v&r9ap^++9`N!W`@a+ zxYCQ~s?HjlrT8gFITeg1@eS{F)^}RhzgV4igf$wWPA{tOv?KxF!$I? zPIMb`N4Cc@&`Hp0#%fw06ed(CY6?Q#kbd49AK|j6+aDh2XCe(CHE!LxSMS zwhc&sNNN)6S;`#t>gl10yr0!P`jJy7%F4pASQOr=XR++wG`?U0T~ce9C;diyF*vc< zf$X1sI9z*S1>d8cSv^n}y_`oUM^!D!Y#;yJ9S~`NDTNpfTfL^XAH|o@aIxLzre70l zHpgyLMQcOFz%oX|t(`6;GnDjZ*7+j&TIV6g?>hcx6UjGX10gx&jI>fCfV1=lm?BQu z#&$z%%&4N2F_{z^Uur%{4|-dg#FZNIb1y)8g;=cPo+&+LlRT;6tL=yWVDnL7H%i`e zyu(B8w&S)CO6?4L8ZD4oL^j5(R0o?q~Gudan3v4f;7|_WKc<9ZueaBp^SQ4prVe zjFnae$!OX4-6mLq1&2tZ`;~5N^KxC$@D*tP`V2q&dlVvc7(8!ALl47g#*q&zC$~3wutJ4xx4YF(XC2 zjWYJ4LEWD7t!tw)a6tHy9dge&f_0VuWM#hIxy9{TDHgq9)|(4^5dxjBqnEsZZU2@n zQ-=WMCQcH=U4fi*9YSPz^bqEN$q2Q$H2-d6^g-DhKRc+4Rqia5=V#Q0UT~IP0;k?v zxCHvT+o*DsOIKWXm)6`E~lDfUEX zv@0M3W_jsBCd)!YFUN2xcq9}oC~g^SB1;E$?|Ir^0h5z(QcUpgV5k5ap4Py9BZMzO z*c1I`bP)NF(fp+><49m8#=o2+c_u5I9`JyIY+C^>Y?NwrXd?~0ODR;})eFI*K#+{X_&BsKk+%p{KDZbHGPqcGU0Xid_FA!@_83+yH$$GP=pERK|8 zZLH~4Y0Yj0Yu$fB<8YREHUODx6azW#a}1Xbm!)K5nG|*x6n$hp7E4-nSfu2|t$?ZA z>-n}oqdKjz*OA)guXW@lT~g7nZ<**Pd4z*DP&FY(XXIhoo58Pbozy0$i1tWk1apTx z<7dC?@zJfENw1zv5g6dTmG?&MehX#PSkZdRSkdHt;WCp>a(QgMWojEB^U($9P#tHe zD3C^Xx=Qa*`44iV=tKe$4-HgHJEntZRXfVkF1n0%0kuBk5mDo}EvR}_Rrgo1Xb+{G z%$+te<+@(>&L-@cs^iI4(^a@+iW5j$u~-;sua0Q{98wIdWa%j%pyxTdP}zGl#76b! zXF_?PCwot*tkG*PkCJvvyZB{~8-4v6b!nRs%$zl<6I2XNNb#1aNFIPPKo4f-18Vnx ztLQ|#Ol?)?C!VtQNm3XK!9p`Is@gha*p@JeKb{elE$4}zw-r26%z}=bVK2jg8;b!k zaS|ivBV%6e$dcKNf&$L{_fL{Qzi|9wfGmEYNXyeSX$wgo+%>_6a4g23F0I zCj}0>T`sa~^T%HTwJehzE+ApzFS&Y4W~wiK!P2&jT&RK)6UuZ7*84cF0_c0Rr-*1 z`~co}HN7vxOYG>#B1sK^beQS5i!uLw|EFhcgG3z`SY4m`L#DOKYUP_hgbo{z-r9bD z5~pf6&zW|1AM3F-@vY^jrVl9(<_rqll%D$Kr(R!SQ=Aq~C?2sFyXK;w2+7a3E;nrQ zEQ&ik2HMAGoQ{k_ABmvhY%uMC4!AszB0R2qn=gC;i*^4v*Muwvu}DlAOE7BNbJ;MAL82o-rquoa@!D zCMyO^@wxezMZ=p!S;vW7p;)hyWIybQe|znzK^F_B%3+r7EaXn&&v!|%FV6Zi`Cx=_ zZ{#=dlYMS?do5VU_7hmcPM?FEi5}XGDoj`IheWn^24JN zowgy`*!1|!qGNuN-e){5Uqe8ceM?ZW8>dP3aZNPNm~5Eh+;>2QKH}Cd9|iq^-uqKJmj&qri1)rcSo__=Vs|<{*FTwu>9t@bkM&n)sNm67 zYQy#tx)V-r#YG*Rbp_?SN-UrIu`N-<8sC1O);>KFXPza$TN@Nk(+NcI5}Fn4NAXE} zd$VX@yO>MLqx-1*wfnSd#{xiIs=53Md zfw*{zQ(1eJ-D0g$hVj^wxE;Z*L`WfO;kI!^&yy(=^MD{rbdG+7{i*zyq+t! zR?5^Xi=d&PBTHDVW5kOW%$#gi)nqP0M{zSJx!!q#H&|p^;|9R0s)!04En669a;%Q3 zY^D>ooM$1c8wFrG(+)w91TUTPURZLH@S%!T2yRcBQ!h@W=x<2w%86F9-Mh@G&l z62M>w%gmNq4AOLjB{_n7P59RQr>FPi04EtYGOS#O9PgU#DWplnWYOlc=z8Xkp{mQ&>YsMildZramoQ)V2M} zcGO-yE2WxTJm03A!3|?oh{RfzMut=?Po$^j4790X``3)Y)Cex z<1>B!3Nq2EGtw4=RG3e1GaHH!mr8Ea?_GHz$s#LD?{|f)TsBD$o#m{M=v9PHcA2Sl z=9yODX4{CA{2~nc^*NQ1wpj4T#AsKv zjNM@*AE=&owp`8o$t-2~ZsAH0eFq7qr=d|-e`-PkxUY7D)W#Tf%8RPfUP&2eUPsd@ zuL^>~vi0ce+Kd(H-|TNh?X5U|&V2TvFuzcB3j(l?Ou8zTDus3etFZ*e*#|Dr|WHqU(1*(CN}9nI0>k4l7{iao94-OkiNKp#d0;~uR!J2ccFP=5Fd zc+yv0i{d7HN50I~^=3>-#TjIE(YoZC5aPe?OQ2xyrzTFWKdebS)GiNN$rkr}D;1eG zo%U#n7)Lrv_q4g27#zZfDk$%W3nWW*eteN$zSOo>uH;UOwill?@63rVLyaqnc4K$4 z%a}Mv7yy)6Ttx`3@0#02%)JO9@~)rMONKxc-OBF3V-rt1V|9+T9Ye=_Pj~P8s-8P* zyHoHZ>eL%EMiTRsay2!WmPUaSA9?ugVRYZ}Q2ttJ9TxkFVd^F8-dD#^8huf)6@w z%nf4$N^cXfxV~l#{z9iDt!iY(^P0m6OH%tUx4bw%fu5=OM$9=gNwTldcZiwkrVuNV zfr4KKmNU=s5qQOy*{Fu10aBZ=l-E}gCJ8l<6N4nTi`m>&a9v1c)e;w#(l|A+HYi_h zA+TNr-zEPtfh@r9R{LkrL6nMiW&2??Txw#b&B4yjU>~GfzzdhLByytk)0j)dT4%qJ2H+qLNT1;L1jrU3!N*b%G5&x)sTQdD-J3xOes zR*Kr;>x154Nw8B}wXO1HQoF{!h@}TtF?ex0Pu&x{g7g|z!FI4YiAV@a&t&PD-|Lr0 zZGE%)jYh#NbuQ}|@SFNTW}yjYPZC><>Q=Vl)6}!~s|5(b+%>eMa()A*h>ckRs+s4oq%+q z5ni-q>L?r30#IpqP;@QWGdeW7yJVGdY)kNy^45If(fb51?srN!D;Gu8o1c1ax4hkW zuIu14=~&I>OSBi>?^i*~t$r+N&tcO0=9PVj(m@XzZ zf~u1F=9)wSctS4`SEs0#pqoZFw58Pbey_vdxX+W@r*{o zqei>(ZOrs!B}2)}FE2@7J!yK8BUhaWu#?A%PfZFipA;| z_+^9eSiZ`Hit_JT-J-HMggxn5(9J>WP3;zZt{@Bz_KSH@P}}$p(w-zA9%$Wh=+Tzi zz#?Iif(R2%70{z4muKrqev;6=qtN0^3T=1EcD3-!xQQ4oOjHcpy>@dzQXxUs18#i3 zLG>%Eoih=+@Yf$ZT)gtR;~p1aVtZFlrazp3Ow(Ic#1lQIC`7cHz2g_Z(rsKD?PmBz zPOIUFZgj-4Qsj(k1GdU?Y?O(Mg>4Bcbp{M?tvW)eZ$ov_5=0&2mnCF@E!KJ$*b?H^ zaYI8rsj0DmK4AXw{XyP7WrfA?Ysmz0bCS$_p{Dey@y@;)yvm+d5xgPVL`PHg!pTac zc#ryLKx7>QZcW@F9WDS?I(Q98K1Oj5jpW0Il^*u#zZL`R5Xs|hCql&D)uw!a&D`*> zC96Wux|Cs4Bv0+)>#f5r4*dkY%2jK2cgtq0zkix_FJ&E{S*v6xdi*I$5l2IE+woHN z6k^zEK(CiNbB0#CZ@UmtX0=fX0HI*4Zm81wdk?F3&GI!ZWx_mju^C@~QR6sl>7kf;Q))w{;j>58n z!^12QkGS!@B_AU0`?#3KZ>O(@K3%*~J%e^!I2_quI9UPxEYG&A`%$03=n1P_+*^o= zja9cNgT5V+lMDi+*td%bAOc)nQ^zHvKk{}v>kNSkWzBs$WB4qZ0dS0R`Zrx@G#LOG zC891SMxKb(we1TbPn9*F>fH^4;Ao`-5*Zqr$nLpg!E>C;pLB05B+nkcBDOSiTU>b& z1@}CDf&%qp%x(8bkjAux2J!J+VILd zu;0+M$lT9IQCBQuCqRHqllBJLC*;QdRLenIZnj=dw7RXQa zhHqt9`jZE)10qC^-D5u@o*2d%VUH}zAR|_`oOvSEsYW&NublfQSBa>O^>1KphWmk0 zQ%;1v(PUL#@HR+1CC_C~G32v0Qptk^6YivxmK^zAGy#l&K&{j5+hj$ARQe?J**4*> zM;@h3q1=XH7+WE9ESaZ!yPvK1-sxQD8Q}7SV4?G{CC9C5{`s+YR{gB7C-Xl+!PCUB zWt}zlABA~ozC>+(w~Z(@Del>z0laR)*73 z_@e}d`h|IL-29l^3wF>Hr<0t0pmWsxlOBsYb9hlAJa#m3ZUA$3k{HZg$JXKsy0a`2 z&e9A5JHd6d^fbZ~@72Y%lg9GLvRZ!Qy^sf=Bg@D6-N-tSH2@G6cn#@T%6|CTtUYO* z+qKBeUDey$%MfJH)A#HJaGJ&=N{_{}T>Wj2kpz@55%HQZRReU0hSi;sBxHcD-(+~E2baBSLnAh9GxA-ULsr|F?zT_ zO$kr(!nkRWklGGcur`IR^z!O9RG`hP#3Hu`F%Zl3^rr!rxJ?2kBt9-JE_TD1#Wfa6 zG!5KFlsM~scPNn=^!l&%%0;x>_U zfxLxo<{HO7L2z|t17GfIrVdHUl4Crff}0yrX?BOx6Z4P#FS74sd0|m7uY0-c&C}JZ z@BG|PwoGlQwmoy{%zwlg;TT#auAC|LAnRev=N9FISp#b3&yq7pn-uq=^_pg%>rM1K z)1B_uT0qxnPhmAVJNkrjDOm#YzT|U`%rWF{0bm(@pD&O&Onfwbih)5)mw&AKaJK+( zlS!G?iuZfXY;256ghg;N$S{@?)B3D*%O-P}E>Zt%NOTm8*VHoPBw>3M*$i2e_{~W- z<^6})`W6J2m#x)Nl9$K+V5b$mGvtc^itA~@b~Q9L+ua$sS48-|;}$D~eqOe%0$PUJ z`Cp7q;>b2{>c;C*4A?z9D8Ot!!jsrwsB7!KexDY6;NAO@zPyYWue%++AX;)re26U^ zw}z9OW!71P$XDpGfBAj8{FD0pR2hHiI!9lrl@TA+*e^0x3F|@^tx!btGWi$BmXgi8 z*X`Xps)Oz-4zUmimiDxOv`eO>He~$$_yv|5~ty@J18Dv)(?E}O<2kF zwQ}i)ms4#ao#9@>^DVJQj$4&6?zNFhrKlGy(GQ?IMXGTbD&fl4VTnSL_K}gYu*-C= z_l%OEJ#iZmz0@4vlsDf${y3YBLSc%^<5UY zYbuVf$Y{;;VkYE42(kTLMGPTDbf)ZfwS}g=)K6amGD1bDG}1nKlVwr=iF|B!J#ndg zwO}{^``;RS%|ix{

o#hOCB$%j97Pswz5wXS1P>zPpv!9;lUm0tqPH1ys>OzU{iY zrh`%4Z2mJ76U3_X74YC3cAW zd0_Z$?k7_^DLXE3{Y@Lqleoiiy)7S8*AhXf40Tx$K7R^G>aLZ;I>K*ag{}sz9H$IK zv|-%7BPIgqZW%6}%u>1^TkKx3j^(>gX&PC9exlR#D^d^E*~n{_7fheBjFr^-DeAOd z!H$S5^=SfZ8F&P6^Kbf|@zf+1SLGg_sO2`1uVn4AyuAL;g`aoioexhE&z?YV^i))@ zA?9siAVjK`o^@?X`_3Mx#qkrmtgm9&PRT9Bm z?$(4?M>uS6bIfHW*+qKF18pA{_tdTLnSq+9Z~EpfNly=@ECGAahPui5A?^+9=g1!A zn^E!#JLQ)}w^jHFEO-f4>+?f8&33UMv%12XYZ%|*G(K|!0nJ}bc?Tz!pI-#To(21b zEl}f-=*~UorLW;px3D)a?;r7iE5Vl+>` zO82Yky^u72KwV3%*BrQFp{r#rf`mo2MD{Gsw*xjM%(d=Uk?K`m3xW(ivx78T?X+^gDmiQP*KD&HxIMhLv{XqoF| z$j@{@t+n@(EAxBa4o3|2kZ*6Vh;~rDZ!dNfPu;>uVo1)ikFUCM8yp@xiERl-iM!`j zu|_xID2K~n=c{y@62%fs3P|ZsH_X~xEN{cY3-L-+6xVr>bw4%WL1Q8Y(nV)wra{EI z+ip*s5 zH_~f{9V1GP_qYv;OsqY^9hSNwlnd#r9cC_(D)f5a_6mPIkf>QfS@+w%qlCVm|L)$J zcy58mtcxWxLfY{8h7b*;&+z9Hn!d{CLb;w5g#uXY_ZG4apKu8sDu9bN720UP?)>|on^u5~TtYLeX(?bAGqT@nsJClw^-uPEdB<9MyucuRZC^ADF>_yX$G4D=zT1(=t(RlXsL zRLd$PG2bo_*+xdY`I&wg(Te3xRs<`M3xW>|oazxvnV&1jh2qbhNIxVJN9)}S8v)z& zS{#X9>wLo((-$lOBpclXkZjKJd0+TNww&Wj{B-2(u3@jl=Cq?r+4}foA*;F-eS+3u zRcG{;gF!(-A%q7C2k++EF@kj-@=Le^MROo`;vTI`z2*p*xCH1vqr>XUgmYHGkM?Av z;G|ZaEeM98oGoJ`Wq25e-kxl@@Sn`&jN5nPDXXSD_LN(>{Ezj$UCQ(#N3oJOhmWxo zUP&*cDJLFe+DdVM8EJ%%cXqBjYPb?eDC~S*kbFO&BQ(fZzYw4S!1!u#lqnHjK5~XV|+Wu(|p4--BssUzt{0q z*O95iwSWBgBYT1=&l8?4;Yu^?dZb@bRegMpPj4~;dstG0* zDOE#BU!zzo9vU?n?0)%6@BSzqpSyl@NX4SR+;RB_mjFTgpPH9%W_XS74+vwHP1UW6 zA6M#$GxOkG3u?w(%M;8C`Rhpk{Gyj1AFcE+U6QwB-IOu-c0m{j(z)?ymoeFu*0O9k*4_K>Cfh&_fdG(%BzdCOye;P`NB#IHSCn>)`GJ|D zOYWZ+<Qtgqq<`K*Z)y1t zXBOe$>1IDLhi?NdL$+KE-k*8YrCAJG@5r2L5(OrC?aMX1K zVyVPR%Q4E`xcNWV_T=%+KoGd;s=sIz12nRa&f}Zf8=T{m`t7a*xl#%G(CoX9AI7YI z4|v9Ex1UIyY+6!sb8c$y-jeWejk|0XFS56Q(^>wD#W_nhUS(ZBJ+lO?nS@dyRg5ZM zyi7rip)tUaFH0uit~NM*xev`C;?NeS`2mpE+s<{+;EsNj`x2kzhPM^aH^HQ3j{YJM z|M8JqV&1^n)z?W6>f!cybXlwmy4-|0ux$|_6#2fMBv$VN&u_@#1iJ)wCW7{VoywbM zxGt#~NUZUberckvj{D>5Jl;USRDz*2V5ahxmU~n*L9-UDS@|2e;*j(W96Hn}Dz{@C zoSI|!#W?mU>bEWVe_iWGCOGp16VH>p`hSdQ0SCOzdr;se?Mn_cva~5w8*Q+tvNx%F z#u1tle_gSET{`eWMfOq9o*bpgm<8LFg zo9y#^!=hmXA=^Jct)h#M^HP02beUc+7e9RJTYIo;3X*TccvMd3A41o^#>Q+a7%rMG ze%BCJ;NzHAx$a=2%Q)6v^J#^e=LK(1n%G|-{5zEjolMEbi$^19byfbQfdM5L2$>BH zoIiSa`)9@ZSLOHCVFiP#kWu5(Z?`Q=A?>TNlUBp_bbaD+%EDZqj__Tc-FNe` z?S5;&UCzIb>IA15gmm;g{>SM(OYP&dT`eAPSMj9!Pp0sXrDD7ul$I&1Xbnj0^sop z7Mp*1Mz^@+%lG_$zP;d)_y54zzu{l+@UOz~=YV0mi$_6W`2%$CTS*VLr+fDia7j>E zeOelBWQkZr1(5A#UnTv&-J!a>;9^YMX%_ul-Pq*&Xyfmb6&7S=2h~1o?PY?# ze7u6SRUk)m*k2{(4Ky#W50jmV!r za!;bVqA>W|QQqSA2Gpf^up4Mka$BZ0VlKTdL;V1Pez!NGY3MiSmqhEa^W9n55ib4^ z7DeSImq%K&(?TB)TH)g~Ajzu14fG2L9Rds=Nclw*dfP7)@#7TCT>W5@!wIMi*`@Nw zmd1gc@W;VeIMK#^;IR47#_znSY;rTux!BHzfo)F*PR5(Nl8!&j*j#-K(!Cx4PvUUJ z3Sd~cTvWfU#B(9*?;=kX1n|}|Kp3X8|LaNl^TlTtZvZz>E_y795F$*%w``Vw#G6oZ zYQw(|pvPZ7o04n(?HNovk1IUqoAlHb|Mpu@n$q6mtGro|09s5KA(x4&2Qj_G z6o$(XDpta+X9;E#E9cE|680h0Xq?Hr&bL^=%K-&J^WHi4goPCSFU#r!&+q`JO@0`- zx8Jv#tlFA$n_#WcIi!+P0OCOukRJ{AXZH`cav_0_Cru6OjHNX$yQ>_KHE+e{m+s{A zvN3;-`Y@rU^ejl_0v<3L3=um6HVgr9TWm+#V^-=a!pDc3sD29ICti}&%L-)+fJN`4Du z7GjpUSU`1%0|Y-;mtk@7^=}zJ20^eYOAoaDn!5cAaFQrV0fN|EwtgC-rW;90Z$rV+ z7N)DWoc9JWx>hV2$lESuiNIrU?iK3eAPJaxSMeL^Oe5s(n_V-`UeaDnb&P|$;s_fTGm3Wp{3y?XfBOx?)YTmbzo zM!XU2KW^h4GrY~G;q}fCO|?t;i+>fRH18YWc6&EGSAY83?LNGcwzG@?smB%W$smNi z9fw7fY38LqB-_Q!8!6hiYfKGi?i9wJp+}c%qiHH-H7#%#{m}wr8bWTteI>8-ugP{% z9uyJ}*?TE}{R&rZA7!w9IN6TpMe-uk)>edIX}ZexPeIWw9*D?>QkCkn2M?L4X)W0- z{JAPliME?q&;Su+KG5l@uzT%v7jk>S1+}>@viNy+vW(x{OZh}x^w47i2x$#ZtmPf7 zx967}Gr9N4I=I(gl6ezPT7B-PG9<4~UV5>O3z-0BDnG&`4Iu~W65*zyFW$I!CB)hM zy|c|k`gvZABpC0vBKGW#(0TH;Yt}qgt)f06Zz;Vhs|EanOYS*kUFC+`-aNH5(M;!^X5nk5!Cu zl5bD~`j$Hn@$72>31gz27`X$Qm7}L8O<4A;1~^T&Ey{!Gny06Pm7m>icPqnIz@fi` zbzef|>xl{rw|h`GstoC53sIMCS~u3kc6Z<{+U{&<(m#A-;-q#Z#U#dst!v6Xz0dRP zU`*o|2pf(10VaZY{(9qB@vT$PlrufCN)(jQWzNqp*$4pDq{8H~o`-A(*NExVZtr}5 zy^CZ=2(8FanDTbALwFshKH7VW)#BbD2&u6wg1#^4otTxQW&XqbmWsZHW z341nz_a63OV+@4wNY3Ci@Kws_tE&(9R)9YM6s6I@E5fN~*HR9wRfK>|4mqcQCCMQP zRX`mSM9Bed_v_`#@xa{_uxC7<$oK<@lF73#)1#?P4gi0fFN_M~vJRXuh&%dXtyKMq zC7Ib4?znGhL~bW&yWljzoOx-J>S#(~i1&51d;LFg{=ARxGl0x~clNP1L{@V0t!l#h@(j z-&S;}8+L@81(Z?vW>2bZrZ)``Y<{ZF$3A?`sUb}}Eks*Po{@eGa)bpplhck5sP4XM z+=^}0oT@RuQV$}QfADtFF8DCWq;%>y{)ih~#zDY1;pDeC@SuHUTstBD`ur$n4Q#ac zY;`waU=j{yJ3G6=Dcrn%R<}`9DR;6qoO1%?$T?x=$xdI?+n9LMlGrkiaR5Z$F_Ku< ztS~jOSZ}vg7H00Tn$C4PsSUGi;Yr!~aQ?y%Fn&phtAcE2=)JUJ!ssQTa#C~jbA8OVA}t&$fT6GKhz1eSo;tE{z_Z8SwF z>o+Y{TtME)%4R@=45cM-AYhCT)ETaNIc(2?;d26`M3yd!MXXAh%!U-jgscrPEBv zz<*wbzx6XWqZVMuMia6P%Uu z7C(!?=~=q&?R&nmckLJSPRr7t%c&)t*bCc^6&0$hb+%3)04_~omK!ulWjVd8u;^7p zNQ|9cy0pHwDp0_j}I2hWm+`EgR_32S>2ds{!If+DSh%xw3d|Y8~tvfDCar zj|h>B1Pt!woK%>I2}`h;gX{!ia48@sTtUu}Du9s?k$SfIg&oq|K8JyMValInxiy6E zT>U@ny>(O+=oc_7B?u~Al7iBLDBYrf(xP+M>Aky6fD4`%F-Q5f| zzyL$M&+M+txVyiz-*?XU-}nBAV_dd77?&W6SYm$36EWXp&STkBC35=%|)GcMu z-Ny6K@Z2oWDG#3L@C;r+hglULhdtD8W`wbBZnAQQ8^E#Je2sOw-l^=pnM$v}S6D9S zxWA0?7Sk1(hk{ZbDrGzUO~(Nk=q1FWkcY`)yVZbdRoged1^hx$DUDE>Yhd+XxJ9^mi#(*SmD}P5x^A>os&X7+Oi} zF&3l{cjOu^aSAo?L&`WiBaEaPbI4 zS(c@vkfMqbb#=DGB}1M9DGcP}mChdO8B?TqSMuswT5{$C4R=crW{>U~e5;ZwFiNil zxqMB#lo888lodq^lP{?WnlFA}v*VPCdgwNqN^cHzd+zT0rBrAHH^<136gB|z0ES-Q z+~+92SFY{|c~NK%W}DqIHa0I$5ZS1&g}mPW;S=gZJ655XoFHfu#ZWh;m{gw5{Lj#e*aGzO;KzstK`<48WWzfAuk;7E_yhNZT$t32r=dl|ih8c&5r84{P%^ zR9tg&^DQ#QmH_#Z=jvz$*2RI6>^%Nt*ee|`qjzDBbJS8U})GloUn*WZj!Jfp{2sOP9r zugv=1{MJ2jo9;Ch;dSGRPR2#mnEJZaBBil(O_OQYk#7o2xot~Y{Y^WeEer!+>I8uD zWBXBH;cTlW1vWZZT5e?&L_)$zrR2~J)ADqwG9r^tGAh|4}I0VxhBBXwI*>%J%JKILn1UcGZ* zLKi6PzI!Pzg#KPWiDM_#XFg8IRxQZ3I?oHA!q*;VP@E5yI^fv4TmH1=PF|(V{;c!o zIca#bWVm(c>dnq^I1k&#ia!g9x&C|E>Xy{Lb4N2^<^&-X|gIzi|)D@cW{l=lcdrj1P z^_QSx81|r=I2^f{3Gdh(Z(xbK(hz?pz<@nS80YLA6loHHcLM^ab?wUKWRSrt|8(l| zXKG(Qr_Z1j!8+(4a(_($Wv~O|d-TF1f!@m&d6$RE5dzYe!mhhPk(3gUy&I3elAIK^ zdgSfaQl5C8n? zZbfSIwNi45Z}+I2)g(6W+{p@Znr!9HKX16TB|-S6Vkb#Sc%Zvd-ffe&?r_UrE|qA( zziAW9VuCXTM8^5sTL<*5a%NuPK2bMCQ!+yCo6*MdIl9OLnIj_XX+EdR~%&5VtO#Wn~*celi$u8v&$dgQfs zSiQbmmFzOWaq~XS-izOCw`RXV>EMC3*IV1clYf1`;9Wu4w`r=jU@J`klTcTe6i1BHl%rww1nkACD| z=U5%ohHOq>rM;$l^z3&@8>o*}4438AE$4MhFtB!zhC5~h^FGWLabGJ>A9=qEiEzVX z{KnkYRAk;(JSwQU8=+R+Zn>2*NgYrYB0G9b@2%IPjq)od`Mch;J!)=uBD#W#RcXJY zHV|euVfyy9f`e>kfn%vJ;oLMz0oOKPOW2Z!Dbe`u;_{9%uu_?r1I4RB67*t}sGg7* z=r9y#)b6?=$Ax`OUyBQxB|=p(VC1E8>%3l> z1P{Ly`7!W~-dLSkCZeiCC($rH+}H>4G@K?>fJyRft7QKD7p^P)?Z@vQH;hRT+8HF7 zaVEc+%%}hzO|-1xKW=Y!m)kR;{K#VDaCK~XbqcOix^-|^q2E={``cdGC2oY&(Y_EV z)3G?EBHeeWak9G$zvsMF{@7kOt2MAf)jxSQTCu{C*E)1F@ioQa{dwR%Im;ViX=%Xx z`&&rP-?&X01DD*d=@C)$8V%s~K{!6Db%iTfKTKD=G~pd?h?TJG6-0f8m|>qFKzm{6 zGgJ76>@>ylhnKPvOt;>)(JVA-Cy)a#KpWcpUn^^W*~EO9=+aMPOp4jx6hkkI@KPgz-S#fZ}0Z*VLuw~Us4l`JEgek!#4<~xH~+wk6m%s>ylT+Cekx8 z{PqG`AV~Q?9sm?Hn;nS3>GzGr#bZ^pH3lp_JV4e1bn}3gPE9wKsE?+c|H88Uv+PO* z*mH-b4_D~%E_*E&`FYhCUGYz!AXT7$^m{=WmM`Ftn%qoCb+p^0UHGJT?Q)PyT7HU? z<1&K(?W4;(-}-mAR9ZMswu03p3}%Y)UD@2md8VzH+;u9@b!Fmrhm~pv(QJRXDqNPD zv0~wqm$KLB7ByBE+s#_-x|)4=rHz?Pmm~n!=s-NCeg8VU*ArCJ0Y{)m=auAH7E}g8 z1_)}M0%nK(V~xkzc+!uWLASp8(B#0r zp}%QU?7alK-0K#!X&jE$+_pAyc|6XVljS)+Y8nT=q5Qq zwYPIiJ${(7l;u~fRoTER;zLJ{+;z8VL&|ScspJ|Nh9Mkb=U~^PGB2;{u1VB%2@QSz zqML|Z9lH7bg%G)~+LTJ-sa^v#8W6f+wLkL-c8VMH$1*c)B<0@vC5whH#kT}rL0+nf zEj4o8d%p+>DzF`xRrlwNT(H%LO@hBN$->Z?4V1&YDiK~4+leBZ*3=KvSOZFdi)2JP z!VdVRLAJtpzh+JT_od#f@LSe}&#WKiIXafE5TUBn;)U8*#~C!0Ni9J}0XndCv=}@M zvH=XkJXL{*{@Xy`v)P7A1}U$=fX916c;l$T7Dl>~mqyT$rHiCZpao0P6A-mw;-&e+ zd=9j+ZYzG~b!^mx)aXEwLLBBD*&7;yG|{zmdkxwx{CQTv*o(o!(0gSUilgepF_f`|D&kte#mvLW2H>%MIfA;9E{ZI4 zeHuijo#z4{PFLlh41QkwX7l><&%94dgSf5Pn|Qs3_u-?oh9&i~P}6(B51pU_io=|> z(m{odWx}vO37^fd-8j59F?SWTOAU74_18B-wVL?Sw?(my%X)*tBelb}palTcGDc<4 zMcKz0OdPvY)>Xen-+89=>Za=;h#J%sIT5M)e~$^v*z<}OcZ1vNPB&f?a2^oDbV}a= z;V8zr_uQxU+#gX&tB1G+F^I87Mwf>+;cf66NHAQ__QWAJ{t8IUF1uwtH4BFE6|~-= z_^vv5GNR2~vEdz}!=L(Lk}ux$F>o=TZPQ_|T$Zm<4q)7J^hllkHk%PECPwr)I^X`> z(&r)u2p;#QR-QrRHP3=%*C`_GCvBx(Y(Bc&>h1BMR4G8>ZJ#yodw9jJej?fA&pI7UlRc8`w^E;PI4Cfip9U<}U)ek}vPR&C3JtEu*PK!biqTKPtH=+@pg(BEb< z;-3nDerLwA(La24V*Kkio0$|M=s`OXCYGpDoupKErx#9-Iua^(oj{Tdy7%cWy?LW~ zw4ufEZh2khM-PVkR!7^J(&uK1I+4l8&lKd_B#p6}jlMc=Qm%{w%Pv>9!r_rbocS{_ zDgDh9i1P@5yc7p_c=Dbi^Jk!xbDy|&Ao%Kns?63w6%v>w=th>@=7#mc9#2u$k*Kq= z5kUal?2Pv)>CHiS3QBprRv-z2;y0`wME~wL;J-FX*#jF(#g7;%nUI|Y{rt+-_Qr1V z5XK7HlvM}O6HAuJ%^n~+rHS%?SO4_U6Y6hTJo|`y$NKAwSTH=9KPS!Csa;T8Atxfd zjF$sAwT&hF(N0Vs%FhVU&NXgW&z;QTx2Y?D$#kAg=Y{y&%lwcU zM7!R>>{I30!b)dk$U3jX@!|eiH>9enI9%Y1d*!1qXQ?R|bxq`aU^n)^5T`xevagsr zaJWTH6y6L{re~tgJ2rX3qE;S3UyvKqs=9+|b2rxv(YXdD`tN2|XL_NoUyvM0XGuZ% zlb$eTo_tFh8YL)`W42V+S8?6mqa3xA<>@32FY=vmet!2)8PQOjQ=8 z$)y(z_lWQdq8LG$%qz9SSnoWRmC`;Skq|}pndA|etlew4BkM7xuqyG zk#Az(lBO5m{d9LEotRHY-6eTWc32~BhRP*I>PWDT>#RL4$hh=qbUtgw`iLhlOX(g$ zlCAHhoC?pot;h+E*Va8CYDDYt%Ki-F8E;*f_v=mM`vu*D5BB@Y-apuxwwyoH>YmIKL#J;|VUP}MOCAA^hllG#ogjT{pDmmSW!+;G;!UmdtYJD~ zFA2^gQn8pC$RamXWUkbVcP7jq&uGsp1~sladH;T)oBbYk_#aKu|74;9xLm%mLUCN# zsi!jOXWU;3Yd2HQ`Wd>1djp3ix}D?E7Y$l-)>dL;bqD1ni6P<}(g)pmq~@sUCZ!#j%@?$gKF+Z^KvXWg0i%EP~UTL=6!Dkh>7Hy(#W0D^5eLEcq1GM z65gn#W>gD0(n3@>?-}w{Ey{YuTPA^AiDKI!r)sw~U{omsx6D{te-Yz~XATjkbb#Q* z=R|)U!OjHTm`En;_wTkSpXn?k{I*^e9T1vC#2mZm)DNCReK(_BeGCc}-$*aN#oL(u zrnz5H5gW3<)wb=e^5y=IskOn0g<2kmqwh>RFM_?weT)iXBvE$K9Qg>~S*GKOaAXSZ zYF^~lF-DAADV4l*PbzV&P-RY>W9RjX=OdWm2YLA#7h)@(u5zGwe~tB~ zr93s$>IK1m4WVS%U2mOC!KY!2RNL%HBG*&h0hcH?AEg!(N2M_vp=I0Mt*6vGU<-2~*f4R@xgDe(MWdsH=o znVl-Arv`cv#BEOxgdt%iw1_bXaulRsuBj4VBCJWx2G(Qq>ik#>=7yAnA`4A(E8>KMr>MN$rr$24Y$yZbYA+@ zeoFWUYfv~dPzAbjDSo8cNLJK{Nm2Fy?Vnkr-hc;pF2}ptFLYY=2-GtYf>r?FjUtX&2^+_U+_qKQ5Gj=+U*X+|q zKK@<%83VN&79bWTML3eQNDfPlCEyS<1~G*kA}T^_CF>x4p9UsREAPmr3!|BgK87Fh zN3c>v^0)yyt2{S+yz`m!)=KP+)ek{fffXu;d@3y>kr~?1!#O^7p*)6VT){-l`p4ty zn8qd-g=UfEK#d9N)>ps9`7A_-7V-C+508IVV_otF6_@>`-iM4Hd;1kA;KI4#E|YQ* zCgOVR-VRwtC$X|ueMTnduZhBc6KgaF_Uz29D$F!Bf6~GA=QtM+PfQjU`_I5IKq# z5ZU+V=s(hX?`^TJnW@fP2PUTDZX(yP47K{d6=+wHkD9ealC2EbU$58z+S@v`5uf^zrb@=GeU1FT5 z|2@z1k8gjFH&H8sG=PzT`IhRp9_Q%i`dV%u8^{>nq-ROU<60Wl!X5h(lXAjh#9O{QTQ*7E^0HZwU zP!L7MK-Xq3T43+mQHS9kdxWiv&lobg4!(aor>Zv!Wd|-zt+Qr3VbB|Oa+FUWtL;be zcyxlnE##mJ&A1r2=;N&4G%8QI z#P3$iG9FYZ!_cNp^il7Zozxnx$2YJdS~wa8nJDqlMeY`qq!kQ&nhl!vx|2zC=muWt)A{Gb<}YGm&;X#HSoZC5u)BN!>W-zQM_Vd0SrD8I-hBa*KncYj~;>B24R;M7PdoVGuTE%-h~YW~i) zd0tre%v<&3=sMfz2D-hq4b&>S#Z_`GUGgay`rW$bqAIE$WDit>{$X{Yi~FP5YhJ7U zx!IK<*!qPBOoyc@Jg}fUPsQKeY$zR|@8d^oDLUm*_BJK-x_t58E61S1DzO=w^(x@4 zgqouKO@hX0Z3hbaGh)*T`e1na$23g3-Vr4n-_#O{HsQ0O&co7#M|)Zqj&E8ggPFp@ z(^8D)C-L@dURw9W?b9(-bHU5%1I~&X2?Mk6CEZ_@b0`1EEfzkQf&#`K0`U9EHT{a}SJCQ#$ZAH|lPm)uawKhIe3>UsS>*>zX)pSzx(fAKMtCXB}=NoIRx{djFX z9W)6~L0rm|`}1nh3ltUuv3OGp@ulyysCOYb!hKQJ~n zzC`O0X{v%4DPRAvw6wHq{XCBB&)xOz$V}GAiOCB73m9!P>Q`578Lh^?+f->G@Qyc# zPYU*5bA|nRZS`BwHNrC8@N=gZ_~(_te`Hj^7V?i?{wuUjvG$3B*}UjQ@|zrm%ra zq!rxyiR}NesU|>VzG=SA&Hu68PdN7C;&#|j2>lCgFt48yfQ`MNx$0ua_CL1!Nk4Jm z62YI({>P>d?*n`V)aJFH;^toupiT}haewgVSusz9aeXKkAwhz6;XrBZf8hTKxP%}f z-G6N=2k^zUTP5@_ZvgWo|Ci|gfwTWhbpHSe?*An^jHmiLU-@XgC^hpzgi`k~g;C@9N9BA0v+b^$mq|TCIVKZD+mpBtHi5)IUL4Go^V4wWGqaz(i zW&uILNc>*$Pu-VpW2_4eAObA(kSJvzW7!-dX89;25^0HrNa{Xc9#2xA=s05}HVN|J#TMD4_0 z!jK>Z4cK6E*w;*>@yRxhq%+Wq6#mvDGs1URFa;`fmyATjKL1!lA7eQo9cKB!-R->x z)-Piz)l$;%riB~7B0|Y6r97x!NI}SkDpv6!~Mi@{luh0hBE$F z-N1?)$mFtR-pH#MS02Kal$6Y{vKRWaML_bA+@Et~rdjoC~Ynj9TM*EOo z-)1i7BwtzoDs?HwAxy||4-O85rnq>4#s>AksuP8s!`O_($`IVFA5JHTflQN^c%EKf z!h3`Oj?e3Dz;E)e*{&Xk5?A#MdCj}-&2a> z#nhTo1cA<~Uu@hPfbqi%REtZ6W&3BzxdC0u;U4btyfCH4z$~tw3{cnb#BNbyNVh?6 ztcL7%VK+H!T#c=f8U0hdfUWz1@@e1hbDtX%>^k+&zR{h}amU7`qTCoM<_Jv0gu|c{ zfWx(QY)TCJG~vdrs>-p4QLg3POIgPD@%nUpq00wjO+8I;FikJ{TFir~V>u!&%xQ{X zVJi{r!F92lpJM!iz_t+BMpSOk+c4jzAhtZ@X>fHm*~hBq6G@+ZaY~Xg;G=~mqQ0d2 ze3L1*hG?AQKG6_ZQ>=Mu9O#VL^Qv6S#kU{MR4Q z|L+e79oNc@@x&xKfK@HB#dW5;wY3Oec{NqljHRV4txri+e+R@035kd?e$oR>Gp2wP z8v;36s)rs~gPJyvlrkXyh<>PMW@TkC@^0!aejXO$5=J; zM>u;Z^=$D!4MY<-unBC0oqw@d;&>fa2McW@_Mw`QBY>%?CWs`R#mDaf8Twi-A<7v0 z{&{&NqGx=NufO7b@I3Uk-^FXR0?Dzl-!iR2@6QKw$|oDwxMw+*cm8t;8;a}G-oYkC zn72)d#Wpk?TlzZn#YIm3-60r62vR`TmzGq(WWIaiuD1Dep`4?k^rF8pO1P_!SpLiH z?6Bn%^4pbuc>w~NlU?s$a+*KLr?&R=6oYIu_z}IBcl5Tf5QA)eYgqzg9OZToAz*}s zOELuGHU3GWI`QBE4cE+KT7ohU@IYasuJ$-^pe4=ETdeE~`c(Ly_{1eb5;Flh18ehl zJFD|bAgGYuv9TVV)hGxf&0y33r`HRUo@J6W9(A`{X|t@aG6lK@qpn~yk96#CY~VXQ>}`aq96tV zE-FJ|umh8+aCSBAzAhA!=>w?x$>Ul-KEmG;>_wqaMKYT!lh2gTNsEd`%FE0D*w{$K zGf$L0aiww?i&_trIRc%gDwx$~LO=(W{@j7%rObhz#l^dZWdu(_CF~VI7<@#N1Net& zs(i*UMUX$z-tU^6BW_>I1j35R7n!6YF14rGk&}lHxfthow4y+-%E#u6s+$|K*Uar= z2nMwIdK~&gA~kR~)e^-b^^v>%C$Wq+qoJW{A3*XpPiMd)A;|Nnf`1ihMQT5dHlRLQ|I3#=L%jx~^6^ zp1}|kA5jr$F)_Vpc6q5}Y2Q3vHPPD%)xa0FTNQzaSkGWrV~i%Q>vj#Yg1K*ge(~Jn zz7DQF>vOt%s~O;1P6%F1=Df(a&q#dbj)Ui|PnBzGBSpK-+XqVN1P4hXNs;$GQ{E>C zkAgzXu#P0j;v5Chj|{BkY6&8-coEdT1uR<~_}!DmovKBHbk#9(2X?in|QF_`cX$*oQXaV_Co*C2V&J=?8l za$!Z9-0Y!~Xl_ZAXOI{#zOI5ii)GaXx?Ed8 z*nF_HgM%f=`{+3_|a(yB?gkDsG=y40dG^@hJg&yw~m+9f2o}N-C(^-U5 z7XL>S2zytpT6WZEB1JRq`W|ds3ppL%lY+b9dYK*UI=w@=?=s(-)omx(sQO&Dw*d;s z`!cTcg|s}|BW9HNIxG|^4v@%9e3zPa&J6e9TR3~q&Pp;>CXYK`25u;`T?H7%$`h|4 zX+b=gg!e_QSF+%`fItlG?%V)3HAPQf^aJH@$6x?#&U&&rV~>X}=^$@)OUXuX-rNmS z@dJL1ZNms^c<@rEnHCiAm)`y6FC_eM-?VigjHoM`+!jC$(LTiisZJ;?U|q?8@5KUl zI*lO{)~b`|&XX(l_9ddr<)G8RYH4-URmMjDZp4=_J4)vok=1K)y3*$-YPI9vGuMEK zO8B*N4kcPzv!Q~+6Wb>bbD4kjV|9gL=lhX8dyEjkQ0=g=b9t{v4_pWcIdg^sb??rt zhxkHtHna_2X!sdzv|Ie=V#>r`K(m3K!IueA!RBst62vJ4$SeUaS7iN7n$xmPeq${Q zbvXMie0X8sy4M(A&;}ni$e~upaBEZNX3gFE$t)>!D3-~?ZUybF((kO3^eeF~1js?^ zTjP4Ij92_+w&Oq0R8G)*tc}OhW+kAzg}6IKGH|pRD&1OUX%qbx(VDhygRe-}{l;cM zs)I?uU+7K%GA2$E`|}*dgV)hLlauOj=&L~{o1B)CCH^BH+;&zuT~MKXuT1{Xd#I4_ zfVsnvv*}<4gznl$gzB^o4Pf#IVBF@z^?1q>8|@?TBRQ`iJ-$qLkx9_s)X&Qaw#`sBY!WE)M$NzM&&TNl+ErR)U=8RSz$Ju0;^0#yi`6>D?KbZ= z4lm46xNu=N&K>cWdf}$E_1FoYbzDL49c4Mi8`! z+N^!uX}Gf3=flp|uXl5OQ$vADrPX0nJ|<%BlhXv#h$FV*gQ=o`FkDf!=K`K$rw*zy9l3kE!v34vIyg5=L(FvpU2GC}jf-Q$JL9v+{znz@=O zrbzFG3=9ss3z;GhQn3~b3%gg{XNCfOlM)g>85YOn)qJI8h0ch{Ih0D+xrecj6AR<& zw>6B@G#EU65R}I&Zx!9fQN~I`mzEP~BNvZC;s2POy%T1xxxQI{OSH*qehw{)ithIz z(yCY|vb7Ouh-k4)$G9UW7|kYq!^vmomXHJMHM7QD4dR;-ZExY--8$UIE&)qz(MtT- z-kW}8^PNv}+?0)tR7q!fGpD8wNGIpa3K<}@4LhlImqJ?>V#r_#YZLjz@OAtm{a_?t-V@uCPFz+_rABU#BkBDTFCv2_7n$?AMiLo4+r`029fe z29#j5nLC3fRK^U~rwwbNxmE7ExcvK;#p(T}3OZ+=!_l#^@MzkG0S<%D57-g6NeM#gpO|&IX zpBiP5bDObcIxhR(R9&2a@%U(wE~^^pY{#HhY}J-?s{K4FQ`pPOWaq(li=1ih_S^$V zZJVm2k(%1k?6YiLa_?u)9uL*;*VoG!MoxQ`{BTS0mNhm$f(K>}tzw}R8}eV3Gs zTji7LS~F~Ye}hPyo%K6#jcO}a!JriYkxO{XCtJ1>%fCi1Y^!8~-Z3!xNVbY#FBNt; z=g5uG+zmZ53z~iul{QH0l_V81y5df;7U(%bIo;V!?~;k!9)F6Lg~6M%H83~tyf-Sstd@O?b139D&X z8_OTCO!oa~<|Fi`!nIdYexPM>XHI@Hdc`{a^j(0ve&PlWvoY9!6NcG1e1{o($!)!P zgX{aGZY3=wL5@)9i|UVZZxK#AvXMsc>E(tUm>5x?^b5 zRkw-ta&vRDDPZge1oRJ(mg%CQFtShAA}=sr7rfLNnzG|$U2A8MbEq@Ud=j!gMvhqF ztMK-=oPHnX-sFUXZU7OGj*sa`0_Jr=3{d+`xppya!W20?)8SPb!(-6+qZh9eWNn8t zN*~u~tsoXA^7L`4L`ZJ+#mIWQx*kiG;p0aq3rTha3$_K;?;n00ALuDv=T+%p#A?;4 zt4_G2a7}^1)Np4`!+4Y*R?mMaJ+og1 zJ(hd9SeVn0u0#!#)B!396OD+u#9wi74d4QPJm86mi-(irwWy`-r3azVc9H4Jp{p(36ModM|SLaRCW$VM&jzil@f=w}YAuRXjod zrBspd7FADabf$G^SVJMBr`aXCY~rfsICy-R=?7QR97FimrS^~725B3C@Wr+{>~H+> z^%faAbv`3yw@a0h#9X*Ql2z$$r6Vh>C7Ae$!2DYi?`!^voorpn!7Roe*LItov=E{% z4v}k3D@FnM62OMn63<;V8nOPHE&CXIi~_^Q!z^QBgKIhlkNK^}T`)w}C=X0#;mM5o zTzi-QpeDie6;gw)L!^%oq>QlMM@pMz0Y4IAw$%!T2^>Ak! zPWmx)g*SS753OpH8jPoh1PAqoj!XF*?rG>Ej;h_(?@4cxOW*fm5Ze}WuUUO-BQ>aL z$=EZ(7cC_2aJ<;P!g-QrG*WiqLpZx}=Tr4Oo9`m(K6`22IW=Q@GEGlx%_zJ!8T?lw zdg|-T9@bPK`=2=V`u&4u#ja`yR zF$f9(eYRWF9{0o$^Nq{{_zv{b@!gQ}Jx(1|4z>wsiRkN0mdmYr*dmq?%0xo^srX`v$VR^E4Nn;yGYu7Z?+>&1GW z5l5zxq1H2gZ_e8I?XFKG8^OFIP4Bpv1;`u$xw7Ia?NQ{g?QQr*`1rcEo5hrFIUo6W2-_$bk19)@r%KpOMcr!BdF25;g=6h`Qc3nfr zlo{o#`C$u(zDa5w6Hd%B%(zA;J70e#AR)sP{y}=IrnYE4OXw!SjRE{CX1#Vnhme)r z9+#bjxH!eMG}cl`TG|e4E-N!VYp+@EDofMdanMPJeFur8tk&9LWOWaGm^3Zo9ily_n|?j!TY@Z^v1iv$;dNnR3@-`FJk`Jh&=e zE5?P!k`=jtqSm8JH`y9-n2(Nd z0fg3F%Fo~$#zLZl+hR7hL36cw^w~1V>*7*vpJ0+cmY^H+`XKZ}=tVq`#WkrpTLhz3 zsQT_yZBIleH1fcxK(Kp)b#7sGBQrRjM2h4i8E<5{N?=@%9Dae2mdN#l@( zA1g)9foZyuA@fv^9^m@64bU(e`SkjVuE*Q9;1Ku`Gvy_UiB#MqzN_HH+Sg}&E`InM zT@inDCjl5&_nML^&p%}!sM1^bm!q;$R#fyQ>GIq0pHoU@~$0{ot zQhXMd{QXESJ?PCWR2{G%wf$bknQZptkXu^{ZKGI1-UY)t57O>-3m1an9V1IKq4{%I zE7OBN)}3`dw2SL^r&;&uMi}NABR1XEc)T50GDbotJ*w4noOce|GJG<&o|W~@yKw_d z7W%PE(>_iT6H>qM#gF&_u0v;nX!YRLs8Q;L^A}-K?ER9Vq;uK#NF|tPY1=_Fn}fl? z^pE5)Z^ z+dKR&dtt18)VQ8$tL`x@@^{g`Cc`I%erH-~wH}n0&H@j?J)!o4a6Z+y`1Dj|z_8a* z30Mbh5g-wz`*)?_D2<67hqw1n=B^T4Y71Sr50aM#gSsyHU&X%!n+cQ7hz~vCMzFS1 z_g5Dx{|z)%*oGj*X*=4?1!dfJ>I)GtoMZx{x#FVtCytMOpL!0p^Eg;p6~s0PmgeZR zNo3@Q2*#UT+qg^06C75RZ&a(;nan4B?Z7nhZP8i$g%ODxH;PP_SDHG879qgnJ47)u zQY4sHzR<8rK%y`fIn{`e6Rf~vf*o}D&W$AH3PV6o;W6W0k&f&1L967wu9PEB(8Z>8f zsb)O`i=&v>aTjE5vf2gWLMV;H{8w)-9$t>4QG@EhV+>M6Yoie|xG83zwplKm-?r>| zpWJ3C!?8=bF79?Q15Cb)FsM z8(nc(#m9Hc0L|?zZYFo8f6Ln6S@rVrTE?E2>scSId|>POi(QL_ZO6KC5Vld4RTO|3 zIYyf^bez|3Y;j2f@iuj}s;Ve#0kWSh(OUD>eWAmltZeV@X16#dfC)&f=&)EjMl!M= z{w?j#HmM$z+UM(q^QiQv;mXcGz>S&9IICZ_ptHK@Gb1pOk<7cNZ2m zIr+>|Yh-9q)U$NZfb2s|5yZqqe;L?gYHDif1ToT(0|9ZV0j%6U++TkBu?U1jBfX4A zPAMLZrut8~^IM#QDqmn+Jh8v1XDJr|-p1b~X0&23)f{7!ryT@CJKS8*Gtg2(5Sz=6 zImGy!1W0HoqTSJz5@T~cWtq{MCb2s%1P|}j+pEcm>D|OQgq1k>McK*?N(={f3N47{ z3EjR=i%XEBS#RH|*EEZXvif-t^R^Eu&c-0LE>mofZ*fhFwePY_3L!es*wr?C_tYen z5eFG&9s&iF_FEPpSHXui#RRK**a@@xTzHDnJr%(HM++k;+ zt%Qvf@c%~{74cU{dN}phy~7I(-^ln8HQImM+jI9T*Fa!ivr7~JHL)jJ4}|=GqF#m^ zm!(TkQnKgOZxpwl%V^?RSXkh-XAkcWW4KvlM$j~EH;@Ga<$uux-PP+tLKd_8@>5*V z=q>Ley1TnC+NaNBpiw3T0kRLo^VLfI|Jv~kl#QVAtFuj#FqQ@>F4q+k&s{>7vJ6ZT zam21=7+|@88S|D2$2Dz7#Ky*g8fKa0<>eMt|+^{etF8k)Nh$nh&r^4kj}=u~HOM&hA68wQx0o`LRCIt*k& zP^#@1m>awT-S7S|GgP%8nN?ROy|cS(`y9W5t}i>f<9W6B^PQs(03W|`KBDmvq7UuH*$4Dh`sP$vucjPw4p)dvqASi8EG z$zB_HcnW+Vgka!7E+7l3FxKmO3?+zZ>ixbM!0ZXQ^l<=Ohe$H&b~&48csHej2|1o= z)Y}*j$?=&JF9`v1zJ@K8RorOI3)i!uAMA~aHVhng>0*=K4b%>jiNvI(Ki=i=gOqB? z?A-pph~j_zk%FeYcE^X9?CsyaT9O4W74MqxC2C2m4xSj<<%`Bg?8{`~X*a$xY|aK7g9^S39x+ZGLD{-SXiOTr*Y#&){0 zqxz5z+Y~JfaQ?~A1T<4BLIrl+bF$|0(yv1irB>gR{yO*b`T%TJVxxHvS4LWc|G6_b zb}k92$ONIwz$w%1YQWB4>%i}DOC0WL$n6!tB$?l(7}Vk%1u`rErP$8pc5RLzAzx0( z2;)my6z)DV)=8Gg*jn!SNa$ZT`s)uFN2aWb{1QqQ>;?VzYjLMQ5!0DmVh;uRN!0~) zFZHvmPe1udH|=B`Ypj&W$T-b4y;f2Y4Mhk?Ix}M6T!~O(ueHdP0S9zCR9B?+FN3-jRuOjor?iOk_e4GH@zKz(LASX647L zdM3n1{+$SfDLK~YD3M{~B?%S@><;7S7DIWzjMkdpB2>atQ)oKyB$aKx;StP2LDAwKmRbv#cn!E zoj&f?>$G?Efg&sdxk7(_2Aq;{_3U+Sf+{sJcl}^a0t`pZZ-;$;4Q2lRn))dHQFnfx zMC&g0LT(q)@~Pqg0BVtG@uPHN|GNEHy0K6GZT&3Wf8y1Klw*y&36fUf+e>(FvWC+0 z7Q;`%1>ClvK62uCMPO^F?b+nk)U#dc@wLgQf8i+gir9|6=!K3_E9`r@z(SgyvOv%I znH&Qa3avxL& zd&_~x?QU#u92kYg}6(|A9^08N7s#DFjCrT(XXa5pqx zf+Sa*phI{^DO#$MASJ18yp{5y@af%f#nenZZN+?B_Zo%O(rc+NeyCkQri=S}79%cw z`dL=>*HecE5Z>uJ98^nIoKchSK_0g=WrpGB>*>i()}&V}%wZrguf7qnxxIMQStOmJ zI@^GFX)Kn&csS<}7aOxQDsO}7mHHiNDPQnF`Bn0f+k~P5%x5|T7%&d)tw!n!JmDTbjRn3w^U7x0vVra~N{H*IeHbB3! zG|K+u>9E_TjFhBTkbu2kipMjBfnB)xf>?>MKp@5=7a|=jv-diPKUucVylpJ?+rXaR z$<)b*m6M|xp{&{`80yWRPdee~b$O54@o?uX3GsyQyL@ZLmu$mV&n1*Asbzu0^FQel zN=R@xTep`5o+{t`wc4GQ1#(KOO16J2JN$q-!{THs-$yd>xWBRnYoN|c z@CZ;)D*O_w!?>$q#%BzI*Pr}e&i5hz2x0$WZ9GX}(^LYok?iw$+r!eWvj6YG-j0hT z?fV2OGCv(^IPzn4Tlt{d-bZ?D@1>31&?R7!t_nqB@a`e(+w893Jr~!7g&c2xt9hU7 zyQf>VWh{LcStmU@bYTE9L;ZImkf9@>2dwegQuKrpJ}*;;jn_%%`Uj-%3jTi8yq)@y zTsDUT?AH|9k{9**zUu~_$YgI(xP(N6_QI6$m|F7TTI4gN@5IyB%UL*o0rJm3QZ%qz z>O8m-Ptui^y0k;);f(vM<_DW@<7&bui#=s-Anz5$+k56G__44P`5cy*d^rvG{GyAk z>&|X9!)g!`V+S)UOC8DMck|ckR=v+$J5^l%M6PXE{bcw1XIl#$k8NU-Rc^DpEtJN% z^M~afb@(l{+Mn!D^?llprWCPAg0u zrQ#DeY01j1kAv`E<9BG-O->tpQsY;(Kz+7M|DNz%C5w&q|gKS3S(_;ly5+i(~xbU4WOQ!uM2K2`F&sg`EmL zjfl4bl46k-Vynbesbk|9hyFt**pM!MTg%*DTU5fS#{aR4BmSd<^`-SdmZUY%!K^1< z9}N{A>p7A#GaVP}FYP9eqUpe3WWt&b*mC`87zR&@EH0@GTSaoY)<&>Rz%NlEEO}KXE86PQu(}3k>;R z6_Y;AMhNOMX$NY7Wt32{!`ic z6M?}1ffF3MbN_W8eRLs;oN(5ae+BdDWz-99J-FZQt1XA`54PZ*_ zofN8v)tiWb+0qJ1IVF?52!!+jH{j;x{3&aS2n5UmU0}f6UNk#o5`mC517?Am#VJ#f zdb(J3C@{P>Kanx>OMXrATk06sgjCkxpomK&SykMMQd&j*3Kj?_ETC?=>Ku zkc1vu;9c(b(d~2g^Pcnl{;tE1TqJX@xz-wUjC)1+sy# zJhQQLaFJrg)HSiPI9N-u>IlR+hh}KtNKg25Oot@~-YSED!kZ@!eyUCTEd!x3(46 zdZh5Li-B)ato9Iyn>ar|6bj{o3i7$S+wtEQ6BFaVC%`WtzzfXa1$(vftC%})yd=M?WI`n3kmVx|7)qg#ti?PvA>6OT^xYt75MA2 zpEnTKbnvoqGJNFVY~up{zsuf#Ao^d14gMS!6MOLYurAofUEb9hxENSf+sfSrSjFBI z!pi^C==}e(IoXQR+0)N(99$bSn&%o=?aaYyij}z8^B*wg#T#L+*8vL2R?1O&ig@$4-YT& zwW#TB+9kPDHaxF9**o1A0&l;nKg##Zxl$Btph&{_vRWZjP`6q)bXfQBN2Z$JUD_Xt zcu}KAeukWQbpBCxG^7F_C>a$lrm{aQA$lhB#(!tWmh_exQ3*wP5NIg=cyq4^B5k~-)h@z9_ipej29^XB@Dcc|A99L`NzA)p)=HW#m7lA5}4X z9k<_9;LAQQaT_oTO)`8NMHDaP$QA{*?8CeILwRRLbdH*tXX(OAIVaNRuh~Te{5rC4 z%QIw^2OY`td^@W5db7_`c)62s@wHP#x9vB|B41wl@5`6AHI7Qpp58lowIIvs_vY!PqK=PL##abK@xM_&qaM62((LcXFUe2| zD;8gLnz0g%;6HfT{!;xb;aA;ghO@2m)l^R z2TZ3iJ8~&SLO{UBAFV%0`&HVhoa2DklUgD;t+~&#z~HKdWqYx0KBL6PZ)_6i!TAV! zGhWYu42Ca)KK*_*rCq9BX&Y%isnWUMcOIAR#*45)Uqd2PQ97{e$y69%Ftet znwDycuh|%&6IrEyKNv&va`Nnz@eV!STssK~3GDdmD<(pVCJ8@whO@7e#S3|lDFVwv zh{+9u-nPb5;7g0GZJ~!Rd~ar$X!c4CqTeEbu~5H!ahsYdrbTGY|N6|Tz`ct-gkf@I zw+Zu_eKg4`U!XEcHt{dWUbQFYYVMzxtR^jdG3|zh1g~aN)srw&6WzKc^fG9Tjq?r1 zvq(`kr*9X?9(|2AV85v>FL0UcqwLBpl_&vg3awBldB&KU zy&5D0`%K_|ifCeWYIRa|qF3sKvY*l>SG3YGyKjsL_uFq=%dtVGe^gFWZZxGlB{gMC@%r^A5)Jt;C7Pd}e0sVV^ZlauD;MR} z0r=p>_2s?by^DKhYHzdSIrU?UYGliv>=v(h^ul;wj}aBzE|4r(Hu5l9El+ohEiWi1 ztavrmHZ@(L;V5HmaS2S4c+29h<)%fdEd)vJk?-LpJ}GV^?h6rz978HROd(f2?2vlv zOoOOr&s2FhBa^yKIwhOyzx&C2x4&ff&c3JgK7|!uxc4U!y?zaiEdAUneN670uYUq8 z6Bcpih~vc7kyHnz$-Qg28_Y`rr|@atc(+f-bHiBtpn1ah^_LH6miY@Nt*F5EsxNW;9Z?_aOF%bnoVeYcw;!R{`? zz|fe(khj9I)W@;FuD6V@ys)a#O1^BnBFRD98Qhj&-(A^TGVA0!NLc}{=q}AGt+R-n zs+$Z$iA+Ny*xv2l;JT?Vg{}>*C2arD{9$gPk!|??Oi4#c=XRS{*f#f~ex!`xSy^nJ zcHuB3eEMoR*Gu)=$pZol8g>$PLE!k^_|WoDxvRA5PU(k3ZF7&8O52uS^Rxab}~%_gg-wcpw;gpLWNKn#HRm)fNi@g?A&Y1(+ zIqcl!%FuYAbe&5C9;J0f+cSGlgDkZa_5_*>a#Y@^$QjeN(~uJBwJ<`Lvkk8g9}QDw zUml7X+8C1F`E)pXdIm8&&fb&8*DsdaGFjs?;o7|H9X9qR-P+48ztbyuJ+0xp^Sw2~Ozs*1Dl{ z*lOZeXyGy~IqV&_I-Aj-)Z~m`%Hl6K{c!hH+r>IsV*Xr1Rnye6!*N#lN8!f-yvjyH zT24CkUk(>US`Z_N_Hi9g3iq$Zq29fFqZ$ zP#Oe9euu$e$&mAMg6=on7~OHblfpv7PZim2y{#3OLGz8Ws?YjA z*Jw^(Aqjcy?3?7z z*6GQK7`BA>pE2z1b_%8nw)gpDI7_X1qqq1s&6E4;(p;UO&N6#>$f6MO8F4!PYIFO> zwdWDvgQiCY05uyEJq0yZUTJo@Of5o{K&k`-Svh=`~ze=KQ?#=Ep*&!_d^| zxVh1KV_5%|*}iLK6AI;y6nB@Ihn)mhU#MaxXOa$J57;ZIJG_s2esndKt3o3!qw;`g z-^B01vLP0{zDw1>(FDRZuD|LHV?N(H`PAU*ZjM!%><*GiY#IuvK=LOxO&xza!8G*w z;uh4_jd4}NmEQfq!>RwPY^lT3vl<%ypii>rlfSK{^s8RC1Hl2g`rTdRC{ z_MLe5=4+zGAA3kM+2pmp8twzW) zN0@n)D`I4!Y-YYj+wjen(^kX0wvUk~XY zSv=)Oaynl4o3j_*(>$(h-WCi>73_+-d870ViyTpOejz^oS^3Ow_zfO!}U-yS-11?SGyP ztSRw7&tm!CHUHP1|Gh5*qyOtm|6|Di|1yrg$^ScoT%!q+3c+^0o^9&PZb-2~o;jE9 zHuFvT+edE7_{dVinG)j4<376Q&0P4Wy`n%tSDtfZsruc_(af#a;W5^AOenhLaVPce ze%?sz_ffhhqXN3_v!0d`_c>diyeb&pqs1qpmc{$^p&2x?r*mZ4{mgKuy}#7&b{n4u`+uLXZj-!Zos#K?4} zh9f$m^sCcy;Nf5ajxMEV6`VuOKJ>LNpNVozKP2E1AZ=PSS@|BSh;+_d|8A0>nV`*7 z)^0%}&fOp;5?y7tI^7r$;&gFGX?e^UiFok#YqsOz-kp{ImLXn0~6p}fq}me zPC-28J?EsYs?8igFyrq&JSVOB)68!Ro5!2_5~>pGxg@C2<*ub_sIde39@C99Gl*-l zg#7PK{=MDgUz+QCFQRVZB|4kCV2f>Qk_GZ-E!HQ$_~N6Uuen^lN9Fv8;!j(2*aa1I zPA~1Zxpsc#4cp{FmLr3W%njJbJG<WF+7l|f%7K?Pm4-=|CU*ZM1UkNOszI;n}P`H~XA@_FcG(|j2&6ijzB=|oOf+PNW z;Mu$0;7)60>13xO2iWYozB1z5*L?{}{N2;@Ik(4uK0hhT){ht40^r&6%};iQ+TNzK z3+_DjX18RW-(LQ0mA}J5ywG36b2bwZ=S%dV3qV*=mxh$9-(9ryO z8H*8tFC{9TtI1bA!P(r>{Ksqcae-V(qlxmce_G~|oUCF>Q}w(}-SUG9<4$M0nY+5( zdZAzAS*O|YcRPHB=>ClEB~6Rr#@?N+Dvi#urGgmEoQQWD?!iKN(eGRJzC`?Ubr!de z#A9e9{{9}{r?7KSUPZb$V@+PW%xBoL4_B?RT#-hzm%Vz1&eBX5jq-*I6;9pj((m=(CF%jY zwkQ30S=0r5Mnf1Tzr?fnbg!0i30>yWFAqw6`yU=&Gm41mc;&ufwM{gmP(bGRdjg3e z$x4lyFSx@@Icw^D+4W;kLx1O&SH-w2IdIJWSi?{ zrLT*}XAmexGR1#ZNqhqQ!ORjszr(Q2XucDZUN(Mr++pITp;>+t`HbYBTk#hwy=IAz zn^g=r2jEe651aYoJwO@1!5?Pqs9CJ^Bn^F#SFBn47zQjaXpNr1?4YJhNPl_x?Lq>6 zz8kIumK6`L+!-wyzsp}pIV19qJFsXn5TVy#c{quvGp4Mji!|le28DZM&JL}TWCG+2 zus7)Gc}DZ}6X}E-2zp(zf*Mc6ACsvab&cfGLhH3 zcV9Y2%CLItf;XmNhL|2SUdTIc3N5%q@0s(ht?hBCarvu2^B}?tlwL2EjT|~-IAW5M z?`&^h#=#e`$Jc)EQk$9uXy<{q!$RJHGh$%f=*4my>S8nQ_xP{pku9Makh^;9I}mo! ztTKSvQ8(`ukbB&Nwr<~(udQ-L@L>_>%r~X|UT#j7!DZ(MLa%bU4XcT$d{R(L?N1g4 zwQi`UJaA3}Lu3qc4N5-lp{Colmt$03Q{TnDiIV#Ti>zE*$3Lprg{5@+97jx#g?U9? zFDs%c9msxd+#dkJ5*7H@rmSP+k0qYUDL`0c8>PdlGq(usHf?chO@ zq<%Q0)6W>txvTrM5bfs8Wb{Ml_xRsW74-E^X4A#L9wqwBOov)aXElvU=8R)~wEMgx z8h1j~k-(d>9B`h((Jy_H+Ws(j-k~(e!9B==_4cAM1tzwJ_**@yQtqmKzc}8 z->@WAXYEz@VeI^N?mRf|?mt~LQ1&_X0OHji_EuW5X#oF*L%68SAom7a58V;N8&Rk(wIh$zkVI{_W2Kh%tB3rzbi2~qMI=RN>*HEwR}J~%01b-8Ejer z8t03N8&Mt0H$C;tIE80ZId3Ltd5ow&8-(*={dXuO4-@jCo+cBCDi)F z>;mJswZ9{B)F;OZj8P9%hfPBc2L5xZ;2}No>`mRyA670}2 zTKj?9{Nu{rh1QVeF#g7JhNjX4+QZp1mo+H={rgXog&bG|PNu!JK0NHprXM{ynh&P3 z!5#0HIxKRY_+A7{1qOV_~x`(F*WLu16_e*3IT&^o9w z3a5xwNtr76EdOxjJQ5|{C;gw?cKhl8B6JV?(Pla^>Cd7@%2FnMWaYn;y@EaCZnNA3cSBfRcyH2O-a zs_(SXb4Lf$lkUs$`eKho5Pq?1ikRhSMW$!~3dP&~phCrxo}2QXQPbG>O{W?%ICd-o z%WPQU{<*0&U4ViV;g7wM0{|3UlK&>f&YVA1ifL6A6;3ar_xjRJhJoJH#F&_8Me^r} z^Ro2bZOh|$jmNZCn}Z04vU|DHOD&SVedE+C_Q@7bJ7+*nn%&ILU7d*6 zKbx&RuS+W>yUN+oN+q+g^wV#U92YS%9g58Us%9|ndhOL-5iUdi>uVSBXggPWkF`S1 zv$`)y9BR7ir}_yMlcaq>1|r~`P~YLelwu44J861suD&*!7pW~ri0hX*PmP6Q z9xW!-P1`a5id#}nx7qTirNZ8MGoy>C!$44+(%f%*zWBxRRK(bL=H~Zs`e0%DgZqs8Qf~8Ymc-o^ zPyO+KFrQb;#l&JS)W42^Fp2HZk#QLmhO4HZ7Ml31+kE7gyfy|o+`3f*gxL#{?)^E4 zVNhNXlS8lO*3$uF-LMadCU-snH|PjqR*zTVyLpGsf{N?$Vp0g$bmKSB-6>wfW^7t` zKm06C)P3~i_wT=w96*D-h#+pS&Roicy;E=!F{>8Rw&Xo=n?C)>v4Y*1T6GO{%E9KO z6>&6w&-IS6=p{x8&$zuk$l&G0#`Om5Tw+%|Pj?!0Zo&7qF>I>bA>HDOL!IMj?!n$N z;8+c-3>3Lk45CUa{pWM(db8jyF9o!B(FO8xI$$hT^U-_JooB+K3^=Fra=Ue zco*Gt4qKnCOGK#2+NS`pI+mP`qpj;cPP-wzF%~r&`CX98 z`{|wEX6FkMqi-q$+X;&g>vr+|2aLcYNFq3{8%$B*3_FW}d`#HoxrYxnE%Mv`ks*no zFg=+P31^hxGnUl~o^K5?U&+@k)P9Man)#Vx?ff^k7r8pTSJQZSjVt$@$6}!xW&Qv| z>L|8smDGL%!aICLYZeF46z@LYwGSmQc-xrA0H%JIPs5brtISSE>kwRnnae((rW}=M z=A&%pzwZHWOprP|T!aOWseh)H5I34-tR6%DWP@YkoBmRE8+)@qlX|~otS~C5kQoNh zA6w%96Ge#=l5US#^x!9q`^Lt*b8)ujIBtv&TA8pLQ!i+!@a~3-xjErVQNuy*Fl`zu z0{0_W-5J)!JqdSmos;Y|>h}EzHv37V{AZst?=p1Ae<%9ZFNI||8gFtb8&4DI%|U2u zNG;ds7o1OlicU<;WZ^h0Zmz1dF(cBjpOZT$$zg1619C=}KaPQu^vZv>m)zAHUlRRg zZwn%=VeRF*@Fae{^vQcjVnuK&@2|064D_!6Ij)N)>Dh;78P}f5|FGJX@iS$~wjO`l zX7$~=fTzHmg0W({)&taE^$0F=zV^u>UBDD{nha79Z*iA0`1puyu%eAi^#;FP#_X{6 z`8qsfdnwq)40d#$A3eY()#6@I2qT0gGll zjbalX(6rU}chM5)>e=B4l7fIEn_&1|t|Wlu`{bGf7f%9Y_k(JZz`-%9ma|ggD7`3X z;R3VYfazn1P7TR|$4Hg3cmXVyGaNTJd{sm8R(k}apzg&{y>X6!olY*v7WW4H{oz$O zKV|jskG8N`LtpbIY@~E@1+4b^#%{p!C>d}ApG|;4#EZ;%neN$yxW!-uyODxatH~q3 zS?s%JD&y;6B)uu)N- zGo5Hh81@1cleOBX*=fvuZLd~}^N#Bir-*agq}Dz?xEB;2aDIXqDtGu;cYFG*BU(R9 zy%VKw4m55@zN2@R9kl`Y8Yc(08dE;I?$p9+ame-1jT7K_7&eYFojw2Y7rmygnLu1SD2g@rueO4MZa@e?KdwGwPOn zSpgy+sY^u%DOqjwXxMZZmOhAcz|&K_cR{5VU4gMj)PPq>B-*62*}COFS67SH987^E zN2SkC!5U_SpV8cN`|})$m$pZ?6GOwpD-^2Cm&NwB+viTO440xE#(E?gumH_`5rO72 zZ>%r3AN+c>*5Lq6zTbMX^R?JA(Fl~F57FDXoZpGsyyE;7LUj~z<4qBep zpHiGoUrH0c)4|Q~@K*`-OF0R8$Zi4T!{zq^y36x*t;-WTR2*!)xh5X+{HU3d{15nkOgu=I3DuU)0Dt#2dFiUP{ak-JDoR8Z*&w z8TwXdR)HWX_{t>Z<3;(Z>EX z55`yMX-`q-_u{B&yT&BT9e@pdzQp7gs+uAFlPg=lZJj$-zdu*+y<6NTwRj109N%>M zT3g(wcOet-wEZRapw-WQTRXU4tY@^qbR?r;g8t9_)lP_#9-~$${X3yJuExUl)Fj$tSFgjp3(!ga(=ohy^d&VLOfkW3pcA>1(;^o zBtd=*CjF+?qDnR<622^eOAR15-VpCkYgd}%+Tn;*xht)x@k?xc!X)oo zO+jT^Q(knBzHES^QKf&)8s>@a)!aj-2uJDqFK&EwnINeQ$dK}6pR~{37cRFv8Yb^0 zORet0gjz*Jvp-!b-E(71Z3{?0d&?o3 z+%f%ZVm)59ZX}QMn-fr;_LTXhBfc^>lAMKOV}dEoGrs%8jEQ4OKwIyz5L57iis-G z{io-k4L$PnSF-c}bQ-sd_AHWxlVVr2C-({b6>75z&I}?{nOGHRHDb!GLed;2)rw6q zQ%nLd{YcRj#b-S@IE4yg| z*ocUPeKjh{EoKC3lQ&K=8>tAWJ9E-=#g_6-`>K}edyhreSG(@Nkoy;Ek_AAPjD+WqmdOs%603bxe};(oYgIhe@Y zBZNYq2nu7G&ZP%e>C~s10-AKbXtosQvh9U|at+H~ua4;#nQ@rbd2YuMcjX(DNDh2( zT8{QwnWX#t8*@oni+5#L-l-?FOa2$8_EXB-FRAa>`m*>vM>QBO^+ z0IyE+bdA` zt9Ip|@&v$evO6aA@>WcljmIUMHcKu0ww2I#O^?A7z3X%{;;hqYxjLP6&&|qg)v&j= zDFS^dkF7n?Gf4%gT;05*kuFoc^NDiMc;DGOI*%~MYv!faIevhKBH%ETlCA*PI5**I zJbbo3hf}RHfxjJhn4ZNJ^q0y7lceu<5YZ|reOb&Ye%AIxL)yT0vUH1ZB|EKN5Vvg(nh^>^m9eq0t&Ycu=B1H0iVW_9_sSp4)88|1^m}Z8a^ye^ zuF+)`YTg3J`AvksG<<5VwKnv*Y)xsq25e`SQtChW@o{>>l`HkbphBaHE^w-BimG~sw@YD**uVB&Q2VBdu((_VP_U=ngKmz zsq^H(X5lNdWIJ1$n9rVlVX~^Sa_6Y`(eoIX$Q}nNwDxp|X98+U*~AY!RR$^ez= z=Dm4_RWMM;he&z=L6|OX)19!th@uWSP9Ty&)?f)^T$h>RJ&&SuN z4e&Ql4e1%xa@$*^*yEOs_2ey}bO?sOZPa{@su&MzO1hW;sEhzLr%BJ*lH#fp81z~x zT$z0Q3tV21XJy$mmK(4ZJ{s_0c=YS%UvM1sm4BWxF6HU!!NEvgK5=I&>Emq1*pUp* z&gf40rHNb(b}8P`h)+qGHNM7&71hDA|B9kapTXNyi^g=}-L@5mMP^bp8@W7XU1JI7nB5hq$gk--ycv^OmPDDl5x2opLP> z>3_Tz4*-}k{(g$}$QNT&A|qe*JnIpvD%{f)S4gY^SiPmN{r)cm`>$sH8M80~PT4}J z3&CnhNlDU4JTi=Z#p2%DLPLze$z`#f76gY!H*5bjlxa;CDV z>8#d?t%BKi^S<|TJXt!Y-!X?t7;J)Q>h9L%9tX_gRl|Ww<(AB}u@h0Pomb05qmQd7MWv>x-F% zjo%orXaR~qc1#1d5iG^%fCK8Gj*e)y&$@XDTBX+9lU1%ofEo37ra-Qu`#pVtbZ`r( zo*zsyIMWL|vIFYPWyTLqLo(;yDQiN=L=%BWbRsTykK0w?CuWsSHSZWD`Y0V!YHLS* z&{+X{KiM7VQ3G`E)FzQ4F^r$dp4jWc8MP+Vy@glyI&Bf!Qs|`(l%6LrO0hu`A*1j!~hVdHyutM z*+Sxu4!8NIhx1b`s@Ef7=cgPV{zuE_u>b@NAS~nt zjML{{w`hv7o_>b~{)UuB-(UvZ=Jn7#gzghat=zM`5$KEUY}2c~f z>j4cqKp81p#ecAmGgJ2oOEgYa)aK7GBY!BDL4- zRyWIhyPD2%{4$F5j{$*-6JQ|;y(v`_!{##E-(u&;VeYk_H6&od&-bkqx^v_6tlPTc z)oGm1(|yq%J3*cb;k9k#6Hs!9X#URgMW)ghbMjKd-bf`F?&T9I>BGR0BG(4urPwQ1 zQw)Z?BjW+p+$&$P*wuJ`{F7 z|9^!?&{sB#7ZI=E?R({!7vBd~mhtMF4jEsHd%uiXszy4bG$xkwUSuz9Bi8zei@&1( z04$pib5%Q8kx-qNY_Ct9zaqMzU7FJP?#6u+KX?+8glB%%=g&!Z4)mI~G$gmHh1K?X z(|0tJF7nqmlYfzM4PWBBnVTy`;Q#d{*#YT#RD1z>>ub|H04C@(&lgpGVEc$j6PTp) zP7BWA%HL)3-F#Yew31RDD*5?3uTe)&lHlgk!-WS~a;Qk@It$AN0GgpS50$Q4pV+EWf4bePT)p`SeSlq^!TOT-KMQ|qsTj*A zYj|W%{zbp2&|gO1+&`XXFQA>y@GM4Gk3auR5t$U?@%+y3Ba;8(m893~@vqvCsBgeB zHGF((1%*A$4hSnWye&@bryuQH%=P!+x;juvILTXJ_)bONlbJF=MoMi+&(FTd6$V+C zi1FN1s>I|zSn|%)OODL z9C63UqN?D50~s$cOS2wk`)DX?zHGC7sGp%F~Hagl_&R=g2>5jS;+)5dd3=VeI zkUp|T!Z@csb$Ptq1J21$8ua{@QA=qwcE+BcVVVwV_kj{;De1Kt^4P3OhZ`e= zZA4f~wL|Zm#&EQrn4MJ8^nGzldtz#5Od5ZHo~6%y>n~~4FPR^v{htn!|AP8VS@P=O zFk6IEMJpQT=Gu%9LnD@Oj8s*qk6Qhxr_^X}y8cJgkg7Z^gLY}Yb$PAMGuWvs+Vx}t zUpejkMOHy7=XToJEe<*ls6x`o1EYad{}aW=d9rT?=0+GEX5ymATfUIJwWpJf{&lC@ z?aVPTF^&boW>b_xKy@)|mLj1;h=55@Bk(rtK*guj@F~R`Z$2E;0 z#1ZDK(!7$16JN%ms_ep>n*efv%9)avg8#dCd`%{3my@E@^?3L)hPEkXHR9iRZqP#( zi-+>HQlje*JBwdLk43JIDROa+6-4l6fIQy)rlvs~&yD)Fq~x zPWb>Tm)6rRWI3IrdTWvokzP^0yTfRBQUIzb$7Fh-dYo_7q%lBuAK|jEiT`-NXxw>z z70@eeib_zfX(**Vg>$*}y`|$&>pOr}DCF=l<9oEzgU!m1&&}z+jpd95t5q?1UNEJp zFr`>o6k;qaJ8M$gDV9q`;#~|Z!VO5ar_zK)3lJT8^`S7{H9YvXXqaVo!@mJvHTqVnn zqWEA`BCH20RhDtN4)TqDh~;R>CMlS51|N)l#i=ru`SOGFg;0`#FrTd%|MS5){ww&q z_H2XF1cO&@YiGZ+t3A4J^?d^L6`8zp7Soq~&t;~y)N5NKy;aILeYrFCx4Qm|`2Lb9 zWLe?@Nv^5vGa}!SCbar;NO|XFomc1z9Jt25Tat-zEx^eK7|G`i%L{jIf4pmve!h(g z4IpEc9~$e8+e6r@n52BT643Seik;dyTAkC)j5>IQQAK zT50ta*7%Jl@Ad};(%wxo38#|l4h%U&nN{r8C(aKFys>t>nW7O}dl3kx-`)(Q}e^nFWTG3?tsKyuR(pnV(hNaR(xgy= z3YbopjJK#urHU2QNxUhP^YDFnOc|=I!A)wi_aTZb%Qcl(v9c%jFoBTcY^0l`P?e*f z@jV89JsDF1fA~^RoWhq~F#)K0r^f;%<-q1i14lQIk$jAbc9xE%W zumcJ(l-Ou~YoWE&Vb~T~Hh2~w`y`Q%Z8TRm9tb7n8uw*#2x6V#mvZ1XmnHY$E1Yeo z^18lU^hjV88Emye190y<9Y=qL6g4+K)a&+@le4LNHnw^GA}2wWlSl(O4^XZ%V>A<3 z6YfMRvX40o_xoew>KfAuP;Oc3bRc6+aa5#Lr?9sZO_WICgphnYsd;qKYy9f>X z$d)Ph@M`%3e0fBj;IdKwCWsMirjEs>*>w>(qd+=eIG*{>cnCcz^k(!=w=76=(Lfcl zjYM7;M%Akmx`vx^-C|KZi;2TzB#h{4fBv>EqU0A`2pn*%oGhOeDn8_s30|HuPfKs` zC`cHp_3T!HG#Ql3HP;(R+PYl%4X}XcxU*)0;zP>Rz163LJcR9~p=gsNG4N~dx5s+H zGXSqFPB@#qYg~ECCjmvr0TSaAfR$t^$9^CB)NZKN=;tMPQ);)T>}UBj?QaHjNeS}| zae5;QM0WkC0G1OAFb`4Gno5?Ke~FlwcasNfr6cD3dxIR!5B0-l<(_B2c?!t;vtZiF zezJt80h^i9AG>{x03T{`4`_oJ+0}24OPZ!g5NYqx>))<&1xz%%YGZBCy{YHSep8oj z%5(s{7eJH6oMB<8m??qp;fvZs9VmH7WWv0vMuU11%~7#O8qu^J6LrcFz4fMANJtcr z_2a4?)qVzX|Grftbj81?IQsGZgxiCY?;1w--v~*Rg%(gesW3L(L*jNyg_SjH#UmLgu zRKEFeNq7=)9Ij~QweWbg91w@hcQVdrFiY})mGCI&gm!eMYru*V`~+U=?0+|v2Fl*Q zMtYs$(sfy(RpMN$E{Yt9j97o|aiTzVe*^(&W?^$vL{G!{QW(h@oN}~e1Fhe zsPF9F;&hyR_Ow&jd)ec$$L@QW06N@Nf<8|(vQNm zCcz7}dfu4_!cm3HFIE<$gb7v_#GYRK(`Vj>21ekG2YQxkmj|yD)$hCodMv*byUN22 z#--Jg1PlS$@!D2BKH+iqx6s(s#WV@%4*lH>F>p3;3IKtpt0Q17#H$kCh_n$MWXK(T z0qxYfw=dAgd6=TR_H6$ygf$U-Ab8E$v4*h*7dFj*;uc&b?yieW@-G|R?S*9)oQsdG z?cLeu_~b5CchSdXB~`aw@e8wrh1zywZ_GmxbRS9Q4*iH!0aaS;62~X$9FCf+-#>*-k{=FnaYj){0NTZ zXjJC+Ew4G4#Y!X%pKQ~1^f}O@kI@!2bu$Q9=K2(FloxG7)Dw0h5_qEccZ$NpS7b4` zHzV?;02u|^7%ND@-S_4dJmJ(Vv`H3{u~R?q>DfM45Vtr3l#64E1TKJy7`rlZ@EVmz zZH(qkBj3ADY~@Lro&bFrQvS7z5fYCT{XqVREKoWi8Dfjk71T*-+q&|MM!$Q@HJ$jpt01)@!+j$C$1LNc zD!8A_7q$_olB&?pMhv=(-Kd3xS6 z7H*f}Z&X;jac7mnyI|nUQ#Rj?ealw9c%Z$oqd6#8ay9%WxXQ$DTQV&HXq*g~xo(oZULw9AlO{Blrd zpvM`r<7{N+i_)zD`154fEHUl`o0ueMH=+H#uDd-lgXO2PRrdyGLb^FqqYd=7=yL;= z(ny}Z#vQ%<_hEXX#DCu<=m+;a<%<(?`%LkH=h`kWCOM0o4<-6X1lxNnPUA1|TwHx` z3V+DkdE0!rR@Ip6ec^aH;f6yydn zdw4w{_6kLRxlv^39*rc5!darjEX0Ix6JH1`hM8AQAh&L$?Q+WJ^|{~wEsY2vmrsReNLPJt`t1ts4`PV*a7W1^MLTQq2jNwX_%PJ z%Wo7uia$=I_(~{hRTNZH;oR76>U6@Ip7$0t>1h7jOkX5Ngf`LW{E3pTG#i;fJfLa4 zS@YeWc@$`kZ-)9np(g-&2kM)CH`-PDq z*z*LSAiZ5g6VoMDAv7#9#;_CTPYAkN+f$%*XnChw(SZMoB-e)OpDi{)9T)BINooqT zXasnu8fJ=T&y=J3R;>{u!p6@1n-^vi@;IOQ3kV2|PmI-y5BjdGL68B949rPPRz-Y`Lnw4@Yr{;5^vclqu#%axN?=2zhq41@(Ks}uGBs0MsIB< zd-^*DQb()U&j3;DBXzqfB*NCKHa81X2inoh@{D+A;APCRf#H-R%#Li1;yfaB8Xnx9(RtK3t5HfctHCYeU8ZyU}de7;&BxBM9 zD6`;+Ez+es?#KlmRhJ{?M??U!{U&o&8`!;5bvJ8e9*#=|zzuf!#-do@M|J~28WZa&hZ#M_=sVUP>KNhTc_0t6HK0QG=9&VyViCyn_7eICaxH5FQtC%wAE;_8sY^ASrrCR7UTqpD^ciKf$kEO=2=NiOR6qO+42X1WtT823S*_+ME7 zsw9gCUwmrxmI!MZu9)MuOE63*{q3+=s6_*5UnWKg^H&%8Napg?BTM4}d`!{~WfyYR z;oDOGeZND8OR~Pg0RP|4TtR=6@+Mw_rzMmAmI5;>M09V%@5??$0H=w0(L8;D(P}(D z#)q&zIdOnCPf5fhoNKP2{utyB{JWi!w~g2ty<~fH8!==xg!uA!pno5RzAEW6WduPO8WrgYxldH2 z#l~8MdF(Qf{}{{DkXMYo%`|7V{b{n~M0Q)_N>u3WG(q!n9vwUEd?KVc;{7?l@a`y- zkgS%8Z}l3o0dNI*zoN_jn9|P>zt_H|>F_de@OU*|kUm$7NF$qo-8AuZm+&LB_VnFD z75O&RQgM8{^-QjcJJI#vwd#&th|1uj${Ae&!@$+u2e=6r+&xhwA);wlWPdZQRz31X zbCN`&flYO!j#R6ot1AUyPbJ~$ zDt*<$tSYgS#bZ)@$#O826KJoXEzW;)aI*5!fn@=a|TvCqH$a_j7IU=Rc?pTwtR1R(#&=G)?>~ zfOuimN)j$oQ{XKn%sT1sn(Nw!T(1vY@}!QX1&tc{fFMJ9HlCvO=Y>BTAA@gz3FH%F zYy)06(PyUGcBK4g^xqs86wSo08W^RYm<=~uVS9H=t0+9t%#?fl*{?xwN}VYphdI+94s_>k zOZzrduFpva@#5*OnP5pCU;gh|jfnJ9oHUfYQbNY_vYPuop&l6U{#O!xnA(BhU@vX8VlzFBaOH^6xZ#L>8JPp|jvCd{vlzJ<7fmu`MQl z6zl*Rs05r(s+exw`w`tb{aq=#RRj7z9~!D?f84TNe;8BLrKiHJSOn>SYqVE0^ympW z5;@sR9a@|u0qkt48h*g#2M{HV0b0h?K*@yP^Ig5pgAzEtbs%ZuNsH?PR{9--lG!UT0%-$TKfYFW36pU=GW$m??5gMW1f1vpgZY-9sY z15nVwLQ@FZIg)^3y@^U$$N z2jOCO%fr^qMyd9_Mq!zAe@<%t(mxr8(yN$ciUHJzh7&ncCqg!6QXc3?I$H<>k+3ld zHv7(Cz?p<+WPQESe4MmW;wo}qY7x%g_%vpta4>?=0UpPblj4>LEC~iQY~p4V?|GEH zG=Lm-HLoP$)YJsrYH>y4h_~Fz%-;D}fI8{b*xiaV64g`@S!6if2l|tQ@nhX#r`B!p zxM66DQ%|1Lpu}sgdu4ftJCl;9K3{J$SdJ;p{rV3+quB~hvz};0AoDTZ4SPInarV~57de^O63LjuxP=~jF0}F zWgdM9u0Ol~JI*#!alBmy&N2*i1Pv7#x#a{%EIMGb?&?hGBCzfcGTFa>3ae&(4n1&5I}i?PV#+JRA!tX|nSpPLcB2Gj{?GI}+CH ztA9S}7kI;o!98L>I?5$Gc}FU7t)_&j>_*}6!o&$yq0&gM1UW(FL7)vMoQs779=~18 zM&QWKDg69qOYs@{zyW63byFASYpx@~qsDewBlITS-9b9WKPa#Z(&@bCtTy!IW0R!u zKTl3 za^pIpix)^?%4ZP9{)nsh^=+Twk=?>LNv$h*AuGE`@+)Z zN-g4T=@0%2LwT>?^1QXU)$wTghZFr+sAjss`^r0b=9LI7v7Ipu^VYXy6Pok*A3!Sq z_@Uo?i0}`jdsxJ&N~MT}ogFP=1T1WzWYz)Usceq49}udW{cI!q#g@m)h_=lEW=gC^ zr!Y=rnI{th-_NeC)j@HH83SEq!oAn^hg)eiA_6kCx2o+?v#VQCyW2Ye+pQ&p?-_Lo zm&BavWOQLZ3F6@Q02ImW){cj|dL-a9Q=Eon8R3{MYo@;^1>Wbx7VkXa6KPzo-C2dj zT`?D}hmg$5lG1`UmEk(KrflD$u(s(Ybq~#me_3God+XJP5zZ8YpO;uK_ceSfgAL7U z%TQTJtz7!^8DY5iA6gFYgO!hnlJ=Ju>|RdZ5$5cvlH#_q1GXgLMGK5KjBnDmGH?+K zSvdw$bTeT70s<9*a$f?CLQQsWfltczSLbtg zw(ec$(Fvejz77gX$5TZMTm$}On(4RDw8R(x2`*th%BUpLeaY@xv92b-Wd?@2_Gc|*3og0(J z1TGPgX{x?&y7pM@((HqRYde_9IG`Yr-D0z5AtHTzwh<`V$}RDB4O(Fp1Cc<2`0i0) z`@b58^zREp>2>5_+t_SG)P*Y23JFRGtULb?bM5~1@CYwW#ht61pvFjmzP{#0(OV^j zZEOf_D9J_`ewQTPzkUH2!c@d+9DdT4yY(lg<0I8-inmu?t0kyShCcmGz>se0wvg5# z1Ga!ZU@@05JLGE0Q}e&t$O zDn`D0_l_QQ&+CunMw)^2`H(&d`X^~0h?ub*PwM@+$t!*?@!!-C% z#J+k8#1IK@SoN4azuXE)`7XUOx?c0sfikM$d|?VqRk! z==+#PpoG@X?Dq~X-jcgHMSKu6c%=Rm6h*LLugS~d{(FYvxCR0&SL?OvpntNL{~-xs zkR?L3)O05m%{r$aWh}Q!TrvvyNYTf5TPOaG&TPFh1dzj@S#P^*tavQ}O?Arced}P2 z!}$#M#oSBJPG(TYOaF#1{Ofl36RG3Tk|vqMMl8UZ94UV6#M{r-NO}TAfb<(Ku`+j@ z(f)3dy}0r&c65dYiuvJ$(kwHTWx8wPpX}GVpZcUX?hd2jN%B7?LXye1u#!&t;=8s- zq7%gRNvX=EpOP%q+trDs3>PK2tW6CYF1R-Xo?CD(nJD%37Fysxd|1k{z@?-JEL#ey zg9fT%I!6v+tN`9VKEMbJTQ6}&aEzzU;#vbE8jNl2!Ib8f6j3|)cJ_lO4IdvLS$VKf z%loJ~QeD~q%%^$$F0-FLr)x>&-#zIMxsHP=>2qoEq1}${PX!#|VgVnOyNgG2OLUvy zE3zPKqR@IuOl)6GtVq8mw$8aZ>PSmkb@ad$vvy70r}2cJP1NO?mJTLMK(}1;7*W+b z>O%%u@B%duBnH7h6&JAbf`4daF?c*7X#f`AI^gGVONY!h;>;6-dXP=u>x-LbvlQr8 zz#PJ-Tb_mD=0v6vIG8Jq8{CR+muDBAAT76j$8E+zw8_jg9=rq--kJz6^dk={r91kw z;b@E>AbTp3`&`z;8Q(Mub*}5PMDa93$cA?DNvpm)&*nVMD zdG@@NskS}X3%A!iwSH(c6R_SOEhWaV#H?Fg(6nRY&8WB48OM|zU%kdXp6N#GsGR=D zZ;A@)>i2tbnt2*Iq3C$Aif&O{uRwF<=WQ`hU@ua7^JWgO417p@pa+y08e^zg9zF+x zkM#$60T@1w>__{pffPyr;b?l=`iq@WY%!)lGlIo#FDPnoWq==p`u>*eoLPTjRVvPT zJ<6unIwytu0LMS&yVqdECGI-|guAFkc?@i_#2B|?`50M0;VhyHm_{BjitI?-(Kj;O z5jz4X!^djtW9ou=Ao1l24pv^nWgW9`AhM?`&^oA`s@)akM6MoP%bikKAf(VzSlbOd zwerCGr!1r1$p^hho)wuDmWLbd96%y#oN~N!?1{ir)RX@<( zcBdj6QZ%ai0l;)R5@$Vrzp3I`n)2+>mU=?6>%Z&5|NJiCE!UhBbINBnaR1wtZu3oOFUO)a^Q1IxdnK(` z5wl3`r(jGoJlIBd?pw-^`m;1i-$O}u33os#Z5|WY_l}Hk6|tX(!k{%fiviAsOm_ey zhrvZ&?*;tby!dH+hrZ0QvDs=6`v-AV;|F_d6)Qxzm(5*XX$LD(>CHzMgPP@hOPXg6 z@F&1u`AC4JZgBV^dN9e-?}LF;@Xm;d|A0FrzInmp;~N^W zLre*axFv8u{D`9E$;`Yb(CqVW>o?9ugWd&p$ zT)A6nvuY#l39k%$qB6>sx4Zo<0Ep4YDTflEdo!y-D37C%bWC#zNIRM>mve$3)f574 z=~3}kVNcyBsV{f9P4=$*FlSwV6S<44K|M??M6H9+q!g1nEr+xcPiiie_>E5}%Y1=n zd)aAm$G1hjB$M+heFys?P>?x9M;(jF-IQ*1ayJ&Tk^(}OSIQ_>YgOuN&99I2cNuTv z@jkISoLxe9*X$F$Qttd*ubCa#Z7S9+$R@b0AGuCErw04>rytIo9I+f+KQVwdY%(v;J%A_dAb4>L6UAP$D|d`Wx>t}b;7 zz*`&vpvm`ap0*)s<6||(#(BogFyLB2CUPLC5PF&DoqFycg`D*u8;99pp&t2hCrz2o z%KpQp4PnmQDrEi6>hx&IWC^N;xs~0Xtjn*41YS@Wf#dcCP8X+sA6!%w zqKWNU*Y%Y_SB5=+SuXfZEcYsI5ZFMueVM%a>Jr@?2E#2Q;wpO9)Ud-v``B z+=Chmsv%rrs3fY=y259xe{$d)rzqSYXJQgpsGz5Ml2SX08aPR+d^0_gYG>4(!#p*? zbmigU=4V6Y6KYK1m9KIJ4Kv#{_SsUCFpxnotk*MVmIq9^O?F=26l0P#T=0_H_!9t=Qf{nNxgb|SW|3)0YaxaXg1T5Flps($=QGo`EuWJLay8PFC#Ip6O;1gT+x4cV zsJ^e%2|*?*aW8S&M=t9dpUG)l21Z#^KFx9&LiFVm2r6|Y=2%q~k|j8nFDKcQ|Fvog zE3Zi*QR`xFMfUHBoz)#UcTsuvtXs)Wv4G=wCczFGwN=*#d1*$fIVtWu)S9adEBh&; zsk6gS*lBhlybAJ}+~BCc{6fAlGnXq*O8#-<)`0VI%ChsswZhny=C2OwSrR*)mwh8T zQ$S4C8!6f?(+|+*2kAwaPE0Qi_sWAqW>R5=No#k%5?4`YJbdk-Q7GIOcIoM)bd`cq z?CpCEp72%CpQ88W@K{Uu3ENKH3W}CKdctIT(%8JICB5}j2~%}4up31oQ6CjU^M2Iw#dtTJe0dv-f)syA6 z^$_2X<|eb|L`$ZE-|>FVG<9u1#9Oq#Qh_;|Mcm^f{k!{%^)Car1}coMK9W>4=tXEH zPM*mWYbhi$qrOH?Wg~2#%GDnkxveR7$0%9ihefEY69~__l_Ns^mOL>Q=`QNVs=TIB zP?$$RDg^!#HJvfGF$vjRHxGH^mSY?m_S7v-*0~ur9yHtJO>rn0e5#rL zXm+{zdJ+9iS-6J$ZbKCLCyZ_d&z=&q2NtANI6n)7u{<;jNtE;$A~-!sXLQ@%54-AF zW#GInw3}mZZ0`WClcsSer)m5FUEvzC#!QxMU1b*cP-|hlzHQEGSb)r`ij5j@qPs0r zX5r@$R_i`F9!GQP7582u*MK>hPoOT{=?!ZxT7tj%OBVC*o$f97g$S@*4z9EPw3hoQ zw`ozMqj9gHgw!NsXPQM|~;u$P1)sXw=xfwU6K_$%HD83p@<^&9m zPw-ktMMfqDhu)-(esDK-fyx21Y=h@r0hp!t;r9Et(nMy?A;(9A?w8ue=6?M3%N!b4 z$BUR7NKQoWG&C=yh8mKIy``U!7nHi&Set4lr> zbL8vLoT$jk1)v+kxmr0&hk)Gg)o<)lfJ7&B9qdCbpgj^xu z&}8QYG44hrs|WWo%aG_L3uAdF3MFhD^|tIKL+o{(5xy0qLe4kZSQohvX#tuQ&wB9> z19~Qr#rh?jhsr&tS5WVtu3)%OkSm*4b}KWrSAu_aF*WN-B{1};M*V#La$TQi?5wl9 zG{U)TK0z_2JllDKBjqyUIc~iKY6N$tsH|L9|EAarq97M>f+`6(h80m|=yZ8P=8^9a zaY&mhbA?-vZYF#u3Z;;von~HitJoTh-Mh=Cco)oc&g;R%?}mfJu2V=p%~AslTti2H z6l#CuTi|Q+=>FN-l8DKpckku|An#^iIOhqz<|p6OTr++G5L+cjUzFAJ5#NyW7~ha9 zIXSCmvBD(Z3C{0C6@;a6f-$`+r^emSudPn2*40Hf(8Q0VlGRWNkp%?si+dSB20=#Zhg0XY>kKZ5|E08%?!OQS;MB`u?qV|M$_F_ZcxAWjuyDM!?u;_iCEx zl>4WJXNZjel7!Z~qp|ia-=iC9L}MyKm&b&fg!Zd{=0V5~14BB->wo{gfyg06PBNa| z9GPvMZv z&6RMX2rOY@e!Re2{@RI@H;#$BGh)%3V%A02=&a0Q&dXu2`$J?Rnlj(#Zqdw1h+)sKZy!wI^&FLjZI8&ZQB zDg1(hn~dC<^Bp1q&QRi87MXX0C;~bDHG}YvS>R!8(tg_}EmR<4_H1M1e;8$t1ueWZ19)0kJ)E^?wDmqdWqhHlQvP$p% zOk_i6iQ%-0^c!N!xevz+jA$tU?)Wh7am^_~WYATQtK(i-xX(~bR#OB5zl7~lcM}n= z7_U0Qx9ig)I(e#uAnSZ<|EhywPWiDz&#m#aSsx8wfb7C=)J>j~Dc>7yg6`N{-I>x) zHP_Dq*UP>rfxfpYHRaK(1T+cuz zqIgv6F`k^NU%>p?z9xFPMA#0Y)?N4-$5J)|i>cgA|+ z!IZi0i(#_n8KvZkOK?F$cl{YXVj9(dyfTP!Qd5oi8rvBa+u6$L_jSf4oL6NPR%X-P z=a~2U5<1}Dbtb2IJGVCNiaKrEp3t#XW|vWtOb(7zxg{6J_untCs+y!>2bLH&o^@A= z)Se1ks7_`BfRyu|zQ}(yQw2dw(ta|Yk43t5@wX?iym7M}NPcmrQVDD3w5pl0)*9m% zFWr4LTdmn`-D_%Hx4{DK9PP!y6SH^Ywq0teRZ!g7`FwG^Fa|4k;8|ZfH0ci&tN>NE z3X1f?@7$F!0TB3VHxEw(y1XoKR|y8eNj8l?p_O2m$(;MeYF=jA>0o&soG)fG@w_r; zB|5>tPX7i4HtL`5mvHIY*c)V$cl5n3MS?ge?aAUBh-0~6n}KAJ)plA*7r&7d$09wW zxVCEI9|Ff<5cO1mx0P=`%^Dtq1m#q%BtdKzWp9}k~h%%Gc(Wt~`( ztH&>6F^R_fwEm@P@$z&!XqG$(U!U#!EZZ^&_WsNky2*Snd2qKnJv|mp_hNIukEuj( zoIXJE2l*g5^=d;{z+*9eV#qG&dwF2%RBQU(fXYks4BqK|Wldx5TrJB_=>VJ#Q|xhX z+DORw@+TGQ z&`c)@1t!?2@Ayte<9t5?>SXB<(3FNuDL9zHeWbATC!Pj3p5M@!8hiKG5tGO$ zFN$J(l8`+%6<+o_r`~0y+Hyli(yC|(a&{Yq z*s)=fr!4&qV}`rAlSPKv3~I$ zm9{evg{ca)1)BV(Y}-?2tLv}TKKX~D3#xLW^cyPYp{qhR(G;t2A;_iM{ZZXO**Ug0 zZS4Ja2S~e|&npe9wB6W0Er-84mBe2y5KYw0mP&p-`|k6)H?B#WoDWYhtmiT)ZLc~+ zr}@!6QaGbn4L}*iBfQ^H4I!%MiO!pLj+wIz?%ZkEkmu`9t z$W|@vA{d;`#2u<(W$qHa-ru}L)${V~?f317LM69acM#VS@aeVAtNHq95Xs!zei35$ zgpQSqfM<7@G^VABD%t`NyteIABi2#+7j3H`WL9ZBqCF^zo5wEoG~-5m>zrYAV9y{> z)w>+~U{$RAKRXv{+mS9FtJ=d>4rhI~R98)Zc&&AI*7StcG16<4-`QRGOk2rF&5I8- z0~R_vRyp6;RN6zVj9Ad_fa=}rzY0n$yeD#T0DuFr^ODg7H7U~XpU=4rjic3|)CT{7(>GULy z7Xa^D!6gP8ITPh`i^FknQN14E7Fm3yvW8zCe$ri4`6_^Rkr5%PRG`7jEOqSh0bb!< zLof;?r*)h36Xpq`-rAh0c1_Z&v?_}%#(gyj6vDqby2=L>t(+OmO8E5~abaF2Q!Yf4@#h^POwM5Z?=mB8-)75cs@nZDutg1EY04DaT>Zd)__4&nawe=t4MAvGrWgZ&B68-kfL_){pebcf#yQ4MiXAgW z-ooQw11C+VLej6|T5kHZz5Bg-gr9ZSp!`-@cKG3OE%?(xcpNODcFWiH6ejobIBd5W z5Ozi=sm1@IfP&?77{Z#yPlqb~+5R&8h8+lH7}qV6+p|oAu69u0nj01^$!eSNwW1OO zp8glTvHW)&DF%Wlr+|FK}SmLjmbXS zaz-MdMU`j^`k{#4!@fwvtn_gJmGY8{LEfPd%`NkmH`*Fy5iy7|DW%`6ZNvSTh4 z{_ZzpdV})DOLP^S>AA`6^rQTJrGLS?R#Q{)OeEf&2c~hdk3Ml3cy;9ToTlX+tC$p< z#~jg?mo6%l>AoJTsLK!K_HLYNzN$r^L+UvJs`xjra%dR=g!^--@@u0J%xAh=jJLn} z$gOzygW61;{8Cx48RE(OcH;K_(hzdi*0zA~3vr$3;#$S<4!p7_N592o<{Q@6&W1N^8Wn$oV; zU?yPZH`>_4NQTJv9K)Ag!sF{yA7rTPcuRRC1&2cw1K0~o*Z0y*YKl}B``bTImnlxe3nqZFS|dvcIc9oXV6X$h^O`c}t*R$uz~= z)A-@;R%OP?x47dM36$qHnLLaWBn_Uxo{zu5HsBue`x?vx)rYdENnk@guSgk$zR&Biv@DIs{(&DiGdiT_LjG@E!tsZyWOi5dIMh z>#vNYcC?>v?8L|JvWn&c0^r?uN?HAzra?868`UK|pJ!<7yDYKx)8*g1KrYr8fL&AE zt7G72DP$2t*PpzkXnN=pU*Poay|*pzuNM2!@5+xB>2w+&i-?*?`wi+1r%Kn*niL&u z_6n?2t;Xen=o(K3tPF0RQFTg0CrYUon<}AHA4FTvzPJFG8|@@vd#zI+K-M6FgiO3J z7Wh^R?+msVkoK@`7L_{Gh`MZ~2e%>HE=l%CPRPcomzk1z>TrZbE+(Lt&Qg5DeGOt8 zS!}LyYl4j=Tr)vU__dr7a#_Cc5`eI(UN>J-rOML_tMW$PYkfUgY^ZYl%p92J7*?%V zT7-E0?v|PMMDy8zjat;+Z67AEStt8B)+XK!h`Z~P&`*(VVgV6%wYa}bn|6N!6(S!n z%nr~{}iJoow&a{0t-7qn+q zC6mSeaTnuK8=%x2!Vdd&yD|TKc(oYzbGI&cIrgPJIOISRY6Pohw#}dX%>PV`QrLdh z#o(fGy^Dg3%(+El85tQfa}78xe#NjPMN6m@@o6uqPaVd3u#IoxVKtazIt^zz=?MzKQxwUSeGjLWaK3Oe>4p(`9T zyieB^F63q3)Bg#MKght$lJWGHa?2-lYbvk{t2T;FAmxr*LPQ(6(#5l*RI=6^cU%1T z)KckGJ$qQj=qwfdl^8F_Yq=HcCajA_t*Y%oF>JiSqx_HCkAe(+j^xxAj}UeoWKJSeR9D zT}Pj3;@cjQnt1U#L&aX__0p-3&+O6jGR1SF%C{KOO5X_+lf9~^!q!e-hXHSULRJjM z779&uYe+rd3M`HLl*E(zzEN4&&s;B}`oPQA{;(%Az1WOXRV@uS3>oRV4i+kAiu>PX z{%Ot&_a=SoD}bJDxZCM|E#NeWd4d@?nuBNEi}ktj4+Zr9l-GdrYic(yFPZ-~^#L~U zTIf+dn1X}c#QZvSCl3&`QndmjkG=VC0>6EJ=_aYN=8%uzrM_~IPfwnk@LRai_bY{keKbi<9Qw4GZFY9ULqTg~FJnUNr)jMr0fG=zv-i%;Fi5cez`>aHA=|uoBXl zMV#Jku>s9O|33cbxqsYf!=-gErnfcTUfG(yaaOZHOL+$ziPPbk3NCJ~Y&!Vpsigj& ze#Iryn-*+jumAU!_t#GY5S-HQJ+X^S8qfdfF8MEv<^l=P&A!+EKY0IPr2S*ybqWI? zL0z2X^LzgfSNcD%y7c+e>rKRw`Pc9Jzc%w962zMEXrt77o&Q|K{`GF|T}W>eC;#~6 z?LQ6Z|MhOJ;m>LgG;!Vk|M^d*xi_{3r3%0%lb4b4IbSiRCm-A%Hw6R+eb+ia$Bn^! zyNaJ!23)5$83iX#h9q^g7S5p}Jv^^Y)6)hSh0^ zlBWL&T9_kXkq2}`HF2h?wCM?YP3A3L{@}sY_zGy@IfG`v<_EIez$L1VF zihW3|6vzLPWy0RUsNp4MVzmyP+Al(iaXpB;ZM2rvkeYhKTupl;?i3pm|dtQS5-<~uzBg(5{ZqGp@9C&$+{9DCoiP~PK&;+OE zynVYcwx5x~u@kCw8BWr$s{~F8LOR=wX7_8xdw(>;&mHb>*|dKMu|dMCzS8FB7YTdq ztmerrchkJ;S?!H0@#r}qW0hJx!~Ncjf_chjIHS|1e|0<})!pFMrJNJn`oz1AZ&!yi<+HqdoYTRx z;1Rt@R%Mg-&{nSis3i)rmFc61=TZ%OB=8TygAjup0l*xYFCclsF+!hiWz=9%BnKYuWR;3){nv~g8Qph*!aVloL#N(f4X?XG>kS_4d>#?uiGeuiKRf+w zT<2PdcuW?1UXFpaBofteVe!M6trCP88NE{w{j(i!P57gMR0;jZy0cmW?f~kR=(^;c z&1RrT@ZA%?$QwqQv1@$qx(8VEvA51&eWd37Is<==@vJ+jeFmV~H1PgAjN%|n?@w5s zu4vX0b6?{P_!?l8$--a!bz2PJQIOv@#LyyKVA3YI5|&8wN>7W2)eiEuSwEYo$1ANz zeeOgxxU6Kr2w1Ty*IuphVqb3|tD$SoEH%1Z7tD%21XBa`(-@?0(q$sKOEgb?-}hk5 zdMDQH>&Xw!uv{8ec-*t=h~zL}t-NDUJLLFP(qrRV)0%YA#h>Zv;ZX{!V|n!XcLnH( zRJm@PVI;&an7pHMe!?MK-Perx!ILeBr;NtqhCu|UL^!+m;k|JXYCI^y2D+D-+%=n% zOH|I&H9#800($aSG?L4q3-qkR(0)DGmA{L+^i9$Us~a&zKm^~E1en0m%-eB}uTpTA zZfWKA!!Om*75?@z)Zc#0m+;wXXZ0nSHbPF+9s8@`cGr##d>sFdlK$!q$a|_weRmKR z5z;@4+b&Mn+|jFcnTWwVr$BW|WSVWpZCsbIos~6 z3Z>4MlGHLZ`RsoJ^*AyTBN2q8Ut})qyr+{CY|5au;COBp|H+7lF!HUJim<2)q`=wy z2DNip!n%6>-km979|p_Kd&PUtY_E-LgfQLzu1hig?)Qx8W0E%4i*_c1M;n1goP^l% zI+TQXT=JRKwZ-1Wn)8|B7MX?$a^&mOjX?b8$f-N@Y|?(Vai#LLl|V*iSZ;+CzSKo7 z`>o}?VTQQysO2<%KEX<9NQ)cdz2-eC@vyKgM5%n7pTjR=&@o$RErpsTx@40(7xJQc zXYR6m!T@>Lql4Qk3)Jw!+(Y#c;|b*I_$Wq|iQh5CRfFgEz(+BDnS)=v`rHy$B)_S9 z-@`H#DyFm5dHN+}^tY5lw)9Ql0lX;dXhxsUzj*!3cM#XASCT32Z-l#wrFf_}QOx$L zH4E;i@sC@|QQG&&N0&3)kR0we>CcTGYe0 zJCneNg{j4YWbu5F^*3eTm*R|}D{ID0t1roY4u7A2S!L74vD!+(?oyO+Z|LA>5PN+O z$W!7LfmnHSH2eA!#eg#fbHSXE&k0wqjmX!#?gxayd0(FdJ(?Km{?#Gf39$JKD+wOt zsZdp+b{p+N->rD zx>F!_x}xD7VFye#%jh@mZ4c~c4ZsOa6VxXl4;#}8DWM=XFlh7$=I;tNr!0+?;EssS zPB#GPaKEP+NJ1I|wv@;0VWqVc>djD+omwO9ho7#BI6W;gs8dXN?)=YgKKTDb-e3QSRt*D=k?|IBZD;fT>L$~U_NI*FDdM}el0!wcsi6o_Gl?dPE>QOBjsYHD&z?(IYh-o^2*!!C zv7=*S{#O>jWU+1V;Ujl!aw5o4V%Y(CpAULNv5rFnJZV1pmueW3dx6tJD^p%-j=ZW_ z10d!@`_(UAF)`JBQOpDa>efJV45fMs!n>6k#ap>v-W=d|Zhi60dR_;Xu~zsq>)00P zS<7Cq(Jk8!d~V26z-I8?+oux|&kt^Ylp4j+!5zkSfb&cxGnw3*k(TVA zszCHjEgC>!rz$3(Q8Hx8K6e`&Hh_Ju2Mm-#kN&CFE1*#2U2mMOhCf)&(}n zc2v9`J{Fzz#`!i~9Vt470GYMxiB)vtxVvBHrJgA(l*Dd};2Pc7g1NTRc<|n^DacuP2 z7et@%=+bQX%6Wf2xfBS;zBz0*o26bq2MYn`05(0Y6F%aPzHz7;gyT4-4c{3HkrwL4GS#8lzG7Nr0D=9(`t2o>K%i2Ll7MjKc@rhC_FdtQ+xU`NGQBKOrfazl%O zzroX;?IAfHR`fwpCDusyJ znL3K>x%g7@bWeas@-2Q99Zuj&Rb9=}Nu&S0M_EV%+xw+tc`?A3HSo4t`uyY*)eBc7 zeV$q+Uug^<>}Yu=xR32{x4V!4bymMA_4#v2F0dl!0~#ZtH$eaXS;h_;suZ#<#z%os zK%VzzdCqO_iJkEyr-j^{#`7!>HEB1$Wxtcxy(($?PBgQZh)W7paM&dht-B?uX7wy0 z&~#ILa|jW*Rju#G^iZE5h#W8ALBDOhZ!IUH!rgqhS#bbjsu*JRH|PuL!q^M<*gefm z(@m#vM$R5P~aHBu1&ZD#zQo8ik6 z>({3s&8s=_216(;0uyCLd+NWg(xA0EP$<(PFBzwjJ!JFRyDs0oz(|8u;|5aOOqw+m zj)j!obmNHubloX?pMs2q9M|7ck#cs+hgS(aF4o4OyAs`@?Ww`L=TO(qGe~Xqjdo`^ zm2{2s!_A4QvOq@1Q0AC0t*m5b|97C2PaTe8hQ}*e+y3rH_OgUTTn6K5!k2DfLSy z@W$L(VjH!SdGULDRQ3I?ry9-Dk#B059DBa}WaQm)gP0o-5&j_bmtN*ArO#DxDwU@aqBcER`hCqelpmiJ59U zXXx_%S58+B(yG(X_gcOZ92ZBb%+M3o2pMdaaHB-@)Xr7xeof zKP5J8A;|1%rgU&@T3SgcGBwM;K1i~Woss@Jw?@X*^mTuiv8ccd-ub>Gr_YppD4+X0 z8)9Z~J0CHx6@}>dTBhiS(W=j<3>vK>eBN2IyZT`9&X*cZUv;NsD<^psCy^xGS?vp| zr>-J9I{c;-`zVUS$mh3gPUER%P$lg<4P^5S{i7V^q}77kw+qlc(Db!tFkTg%+e{ha z@2MU>mLm5gfCFF2caPMTHfAzrK2z2=#n8trIA^TQ*ot#glkWs>_#P7w&0$;H|E(qljB#rBetx8?8HVPx?R_l&%a@9#YLLUh1^!{DOte1x2X*3)_(Y$s&V zziK;p@Ns6WllO?X(vjVFJHlT7iyO%a?VPY1LMKN1{-BCz814+QOE;9ljKetKUxVx) z#emzQk~4M!zIpTIN@0vS=z@-Z(4NgU!}qJ4w!>?}Lv#4XI@EwGLosx6L8JpeZF%4K zq%7{|-MgfVRW2*qWv1JHlp3sR9qC-RTTL9(p5K+G{yb97z`K*d+k5XW9z>ISlV=5v zgfu1`*Q_uVL7MH;;*7LJx5IJerr1O-OhPyPh>Vh zQ`*1Td+%QVW!`YL;(N7rq&=oOXIQ37?uq@L_ zaW*TZI+xZ1fIkm?RXqNR%rsciOGUPkk43Db7tdb9;hV0{aYaWyt3bK`5Ey)D4_|wJ zNNGd6G?>Poe><+b#T$12h}E(@SsYj6cYG)!-@W4ApWIIR8Nf=S=4?^cZKP{=>3EhU z`kKsl47PmUXzV}i6%Dp;1)(xZ+edR`=VJ%e!x`gqNtL!Akw&q+F|RZBd^{s*7)PYz z6ZfG7eh`S4;vLowu%ywSyZ#G!ik0D#t%|Hs?;T^1N41#a7xN9_ea_^Kkh>>GdU%Tp4|F0!9&$O|7(R9e0VJX?L2Q_HYK z!n~NA?rfGdy~MCd^n4@(E?B6q#)fP-5*%|W+_7-M!^vN)N0YQz=%>@gw=%7ldg-I& zpC5Gyd2a~MtW%|~@Hnj3TkO~je)|fSxWVu~_g3zVgH+?=h9)EsAkfpeTC~1>Kd?!c z%F;;$=Q&G$gMi23YMnu5Bb(*_$KG2;RoS)c-*gKqEhz{rkw!ooM7j~_4w3HemKH%m zx}>GM8y2N>N`rK>X#SHY_TIPme#Y2e-f!<1eo$etSl2b@HRn9finB+&KZDsR{$cwhbr_rkj*7V1@u3WhDHEU zi`!n9n-32brrGn-Sh4ADC9H229cI{Z!7dw={qDr#)ia`-ac&2no(|Pu&M9_(8n%IF zz~@^;=Nc9MZf5*-*E3divkU3FYEL+EaeT>#{Z3RTg>FWj#@-Z`K)VN`3`La@4!bj5 zZw1fHhmrNAxILJ|EBAl2J$GK8`t>Bfs_E*)N$WWm@b4UA`{k$^x%PBoQv->{gryQ; z?oQUcUy`dU*)Bn|eRY@##7bczr}eF5p$a2@DyF$otUSY@{uave3*SQ&)8X@M&1?Q(-UCpYa-t))7_s^pY%XnIiKvLY)(RAwl0f}eB@znisgti$?tpV|7ZWL0gE@+>3kuN)KYNB#JW|M*{ zdGX`|$8&1OBrNC6iwoC1F8mwBx_~io2F}s(zNu0u5&0%7qKiKqsOc!<(dv9H%^xy> zMms|!%p0)wq%<4j*Gj-11rXkESP^$QqiwYFxy6p#5Ay11f|4K1o3!#>LZyY#jG)Zh z`-(aDiA?8orD@D;H#OWAcB4~*wZNqgaO5dhI4=C^HJhhvU)_}HI^kAKU2MX#&E(5y zZbuxZ+VzE-n0)Bry~u9>dQ5Dd7Qb&Gi09qXu0|u&axM6tC>|t-g3oBx5^oVM?SBUc zetA^!ET|&6ck!uQlenvRlX#1`oPn6`eZ~SdW@2RRm14rP7j$2zZ{SLWNc^gau5V}u zdQWTxxzOKm(e)0(3=96Y>5hd%`4lm?VrXjg-MCyE00MY_1h}xc@aVTAnZV6rB^%h- z0K=bsXDQ0Yd*<<3PeEu{7%Z44Ba>{bm-!J;Sz)wC&WGCu@R zR?^cy1FU!yZzyC%j?|xlsMfz<7h(bR*K3lj{o45k1rqg%jwqI6zu9?Tz?lVYvx^dE z1PA#!UZCEu@7kIsl;o}!NdB5cALPWdlkC}rlI8dk=ltQ_TiB@jQO}}th5gzrAWBL% ziNXizF48M}D2Hi3_flDjyBewITHB48@dT7uKEB7JJ@S|mfX3^a%FD2BlvR~{5o<8W zC7H;wuk5OhRfH{+fMn!7IR2uYeD#VOgq!r*nXo^=Ru#IC3< zD2JZNe73q>nkKU07!k)o5qT5|>$d-Sn{MfPxtYtaVp+P{wdlZOPy!#>hXR>Ru%PVc z#Cu^QNFgefr5%t-5c)E!R7it0AH6?Z0+Z{YQ=>f}V@|(BBN2jGyHL6NZ71V4!vZ9D zR$#1+p%wMQ_T^m)d>@N_GmSrE!hKfC5Eo~mAL@vUs>Rzu#ucl+=p*R`+1E3|+@hUu z=&nK3SNxW4QF%O3!lzH=6Wdei{Md!wmksw6jL%_TWAW_koBdXmg<4AzW z0>bV?Xan9!h2En?nIG6$d>!+GGw&-4^W~bu3Y)N`UTooM$%qJlw8QW{!m@l6H~xw0 z7&pAN8*NS)RTibSh8VQ+_3WM9$dG%vp} zTI$EIT-JM~!f9mtzKzj-k`O?;NPRJCyp@$QeAMW? z{jnH}Fl8bk87?Q3z>(~9JeDrI3@EJR_~T%PN>sF5#&3UE$9UR~iF*{vkOcF5-2eHk z_>Fj4d++*SAKh!i&uo{JE?hRE-WZx5H9OW%Xbol_n+Rg`XZ41>b0Ih)ckDVrRPeS5 zKZ~{7cr4-3v_I#(niTy%`^w<&LX`0NfCg4bOvE&gNmScWA121~%BN~R{P9FGmnPO{ z{Z=Sik^j&_H7(1=4kHS_pH`ot0*U#{Cv84L)obZFu@r0$9~LjYh&)<(N|oTFcTbSJ zqBx#Lyj}on4AL97veZ)IH_=PcHMn$J=#LB#f*26lEXqAMtyoFc*r$(I8gIW;2T7e0 zZXAzBU?RpVsGXzZiD{oKCO*Q_>ri5yReG`;y1=U^G^NJ1#4{5o?C-}&s$UllZ$e$F zg^dd->YxqUsfdI4EWeOA^l$XF`-z4Urw=C3sRNKOjTe?QZCwK>IkL0OOaQAU1Z&kD z58rql1wWL;<%$KN->JxYn@$ZC&oTyYHln7HpgO8bF~>(&Aqln1tY#10x#virE^XJT ztXLzMT>xdw)wCYH7-M} zeXd-j&ID-cvLH2S57x4GsM{NSW3A>NUj!VX%0Kk7TMn2cYdG9lCgj{9 zExO6kvm?M8@bVK_7QvyxyZuewnmPCJMm8}1(F!v3{z^fXh=u8CSc!3^U@UEK7_wZx zEU};~bO)Ln_6Yoz8~dc6Q5uiyn|Wdn-Kt}o2c_UA)6p1^u0{hUo3?FaoR(G z$71VKKlVbDdX$O&!0*&xjh*Fy;*1nasy$R1Dqz`0Knq%{4;psVz9qof#Kc?J3 z$dP5+DPQ>x_QD3`Y$%xK7dJkcs&X$eJbh;gbC#ckazlQ%BdJW-8ITm+vbtDjzojd& z2Rvt z7dvlKF>7!@p=R5er`Uelg4rMMtpsE%&>_te_!HzWe@6D9huZY-(b*Yb(Ut`9kM4Wf z%gOP*PU%=JViBIvbv?z0@qVP?3ZHVc%uCgKLYvosh)Ua>rO-MX`o>jogfM&YO)UZA z*M_zXzWDyMT0*P+-hEM9+jibiGVC63oNKAfc9UzSYfk*Fd4+x{P%ih(yya%Obl6w3 z+?e3tE;zYSPkymJU(T{D*9SW?tgBoGCALDq(-Kh-Zp^G3lheEjR^Tx6p0X~Vwmu)-r$fOIn2oYEuv zzv%14ju~jz!rnXY0{yghQS$GGdJDCeCzxrQbzy|Kz+vowR!;tDSn>>;&4Tl6Ej>f` zx*Fk|M%C8POqrMdAU9+%r!@&4g*OWWN{7NS=;k)U-=IsX;FnasoPG=s!>SGFI zbxPm;37H8*B||H^w@{%v%~3=cOgO5!t}iQfhM$y z`eBl4rA)zknZdhO!29xx!;iy$r5l#`?8=Ijc-RB+v#mcHB9v2*+x;wj<7G2pA2he| zsrr=B!d2}R!`U0sA{aIeE-ixIV+00~4%*vZ=P>()?=gzaTnQ|`97BVbEq#qB`gY>g z$o&UKBRcJlHS@aVqguIgmN2|j6HHn%#vjs|LM-qoD)UOdAzmeuWbX33p}jrjO|6e9 z6`w(@cW;~K(+Wo**usqOS3NVEa->H_r%tb{o&WfLZkR*86tY zn;W;E$Kk_%EWdhWrT}VkOp`fqo6W<3KV4jY%odh4lq!4DpLvF;XUf#X;mZBBPx}xRzDU$V?u7_t^=#d%=csjI zoJ;hoXY^Ks7Z#Q|O7vTL#g_1K#g)iiFTN;x>3>%X4FvV+=hsS)cq1XO*ZIbH>w?!d zoKVI!HY{j<6UzJ8fOd^v5TDF|C|()794eIOBwVINr5*@xn2sMhyUBPsB|UU*Fi17D z&hbOtC*6RvEa&+Mudhx}`u=y?-O8}jW05HT85gykj);BG3N&~Zj!M%#B#70UOMl=N zEz|dGrIKH3&OT~#OC^ZoifEv_)#FDeeuHdSgLc69hge@1O<%m&;q|6ff^GDEJN)da z&oI3Ol@Z;huL=n(JVj#>?Q^xp@j6)9#w^V+MU>w$SPn>0bJ zXc{uE`yzA>qI_tl#!GJQvl9GL|H1K43U9uXTc!y8DHM^u3$fw$<%h+pRjg2KDGp## zoJ?ow6H5$fXe!d2To7&cC^6a<0s--J*P@=?JY#kth_w&7Fa$eibHXMu13Xlwn)z8- z6F+k^Flk9|Bx#g49Z#rU42;nCA0HtD{A{VK zo!X&_$v2P&omr1!qq^X8infKcK#~AnZV8~BAsu*0oA}oU6Quw`X*xS%q`uXIQP1Tn zb9B{QqSy!aJxpov$O(!Gv;GCZ-Z&TUFRoxWk8aRVB)gHK=liALcI)-_%crp`l0uepEWA)l`C2tm!=Jn%OsmLRe{=5$|oGYSTWsap@D=u@YTo1^v`r zCsyd2huJ@?p_RwP`hJ~f48U{!G79aCefP+8qKOOY0`9uXx?S-paE;JbRbonca}Jrz zY?StEaE>IHC97d0;1U3J(b8G53~6r`|I9L}U@zS6kz2M-BxT~~iMh1BiFLdxxtRqT znM;ZF6zchx&?{&`Q>-c4Ot31d%X8n;7ulsY@#6YS^LaI9^E{R>^k?xM$IhrA^LA9Y zmyZ;Y?rJ2;`lB1WZ^qEmneLqqulZ*IMc3ptzCp*ciNPdJUO~uk@TPI)=eqsKub~hf z_lJZGB{_>pgzpp?_rvOO%nwZOSY%=G1ebF3o!LCs>%&PUGtR%$OTAp#;&=Lr`eSk! zhrE>QPwRE~tp%P*vzKh30HvHgby|YdU#o_`43Am`8^p0GoD6y>(X<*x$+Dw9Kdas2 z^b?-WQ}G><&8n1QxBaqV=_P=2EXN}m@J=4jx9Wpy9FRu2eMTkB6lP+P6_O!%<$9ED z&YdvS8p`j3q1th#SLaHO0`o_i&Bk;pnpc0~zfG%M*BE%JiU&&)6-5t&8j({hFDk0+ zhFXL%X}zN8DSQ*zF|1T>QnG602xLMTU(E=+KfRa5-LqE|TyWp#ch2;eM5E=Lx0grc zKi5jfw-`Ttmb(>67zMf#36#Xvg(}7CA=FU!)~^_*-IOm;zGlfav*DD_vc&E}7I^A9 zgF^Z(c3-Vn5r%~_C5Q)FSt6I{s-uUtVw-EKqRyKHR~#e85HGe*%5+cB%#~-QJ*5-M zG2eX>TP-s@YpE7{6k<(Qbi_go-X`E`M`rZ##!cyEPj=u+PgEi3ozoXpS<%u$H;S|? zRA9)%`GCvBkR$n=EfR9&bmQy%8RDp z4a0mtvzy2@6*|B9Dq9H8^^9P5p0H+CgIivCT_g-gzX+0KZMr-5`Z!-os2^#KeloR=~ z@f=$LhZsJuzM4)J7*@`%r(gQE9o0^-*36#hcLa%kO^DuWSQcn_ATn(Qz>Fgh<5_*w z>Xq;Y?ans^5aR)zp1Sw4`_7YcHGI|mU$oNHf+}FcAL4%j!|Ol{Fq}=$aADYQ#%b3Z z2EUk1msFskV#vWA@x$L+?unw%m69L2HDsAan)rM!{6kQt<{zLaIf%BtuUyjmk@ zM#`34Wd0HJCd4SN=4@v0sDWW+-D@4`!1MQ5e%7(buVh|lx%k2kv#Yb+y>c`cXnBtG zsU5Z@FcQedW#+BruflT0^v3!wyYp{b0`8)N?_Iw(%v+NJ^E%&kYktWh(xwlmwFvQF ztQx_z=6J!N7`WS^jo3Ux9JrZV=kyJ&OY!)Y`q#z42Z@dPM|qC3joozl+VdCV_g!3p z>qQY5op!}coXS~iv+fovC3TL|?gu7=HGbo|g?dMl;T6?ljZN-q9F`C`D;zKo(xs~9 zUNV%e;JFJOT`84+>`C_;Yz&}6fyQTMjxl^~ope!zi;c*y^9w{kf`@H{fz|T)({pXMheJdZK0bl8CDa4p0F5GTjmzUcqdHMrkP7VIm z#rpY)sWtx>DF`mD#fyG?hMcUAgTtwvey>=j#pqwMKEpEpm7Iv=xnQEtJU^^Hu5 zStgqep=RfyS`x|T_w6K08msT3^PE4V*N8&4MEe42YV1r=PpB=1@ts^qXYa&&FSiI& zH${?3UJ=SgE8a+T9&b#+4X+<7c=zIT(I2Pa zUS&Ld_oDQr{I?<)oXjERo|iIW6M5aE>F%%gUb7Y_uGgs@_BqmE`5##u%>APb6w8ia z(=qX`L6*Z0z7S|76FRaru|Dn0HcUQ1jjyyj08NVkOg*F-U|}ACM^fXEG#&j`#m4}< z0`i=bY}<~@2S6Asn`*xfhj>Wg&DW7-^Kx>P;Cp(`^7&kyjq{IExRAGcWm6~BqED9R z3y(?nPJ!E5AKl1HU*G?`KHRx4>K;r>CsSKQns7TcYy$q=3s}WcDJrE(SwhHh^SnkjG7- z9^YM-+^O81wcHI}FlyHqy-84(a{vx!pmCq5&Pj1UJj31!$@iXmeQ3FwP)*N)P-wUL zWD=CUh$oW6${#>mz!}orYN4s&2hdr~(Jv*Jp-td3gwh>lSJLdb2h=0V3!Q_qPj*etS?!P4 zF4`Xp8l_;`KTCW~Fsbum`tZI5)?@XdYk=6sq5@gI=_x2Di{`E|>1L2BDz!pv76ppA z9`#W@cl?%$SMZPhDIl%=fTsY8$vEB)E&f0#90uA(XGs2QzIX%8`(t$#?pt{(Q=q-o$zSbUIz)vx zAf}fRXHL+ja1`m@yUlrh-xF7pEKwaEn2!*i*WT~7kA#A zj1GTxd+mdN3sPtIiPc2Z!jD5`Fh0%9}jYkI=EFtq2eKW4Ceo z34`obfOGsstv3e{7ZX;HxSGEp6}Yl^pH7DZ(YW_Q%WICPYeG;%R_*%-onKFn%a-Jj zaw<|ohAh&=Nl-+Sqo==?DJOhAejnES`D7J-f4n(tqJ~e= zh1~86Zb6yhoqo3YBvW&YlWq_3|<11pA@X?3nm? z3L?%gn0YJJgz)x)w0DbF)H&L`CGDh>M#TLmcQn_`h6#XXoObf2p%bR^4e_e0>({N? zAYPn!*@~1?IOp>ruh{vPHv&k{uiM~mkf14&;9<+lu6v>Khb8Da&|RPV8&aIi!Hc#5 zksSmJN!phR?+zle$$w)#ivK=?#B`)GWb0Q`1Ghts+O{n8iRG6%(4~yxU_i0Sz&k&} zEa5n~_t_V7S1c5&GLP3sOmgtXz9v%ZY`wfc7#3ZaOqfxy*a(d{$EdulL5UNbgqHX3 zdG?a1AvK;(Xzta$at7eHCEF6rVFZPVRt#DCSr!|N!V7*kS>^lIuhV1|*G8rlFmB`( z4^SK+^;BdCb+po>{K%$cRHKFg0uW4%%^>}(4Yj8?{rRql@KbGqy|Fd?Vc(I0qHJOR zfI#jMmi_%>DK&TD>5s;^DkU0URM?h6NpKCbIhdeNe%*vIHy?Cf0AD)acUFEvYElqY zG>MC0E(B#`VvZAS@MB}KN_J+$iZv}=j9G(=TT@U@A0qK}tWf8gN|tt<1%ZR(qVkli z2%?+e#1y=zLf_@1c;LI*0T)MB0ePQ7;TusjZgjdrTRIC$e{{{m%07k1x2GlErx3`% zjn}Nq5l)PUN|D+oL`UXHs{?@a4s}xH<5d^eUXLt0WABzHANV-_ZUN#p`RQ)<8)&tz z$1Bw*yHw3#=K@f+_eVrhAD(X(aYux3*^FBtEyM#R`kU$P8bgGBLLSDE0<1MDxi>7f z35*kTJv?h-6W`Sho!*g7e77=U-D}O+|1cjX*~az2mGTSC`9v#XD-iiV^WS2N*4wND z_<*tfN56997dqdF$!H`CdN-@=;JGXLpCRHZ%A_F?YF2*OM30F;JR#1Rz3qf`7skHU z3=qi2J4wnGr*>uByRoQ@x6OTYn4y)P!cNt4^(yLC`P;p>hM2cc`8?}x4jknF1yW#UfWWaB7I?n+82WDX~D_ou-5x&J6BZ^B#jNWNos z+@E-$$m3_d0<2+Qns)G;2NeeT9S5R0)hA?0ZLM~_Y-n#FGHf4anU>0^^C*10+H%v} z=mxtkw=&7$m!?na-FW{V}LD%RXf)q__JD1 z=o$#PPszeNniR4bwMu_9S(a6+b>jH%5`Cz($;f-tSSnD#xG;wXy}(9+PxG)V&&r!? zW?aG^Wu7KFAuGa%mhRx-svQ>pgram%xE|A4?)tP91MzbHzMRL#FKkTed_6m6qf$i7 zFX*`4g|I5B8MN5$b77X>5yCDp0=Otr>%Na@krEEPW`XLUFt|ssXx)RorzyPeN!mcd z66uO3Yr5yDS(!?03S%@1(pMIJzw${^C+e`;(IWM?QRTnc`9C1}vXNsDa4V3pLc{%@ z%Cp!oHnHg`b(8M?gxi}b0jLBSGhuDciT8@+;cgF*!}?5CjX{h!Y2kZbau;|B)o9ZZ zyOM)vKK7_5Uwa@ci(wq}cWb)0(@2gp+2tQpL6&VEkNJyV+U*Z^RW+vhoc9*+@qhu( zWmL6|uU%t*)H52-xjUSAw|0Q@THlgx8y;_d{cHHWus<$1GSj(lxofX(J}?kNFg6-c zHC*`EDIXrSexKbNtZ`QA6D)m_-;~t*l0m!t%~G&Q8=JITFWYc?0DKF)ojtz=run+9 zVUJspa?BS?EVusZ@kqg>U8)%;86tS+e^M3LR9Z%g>m+gcl3E!pc>MZI6O#3y*vog@ zv)+zH@5%%&fFzwil==8R>F?4DHt1;KezvnzNqs~LRhM46)zo=`b7ez=6F-4!-H^)V z>QkBFv8+jj?@K#)F1NPn{Nh2#CI8lZLrt!Auot=4hvBj}=$E<)4Ak3PM|7k6PIxGJ zf-$uGnZJJiatiO|QLnS3+2DN-Gg06IP$es?zDojJLnBRmareaHHyvAU(<7hb+Fnt_ zgQm-fDYFbo1c1*pZ&VT{JVQjTNmldU$dtJ_eN=B6Xr#YnwQ=_#K!p3v0>&xUF4^Vi zNCBxnB`&QTqzWCkCN-hK`;cFhVt$oyYgG4kUpJW$VFNhoU)>PO)Dop@7k9jfi!M10 zkh}&p)+5Bb7c&c;oR+f%)s{^$0fRUB7K1Q?&CX7PliiMHK^*>*Px~;sp}Y7Qa}WXE zus-|I`EFS7F4rD=JH8_ffi^yAd);$4q$lKNt1sgCl&#?);~s&(-g)p`WR32fSES$Qg9LwGg#-ShUTU*@`HRA>^b2~d zv*o!LCC!=m#aU#9=|&|V9Zl2R_og4Wv3#(`(cwSrT%l?2vPIbAOY>fGHK81h#6i?@ z5_laFTK*_l^ED)^4Rgn$ZIJ@SRgcvy7e0pV_Atj=S;65w{XPG})0ywB#`*ipWaT{y z&^R@jMw|;f@d+d*?c%P@+Mk^?#}7Kz_d|bdx9f)Glhr(f=ufoj0fam3P7$HLXKexm zhAtFWi4xB0RWB3{rU;xQsEep~eLb-%Gas~ON4-LV*2X)y#`WVRxG3US$PMY8SLTz4 zy$Bc{9=6}Y9ic;pW$j3~Zf)jLGe$(4-98{@Q;V3ug|mQ{R(Be7tW1pJV`EivH{C0% zNjd4v3gN-lyoR3P#?YAu8W_ymUy?E^o)}j+Ze-mMg==-uJPnZI`Xq<5NsA^pY#Cv*(KT9yYyFI`7Y3-#8G2ZR{aMN zCt36}Ued{m-jECD9~JHKPC1eplk2ejXzAc3_WiO{c&SO!<2>6*TphR(_FO|hxLOKh zB)B}74T3E7_4!*JW#BXal3P)q7IDU=iT=Iti>95W3m@tYn`hV;{DdvawIDzSyFc@_YJk4dk?F#Z$%|# zk5LAzz^{Z)B?)jAcP+jGB(!KfPtTbay``vy7bvv6m%0e?8u!j6!5Y&hjSA&~mg1d! zVW~qUFEMJtyxVTNhW69Tg}Gm7xeE??;mu$J7eYyjkjkD-d%3#=+MfM zqz}RR8oO=+{a+UuUp6WhU}Ef%g0m7U6R=JYlH{~ol?Wt0Q$&LD)IJlNtJV~?_rAg= zt5hnHznA$-i0&K^C0BHj*VaTCyQob`p<{;G*w~v)jIw_Z+I`s?Xpbk%NAzqay|@G9 z8~r9;?FI?Od*JM=T74y&1mFHT!y2V8rU|i~#Pok+MH*k)CTvf=PULdvRY*z2E~6J^ zIlwVqQnKW)0)7v!o1^LX6i{DK{-Rf#q;VJQL)G#_nn+?cr}@d&WYqSn>56Z-=J=&q zvhZ;EFlrOxkVpuc@mhumsx-uc^#HlhsJ2;~x{;{WZkXVTSV5vOuYVR;MaEw5vds>e zvxp_Z(ui|X?6TF`4b`0!-e@%~s#dnj#h2cmv_4Qoz1 zLdR5qRQVNo8Ivm);Ay*}adiT{wWC&B37`k7x&}A;2120TpEMQ5=pd|%nHN6Q*;U7c zp%qvA6gf@!b6E@aO|Bf;X;N`y_N?RABp}m)y)=B^&q3dMxr1Pnh{xgMY$Vitb0>>w zF$JLE*VK91JMZ19xny1GS3uG~u=!&R1z7s3O-D6uMy>B8OQ>6>R>oVOVMu%Hwenfm z=y+A^@K`OkRjU*u6n{)!t|b?*EB~T{=5L2wvtRlo%1koiC>WhLu)*mmhIpn%!?&Xp zshq(t`fJUS6xH3Ab>P#;T?pEpmp1O~b*x>0I;WI}v#d}0`Jkh_d2me&BdrJh0=3MP z>&@xp$=6P4hlQn2;)nXn{^E~h7&)b-m|JVF0_LnaTM2 z6~t3NV@^FjCw;&2hT&?8k2%FMdDpnW(i=#kyd-}#^gF-4`5c#~;MdKVcbD+6PI}UO zHF4n$Ib`fm5aAMCf3uszrSSJuSs?NH_g7F z2cGzyrQ7nPW|ccdw@|f2G5F*TM;MT>ILR+ixX!&MM$fSq?;c&Z5KI~g#gNw$TaOpy zXq4&+qp$I`pMcbjLW>za=8<8{A|sc4UJ=^}6YzMc=j7SBtvDGq0xv5n0+Iv`)v+rm*>;SDN}d?}Wa9{s#O57slUBj#xpYXf>E zPI3Hf`giKgCZ8?6R4coRO__h(wQFo_R^m&r&lq;f|ZvPd{k>(4pkJB(#mo5xicC+CxeVCim)1Ts2XOswNl~bz{G{LokMb?aL3bCCzZQ zD2I$9aYdgb7<8S$l4nbf^aj!y*vxo|kk{`rY;nq6-uFy(g{hD=r}Lypi>AlnPiEyk zY^Aj@rPOK^YMmaBJpl@Svc?prd?m zEny%wfJ4S$yq3~rd4;Und;TTR$GiH=(PkrIET-a|MD7!=UxWmC=U?K|QzS%P)jZDKbFcCB9^Yk z0=2X0?{xGaf?4SLXQnsOV=CQ{XIP=su@7$?3mcnF*svQ@1$=+sejo8h*?;yoz)5Wwnx0QagO2$m+T1XJ8?`59SPvyK z;-Qy9V$D%H<|&ImU_G_^=Y+NU0vGEH8X>S}Ex@drYIyJ6?-Yk)s#&Yw_jE}63|#R4 z;GQU={b=XIpb7dr9!(+yZsKk>eUg*2T&AQhLYK_)QKVyp{;mxW1r0xmK?^(mRz^S{ z_^)1tT{N85Z}N$4PeaLg&|s_orEcOTbKX&!`$15m)aZL|9S~zA1RWI_uIM`Z_OJvOW}T4)@IsG3AG-huBw}Yz z6%lcVG5>iX%O3f_qInfB&$bK2qR5L&otVI-p=?0<%4z?8g~wU;-a`} zyJFoI0Xl!=(q+@fy|HjJVeRd&P1vLW$LPEDKj=jjC-UEHkG&rEa{7i5GH>1iPBl3w z#^v54j&{Y_z!%UFj5)r&!8}fekjp&#lbf*02@mPq9?KVT-mXiDkm0}oy3rS*h$kF& zI(6YRk_TD$|B(hq`>j>_Q6Q3Cv{11Ia$SPOw?w2pHH74L@1FOJy5WD`hyTbIq6`N( zA$DFy!IS^@SAa{VoUl-)-cLyVx5veQ`ZQ?woF^hOo&WnQY7Ot@o&W!h`TzXJ zC~)skmHg2R1k>gIk5B=U*X@M~VAu#d9O+#oO{Cf(*``u^xC%#Gnfz~K3E<-qRyN4*{V)0qxlBVi%sVyK4puW#@W32eB= zE>E}T*+Hh8^2No)9_u||ClfbMF{{2HF+Ml6M9bE?ps;wr67(c>$1+93#sNckM{5gc zfz1Hsk}SOE@9+2Q(>riIOz@eh>HhkDy~qd(2_@PU6S8JtJDkVjY-$sXq(rTduSCP) zb?s7Rv-G+t=t7nQ96Z6%y7+OlkbX0ec)>h?7Vux+{pVy&uLQGLMDL zepjH}_Z-P4%5zPs>=H!6RPkQ&fwkizNjKsp0btdDL^Z{C#TxI%K_Q>B8=QXLo^(gzJJmAx}fkWN^;U(iBDPauoruild&DONRLahu~Bkuq$i*Hhi z``;W3_kO^!P|lSjn_o#!0gVA=e0*&irW&(xjR^7^p^$V1HbA@=0ViqE6n^_|`zE0h z?)fHn=kW>?oWQCaehtsH`22^CfYO5RYke9*ZfP9^><^aq}@y ztW_>kQ6{|DBf#?Ny3nv!+rGz1W*(AdnFn8Ld;vC0kdxl{XZv%{B-5-d!_LL1b7jAdwQD~M$o z+kBhriHl&IrTj{#2G6c`vpo<~qwGo&U9=+Pp;RO2vU0bOYiweP+N}Zm5~fOnljThj zmFjb}Kzp{pi|GoJae?AqE`+rVMuh-C!talmY>tHK=6@MGk8uBxyfvB|Mb^p9L{D$W ztx}RYw@iYIj|BtMBL7WtsS)R-?IWohAft>|P>Qc*Z3l&Jx!QeAEe}!9uv9MAsiNOZ zd2bge6W@pqT?N>PJdog5xRL74Y2$}PE12+#MI8=f?;f1+c0#66VUgPMod0Hky#SEd z*OfvT@p=`mnRP1jIyvl@S7CJHbNd?wqG1GuCTX5x9F{XIg&^}L5mfnaL3~kkx zp&VGNj_7id#}?hty*-L6DJP9vtF{;q6;&H=pLZ=l*fvwkzc;3vEnV`a&iB*=lk9~xYjy6hI*d%09sfQ$N1lGFcNN*p4wL`$+3j2OI8U`C^%7tKf4O!mS~6lHmq*_VM&|+c ze*K3bF?J3YgH}#?o#ZI3*=lbz22)>#TE}HigY&-1an*PkI%@o`%?-cJq7c`wynk@H z?}JqQ_ZM1pfplRI$SM}!&r5*HrgEy&zU3+ac5Q82H?sy0Rl7&+MP6-R&Q!gkecZ~( zGpF5AKi7L?+^-DKEQrOqvbD7}3U03#-;*%y?Ss>T$*x^($M74OMw?vhnq!+JoXO)} z-l9>5ZDx{6hrd+?pnlH_&-A>0wuXB-T)VW-mKrtu{ z=G=p^+M2JAUYuTTmwZt}^|}`+^}#O+=x9ch5S~H=|6!{=<$a=F-2WaNcLw!Gz;p3h zrH!84YVYnG1RpF>{OCtH*`1x_uf|`$#~7Bzav{{58g_?Id_SG#HJ_nw2GX9wt}w#7 zeV<1Es%sF@W^8plFZLYAc0y#~&B5P}E1!fCAEpPoChBd7{Q1;DgjcKonkEy)ZBl*o zq{wvb$wX;A$al$o2QoG0Pd|e)-Chyl4S>v+)!=UyDXy`FA#c3NEdT&BO;T6cN`Vw-IG|n*>hF0(Nz{ZHtvA5DxKM=84c8U>&_hJy}JfRzoG- zY^|SBD4x?oHem21eR0%#yRl@X)SAgVBIrk zSyh>!y*foFPm4Fb?(u^lMoOUu91WMz4Yrb|r2@I*gw(3+a_AcSFxf-k4%;1X*oXNF z(`C32O0e_^E@`#Oj~<%vza0K=zTJQAZPNdfD0cNByr%ktE+ARGHFp*XVZsk{kyQ)M zrRH}#v9ZRq?{9X8k#mvarP}S9s~PXlCEBDt*xou^p>V?Q+>5AjPIs})Eq0D*#eg-c zpu~Tx{DB3G`M3$)G9!Lfjs8d2hf>m>5WO@&zUlcq?L|xbL?$_pjtm$b+$HUt3{Zp-m>%e;iA1!MyB_LuGNPsczeKYA=vdz=DUI)x7Nff*`(2wH? z9&$>no?w*qMRw*yf|?m7?hp!2^fTd^+jo%h;gty^AUlIy)_niLYXvQ>9rCN)*3bpD z(<|+g!Y0C#t?~XQ2SB0h(Qf93$8>ov66|&?rPJXB{C%gN;SlFWOW8oSXRLcTnOYW! zuk^X+)is?9<$UQ;i@5ybRveY3X*}*nNHK(ZYvi5< z8q8$2(8pJtvyb6VLV_OPs%+OX9sd}@tSykIt)@A@IR3@Gz5{-`gU7=-NzDuGZK z7-ZWxVPvX@XGaW(t}UEIYMgEw?Py#OM9Po!$npO3=Q47}aJg_1|MoW`vB6UtQO#8; z(;uyc1F@5<0uurPw$}mnTgf_xeA>S680X4F!Zn>Xm9#WU3@sfs%UmwXxo#Bks!Q9& zw7O4g$i(aSAD=d}yg10SJr9&7C`p+tR4rCI&!KW6J<_SQjxzXS`Jy&wL{)C_!(6s) z`jx}5J>%r&y$kkIyWYWe;wo<9wDe^U4nq8%&G70V}l z@_>Bjx%v7x>6s(1<8Omo034&>eS7R(0QR6s((1E14RJ0eeA!mo)}9z{rGtB0;{(Td z!_Z1{l$`jDKh_X%OoIl&F%I+x@uo@rb>x2XM*>+bTap}FR^o~tQqp>F;Bt(35aJgA zA@JS(;lV0c^UP|#p8LwCCz9iPgu~{t_A%+klFD4~gC=s`iOuTyk4f8hFSNa-!<>lM zwkJi@NK(aHSL2wf00}&-=@YHxUrK!Q1?BrcN>ErlFlzItnnJ`ReFarsY);} z@(!o>L#`AA_FKGTE4*%QZ%~!>^)q-trfd(CWGS65?RbzBxdib{16E5O-|H-v9M9xh zyzHN97#zkU{0t&sFEHx%VR`AlSf&5{EcXB~?M9DP#J7JS=RYAL9UUF<<@4FEhXXWl z;70O7+w+XxAopV#r0vfnfprf3O!H-2lcwdxGlv6>jbBs6MINONG@ah_sIy5fu05C$ ziJ#(i_W^5z96@u@_gPndz{Tx(;HtIBeQ_g+tkb9Ub=LgXWKm+Th$*8N@MWBW4Dr|l zdc9mi+!xua8yo#1!vc66-~jL7_3>)1&VK7)sbk1({e1}hT&cyT5~!@qX5(V;Md#Z1 zIJ8nD(7Fn(x~=Q~O!tz?S7)!?f!ZjZvF8UXE}Q&8!3LED-w|q|_??`dukuuX)ER6M zl!QZ6%kb@lOHd09sU6vs6Sz!AI@RCKb(+kTOFQrIyE$;h^UrEjH8QPQ8W+(W>>@%W zbH={!ItFW(831D+_KSV?E5-H%fN842?^`fOcAleRg!wNEc+M1_d@)w2CkWm*eqUNh1<98dgCx!WH-3m?QmIB1tXe!HNC+l+a zM6m6(J?8oAP9F~a`fg_)H33ibSI^<+x1IB7AzN7#>8pBktrC<;Ad4Q5|V31K(n zK}Q*TE5y(4_ZTZL@1w+HoeoKbXY`WD&rCe7Ce;Ashrgnte`jZ4rzXuL8GC$uJS{b+ z|JM24(@$FP2mSf4ef}#g_Y(@jY)xT(=UK9<&|QULQo$tckeel{JuAS`t$s^ z**kL1O|J8rmMU}$B}`aTib2H1uS!#P<}1PE)JFu28mo-KgTIZD9I35y!7{h*4nax^ zzH_&}#lE>s0pWjUQA3P;due!t>?cH;zsZD~$`|x&^DN1eqh2=5`i$$_C?k+O~%U zl77oSPPhZ=>A``La{u}*xn@x0@O>GrUGEJja=yE_fy^z*k6m0_TNv>-ZicqvZd07a z#68=D+SXVNyT6*GxlUX`gviW47l(JyBA0-@!A2ymRSih{m>a5JK;>q(hWxh7?bG$p zUmw2fV_HAI{hbvRUhh})HjH2pQP`+z&dcLK561psk&@kZd4tn5a=&-c>Eh^TgVS)? zvF-~zhco$T#`c@puP@P?k=X23Ar)5hJl>D3b(k%~i4Ij3Yn%?+rs18Lmvn~Cy(wHT zc<1^%%6Sp~=VT07#mh{~72>d4qJVtyy>yL+km-F?kixb&>1e+^ub-4c6N3 ze+623RJm&tlba;#NVK9W&DoYjmxfmC9ip=I!#)nVx|DD7N$*V}x>X`M9Dm!$=p9$) zza5Ny{uYt3;}pRMq0Ue&3O#!l6i)QiF~HZ=0`2ej|VEZEdL^r{FNlj+bM{__g7v)Y^FIb>-SH=tN4@Z^gCM6|T~p zfpSs~{rHG_;Qz7r-a$=v>)WWH2!e_Vh|(1ml_r899aKO?nn;nZi1bbfMF;_rSCJ;Y zSLt0Kk`Mwaz4sbG=>&q*&_d2aaBto7`@ZwdnKN@{&g?(lcfgS6S>;~qZr6R??-;nP z&Jc8Yn-s*;G26BL1sbRb^SP26DytllPJ{bK>mqIn>%;k5n zzz(F;Im#VC9s=4xwOiduze_9mEz|ci?7CKEMHWzGFpWT0iq9(ZE-9NYzHp6{wMh}X zXHu(D$n#)3MSSgITE}`EB#XlfdYi`UdlioAqy#zZJjalBDdn-HO<$1L(T$n;LtW20 z%i}$_%%{R54VT_o7L;nvh@|E>5%uwwXirM(_(;y@N?VfP+UdY*$*#~!owJ?4jm6|| z-KxuvSDCfCuGu{B4h2F!FY&{!26p-;=Qn$GZJHb>Gm?-Pjq;X_RYB#prR6sZ7R1BT zg9Eer(Wef@k-Ugl?BdZA%rS3HFdylyLD`MLDUWy$T}NFZVu6av@MCq3 ziVQdC-raJk)ly@@poSSN-gJ!B#ugi+x z47sL}9R^!7Xz_zAOJXJ{rw-#z@MF4rt}l|!BWMfwbHVooiE;#rtuyT9k!RP#8%ty zwmgVeZY-Le{;1eOs@ygVG;$Ts2;Xv@j*sQ^sNfD1O~0F&*N6cj6d7T#Ik!BvR_zVv zf7-T>#8O)H8RpqXIw!!gp5=_S-2%V9s6P@NBs@tVjJ4U?l1>s`1^!d}-6r4OnSJEzXcqYHPrVp@)vgxS=BQ#h zT;q<^RIYREJ~v{4&Gw2Xhf%+)iRlg~NA`_?K4Kk}77q+Semtrgsl8c)0&T$z2;SS& z{RW_#Z3)kGKjZ9b*^ZcL>4e6nqxhoCl}caGDk~OnB4bN4^;``R+)IUH8Mcun(WQMl z#=SULhKWYG!{p~$Zdl!H_Q=uNp214RNXLqm-l!QSnC^H0j*u!54)wf3bY9c#Ml@zx zW~t;>L2}14AI-hf?^ETM`$m1Iu8|92eLW}eqwTi%`!$rB802k%V~?#eY_H7kCd2ix zpzV*o!;SQ9>-UJPwT?WUe;?&&9#!qOurov7E`%1Gntt==s>sR9z!4QkD0;3VJ_rUD zOEtvM>#ZSP2lbjjB_=zxu^MqppVuCIOY^b?mhYJmjmAke)jpl-d172q8=XM-HTBw= z(98#L_Y-$j+e5v_%ONI<{63wyMInAz&MuKoAh90v^}$cA_`BeVG5O5+-r49!Xy>JmNGU#;Hj zuO;yn0qld7Cvi>7bZ2S+UX&0dzPs@XnwYS1KUek;+>CsORX+5Y^VK`#(xjbF=SkHYET(Z9m`YGI2?<=w1*iNQ%};2Qi@L)-Frj}>gId?i%k`Nd zS>WGtIiWrVG)W9VnJ@*Ew}x$zGdadyTiKgdg=ORUKj$UWafZXlpd??!)c?<&GQX}0 z*x()K%rlVs1zI362iiQfgz@SME48JYo!y=Y6^|Yd6z`SX1Wnc%lwJ!-Tkf9h+97}Z z>W{IVlHs@qMn^@R^Y8J3pWsjEGQoN4@Vn+gvFd%8Uo>rTO}$}L{Lvy#VfM7lAJc>1 zfIol6{nYQzf&FDQ{rdx%bedB)+E%%n|5MZdEt~t_eocMq2Cd1n%YSXi-v+|L*Z%uh zuwwsRg#RwW{^|IyB>Yzr{woRpQXBt04*xw4|Nl7-G7qWdhs(R(vrCVFdhh$60For^ zs`@kfJ0}$*c4>d#;N%eva6(+2HXqNO~Ln*iq3@}owv8RSqNfn>)cKo0T< zV51&wuPej?)3PSqwJm`$y2!Y$-27AVTr}vs(@W29Ad&BpdU>$e#D4&EZAAfgwoduP z3S}_`ag9vXYI<(X!bJ_>$A!=KFI{rK|H-KOl{x_0*hWV;pWXm%7h2R5SQp~kK|A*r zUq*v5Uem@$YNBnA$_?Tu$)ov_+~9MRXE_T23~y!Fu?=*&b-DR686^IV_{t~FI1;eXXn^*SQ$ktvT<6!$zvq9J zSJ==~w8jYp<+?q74A?bZ%V45Nx&>MEOg=BRy6NJ)(%Bp@-p68p&(e1DD{Wn@aiIAk zub@xW2vx<_oFyC!7<&>z$W~Gu65##~ z8~%kv*zRmgo%knr==$y;mxJiYtNVU3Q8J-d0uJXegguD7#t-wKeU&ilAbFLGoa!5Y zA?Q^7nJ$Mdm2q*^b-svf%7=DD5H$F*8{Q7R0foCPo(8F3LFwJwqb-F1Lj}=p`txT=-Rdg0M6gcAgK-ZHcF%TgN_0(mtEwJ3b=8gx-3{GY;)*J$9PDyb zg0mO?!@@D*{!Q05V0F%`V=h$g_4}@US1w8Qh}koPtMe@Me>!%LmBv7e6am60NhV2~ zI&jo;dm$McrV_VNejb#!ZBB%$U_H7Y=IA15luB$`7;bd?9fPM_Ov?96be%HK=zD$P zWunJ=Lw^_F_37v$#$dX;96l7Qi(Mc?6+C|YR_i99>}Z)EaBK#GGk=mH^7o3YZt7wnbS*Vj^;_e z-oQOi0Kv0435X&cJLDu=a-Rye445V|+ztT+3`ZlL_Pc{S#ohM)NuX`OSm@IZk*#=l zU$*_z)x1wbR?4H5b6p%c2Sl9jOS2+JpJ;l2Ecae5Q3 zHk?~4MtXOHvj8QhgfZ{Bl3Ijz6i>`NPyglUz#NkmsKGoHn6Q0;<_97pbq<-cmbq+t z2Y9s4kAc8@t;AY)s621-!s=8k=e$+^=oUeP@CF2^relOhjxhOo0Q#|GD8B(19i2VD zs-&z*m!v>XIu->*ecjC5P2M)Vctuy?ZH83nKjR^k`@7(K`PBBT%Cqoya<>yWv`*f`M;{5b`?$K}Nu39y-Ze>|n zx*|=IFTvq!acq+`1&jxbpJo=(gal|lVC9O5T?b-lU!eQ(;r3p@IrfTDO!SZqN>V|J zT8x%ixY_(WG_A;d?`R;7gLC-&ERXgKer0nyw8EIhvAIZ|_G_w=Ta*Vb4-wrOuVT*% z>P*e%x<#ub74-dOeU6Hg1)S(`h8i*zV&puy52cKp*(EO44NHLZTe^8~Zh4jg`VA^~ z6!)XXKXoeOkS~vQ!Y9+VlWFlcO|lU!>2C?TFp-XQP-HJADXoWN(=9_D?a5x4W>dti zF`sZ3xQK!Im&cpF5T%(zAfDGyr^0kC#9()kc%@jj`Q5TLW?bK*;mh&bZW{c(!NT{4 z$bC6g0iAtSp#W3cD}XIjqxrO_O4?u}b0eQt7jy6@z^C>k;_Sf6#Z=g+vC=bw3K5n2 z-QKAnN4u!lJ+T90vL&KKxPdhskAH$-7Ig@7mj-O$-UQo}#_XN^iskEq0DR{1$#F3V zC?kyMO7o}qmD~j^U95=hGpEXe$}OE44>`(zAVD)E8Q7xKZSzh>1J_!RC(G;eP$R6H zb%CvoV`O{tdF?GV!}W5=)gEalk~*uxWFVwKv+`LVr;dkw-)vf_nCm18myb$i;4Rz* zv=2+`qD$Wb)zIYPMF&>W8H#gXCEoV4Q2%w)sTg&pJ%IO4GJUE5`o;CS8PF0fnBAT> zkld`p7J#&u=(?6=+aiWEqHl<8ui=a-?KlZ4--di!Y45gJA^O z;t7bs490Izc5}AonupsOvfnk?UbPun^X+Y7EP#jjju?W!njdL`R02U1Xp>keS@G6% zW>u;4hXieyS9@m?WJ$!&%JE{2*Xz<4sohs+PU{F??nUdsEj-v@uY$`#lV-<>WQLGF zPE8Ma{&xT;+x2R5l3t|Xvf|lTar|d&W`?&}=$zXYHZw5w!QDgcavnmwy_~<)MFhaM z&?qMSbwdJMw}LRT4R?qGXn6Rf3!@E&C_Mcg2g9}jo+7$Mn{=0@ANCo%Y8O{VTq^-c zI`wE1@rIlBNNSy2GMO<9IXq=sKFKZsv>9te}KZuU&HPt|cl| z2aW(VQbOAJ#gkgI1?Y9Rm8ClNA^lX(9Fu6BrmW-TN^XZnlfT;A;Fg9v*KyEDX4QJ$ zcmo$zuZsm;BY=Bv9Szz8rW|eJY)WSoqK{LfaT8})9epmlyUtfp=-xdREGbQ)%vYW! zf-TWKRe4&5gQM_OO=A`4QrvU6Nk`Rx#;kg|{u}ju(6v!8e|!B_pB^(4Pf)Wuzg$+0 zQ^^BKmlA9DCt%}32-=fNorC(AMj!yc{Cjp1yvt;Rz4hDxb3FboV~jignDfe>U5Cnh zvEn{LEtTUN3hNXAfQB(P$FFZ7FXy`Xu@Ne}LLOUsXZvnvmxV8Vj9hnS`+}J%5!)Ty zS%i(AM?ZSTC0V#G?a~HDQ*q;GwtGBasWkT_5w%uENtG|wM`181qhxc?tt^c-`t9+cL`$^dx<=qDnl@A3&Y~Os&@l7VD|hASnkCB5|=VRz*5~jCghpB?0n+ zhfy^aMeO%ybZ3UkKSgE`nW?rDZd};ttkTfZH)j&cTx@EH0+@;38NxHJP4seOlX4S! zG0y&_NEGNb9}692HQkXtxu!P;dzQ{YI!m*K$T%AuzS zvb!+H)x}~rnYXuQ6EYJtgk}vsZb$B(=)z#PMD$2g+gzm)y_n6AP;y}Yc|gY4a*#EY z>=ld0i;8>A<k?jy7twA zCTmZ7DIJRG2vg58u!fGvo2&~?(gp)VXi)3Yx{*n;>%%&AwT!q0jJx8?^_8?Ox%t)V z-y^?PF4e}8>mH?LGt2+{gW5J;$BosY{(?=_R-7a9vwpQ@D)N+u2p;I?f=J=P_vDk) z@lczYmk>iSP~l}8%f^JeP)uIxd|fL)&fOC@$qu#ll2?9?jixWbawgFWKc3*eA{C@J z#(c0E>8VMJHD;2)eiz2N>^g8n=*#Jw{o{CbqcjNKx%6Y){j<5 z<`WIjZlzr&_{+{6=Sd}{U8Pnxj8X$sq>1k%)t{{ zU;1}uvLo*zs>Z5=m?_*BoCeJ^2A(c%FT!Y#25~Mzv+vG2ZhZHPHV%>;8B+P`t7j*R zU?FqiuQn6}KDD=d!Sd)RuCHKmBnMOr%?^*gaYgOm456__#y+w-6xanxf{xTt zfo(jh;4Jn5iO;~H;c{!))>N2!u{%8yq^w$M7!6+tMWEt^ngdA`2(E;4EN18P7^wq6 z{(t2Q&DY_g^0k{WSHip4?;$pQJ#cypn_GseSJhHJL#3&Q7U7g^$HSCJy`*XBwxjrJ zN)|h>a$G*FT>r(n8 zjJ4my$-NO7ap@XDgVG}bR2AXO&HZSC%m)gyX9+LtPX3ki%DP-=HNbBGr%zMrdyog` z!|c41@VKb^j-j_a=-kpv4sAStUAUIP_xG%Bm57IAgVBPfZcR(AuYmavw`uP=)5Ok0 zm`?TUh1)%eC+NE(J2s5$kr-Mlqco9r=)vNM z$FP8Qc!9wURm+{iB|8)T!ycYnvvo3s!-iJ^>T)6$oOLQ(isE?-7hmkGcQE(aVUm(w-^hVV;Ju+fV76d8kBtmNXb2eYAwV31f3$|3?zK7Tii zB^FtFUP?mzbKZ8#M1$ecWq-YXaAn3-t=RFqu#^)4p__mLi~Vba+n3kJv1NB=a+iCnAb19%Bf6u>Z}% zN`Gw4z^|y|$s_f9x#sSgp`aK~;(YElm{>I*@-TBM&jt#o`JvwCAtw~nea4i3e}i$) zSt}%f^;(Je`Z9%r$9fPHbXB#A<$a2kKVdg`&n>CoY){dZ(l~WR3l9fo|Qd1#44|GL0PbSWvV&8@Ax}v=_&~B{)UDix%TlU)v)%Y4| z;;JBOAg^hYl&7)jfV(v_Xj!nd-Uos=u>6SKK8O&Kx%^dBoF4TQ~&wnB*= zTJKVij+7eFTKxKA27WkIX)Z!{dngNn<6N+6wuQi?jBB+7x?Wp9!OepX<+sP93P?D2 zA3+1?jj_{ZiLiKNPrxm?qZDN}O2dj5=dJ@GAuX^P`O-&uqW!_I3#RdUVFul)cicB1-}m7!$=f&?rI(sZ*k_{3JbPJ^7y&-wyTwq z>Tp5Rqc(BZQt{K!%C*qfj8gyfa$x+C0=FNVMULDDrx8c0HSEihWFM7#zoK-#KGSi-%4uBEKr*>g=VM(A(d-7~bo?hiE z*AgZC*2@;}>Ys(*LipP@7aN2#tqJ~I(jR-!{YRUL#-E2?0VnfTM(NrE=Z+Hzv@Eyl z&ue)Eqm=JP#@W}NpBi>ViJ@tGRy!Fcnj6EbzpF5bv`QKoB;Rp`K7wxlFvxX#VzYLh zR6e_Fb$ALn3T(1#H$1n2Q8$UUOCp9P9Q$P{!JjbvvkP0v(s|zK`|D`@{@*248CkWV zg-@_ot%Y};@UMzDM@e5$lb%a8j4fVdhtb%F5j?Xkf^_;xHdvn&+f{2d=(sRdh1(j_ zXvD@#7;#O6|Cx<`Nk6Sa{=7%E_#Z7-THp_XhHdu7%4j}N~Ltv;9-&~6)^f@s-_c7 zq53wo*<(LVBK2(;1H9X)!{lQx`jm8Z%IRW&Yi<@hyk^l5Ka|FZbyA5Eu}z45!vAi- zd|`0jH4lVY6R`9v;@sS~pELm0?Zar>5=&^9pfDjr8Tu1?4*mYDC}`Q?OLuAa%g#7E z$w@b!mQCX7T>FKP?J4MhZIbgmn z3%lE==NPbrSau%|=nK%PofKZf5%>#g5~Zy{cB5IAlJ!NlCe}C!*N!3i>|UafGVI5o z$)#maf{W!Ecao6>(C&_5DmeK-mdW+{SOF0Y$M#O`KDr zWk*VRSE}N%X(^aYbIF|V*Cl{k_FR~!f@f-tsrWd;)RdbE?25h+@LOosvKM<#K z!Vim9#J-vyB*1=NaE~G<@y(AKz!NzrL8`8V{_|p`dxclI@>s8~tsscQzB|Tj^Odxy zt*I%w(kytlMDfd&0QLl3eHkor+i&1!AB9CXRhep{I5b}kI$N%^o8SvXrsh%pp`Cal z-bwnpACegcG(C&IDVj*{1uSOUTb%Ns54_^)qkx!dVaJPd1%?Qua;!7%i z`h`Z%I8K2;dXvOLV&hvP@8m5hC!0_V#LmXN)B_|e%dd1DHY442C_UGTdjcSCwv3bE zLoV45C2U9ZY}s2TdhhTB-+uAES+H%jw{aGvV3vR-)$O(eBGSi(Ch~_WTtD??D{=!~ zBLhcJaO``usT50k>=&VK{y4JCndM11u58HWRz|$Dj-K4kT+Ub%rETRVvg;Op_ItGh zSKX|#V&e5LB4*sV_|i6M>2BTiwhec0HN*&PXUPw?V$jwW zO;<7c#w3$*ekT;x9|mZ6H$bG+!0Aw9M3D}uM9XZ*sBW# zxtDRg*vQb^^ZTp(fk&oFqG62X`W}JEz1o3Pn*n1b zP_{~A1?Vk|jYJcCK@5=M1N!F|8u(;A1;l>q3k|<(&YIoM9?&{sMbNQT)RfX0H?WeD zNoFtkjTUEtO@w25(7o)CZnfPO(W$*m9}DjBGhc6^UHc}8$KvPl_0Rso9&UvUp1Bxl zq9@m*s8i4p;qN0myy;(T+Y%^8fsyBB$gw;+NXh0>wNZBzVa`cnWfsBfqpr;%-bky7 zOl@t{VNVXp@^jBsGFv~6pD&+Ips|wL-59Shfe3i6b}Up(ii|d+ZIUBAnhj0JDAo>0GB1iXywCY#luam`u!!>-1Gqhg;CQc;NP5NN@5r0>1PJrSt)V% zTzL&&Y|-$2uG0NzGcdUZOk8)|&Ja4h`5;dA9AHM(=e<=~{yYZvD`g0H#-qqj-BJG3 znp3^#jRMTB1(1{ZK%%)~-jekA?9uLY0xXhSs~2O|Eoc5rg;)0|Y7+!dBU8`Lf@*3S ziC2L!?Fd;}7m7fH?I>P1R&u+Vl08a+od{j0HqH0gPCeYT#4{s{^d50``&sQ5upB6i zeYL_1H*yAyH0y49ZV(Y>QK|U`E~qoAx@RMinkDDaTx+T0w0a6di|!&jMuXe5ZFgko ztf=6t4Ld=|TuFV8Z)GmN8-#jii8kHOfBG`Mk+WuH(;RCI_c88kjb*g*H6wHclLM-b zQhxyq-6kT68iS7FYLW-p)nalB(GkRA%g83T*G@fWkXw_pJVBo%xe9{sH`UW0mBu>0 z$`Qw>E71!3vAIQU121u1(PBr_f2!)yF1_i_w_Ff(%P{$lob3v9l*n&! zO0TclFjAG4moV&DfUuo-KUdNwwasn|0T*ZJOhWKr88NnqcXy51Z6?_djqf)J8Feet zG6UYxuYi;{h=^X|a0F(`zp=0Pt>Ga16idlI&we#cXS~c3S|VPV0Xr^#`Ejrc)+EvC zF&8j19@7d?o@6;y&&5x(n;%8b&Xb2fikL{5k?^`xCjpB6%458Sy zsiL}ND4u#^?mG$->r{Frbm?;B>PZ&GzH3&mdSp_9ea~Eecze>Fr%=u{h*_j{ez3Gj zx4^N(XFAfL(MCT%fV82oO1U}GYTvxGJsNZrY189l5`gtsAJBi4Dz5|}2h-6R2~0mI zf(wvyjhW@WK!+DD)H2&T7X)B(^h!tiHua#`(ZlBICbImL%|9U_QXnS*no?T0UN-8`PY8ax0sVY9Z*Vy0)0w?O|enl7YGg3vDenuMXCh1}6G!F1U2!`m# z6XplLDyF)x`7*BG07lMouetmhCH50>JSs;d=3#iT&nTSrIS=S=H#(H{>v^(v(etTJ#ZNd(z-zNwywElM zIMq#$)AUkDPbS%#IMW2m#m+ z3qdGek3VVlvhzz2N`0!HDu05MEz!cQ8Wpb5=E{NU$ExrK0tvyja-SnLaM6+Te#f4m z*hvIRlZnEbm={WKR=K-{3qV@--PPAMV36Z|d(rU5KN|N+#UA4_MMhb^d(tOqd8uKO zS*@m0k2O0Bpa0T`R`V2{Gh?ROnADJWN*b)@gi1FRAd?%-e^C(4RY(~4qqfpud8-2{_%h`c4Wla-M$)yfWeqTBbhZ%}#Z z_N6Ub0R~U^^_@+5aMX6l=UR6H#ql=)ON}1_X^8PuF1&?Ow6>n<$%%BNWgS0ZnGDmi zzM%;T12TD@xXmmoxz>Y43Up^o#Cy0eF8TnMRtSn^I9|`~0~}Fa)r=0wbk~&#yjXx?{)(33Rz0#2 z6pGETO7jbbe65t&`N`R;NFDSULJwgqaQp;ZRi${%VcMhl1Nu|iPG(Xtx2SM2`M$$Ie+KY`Q0pIm=l$C`+tVDr-0di+?ezC)r;Lxb zUs)(R4)+4mV^rQVVztQSZXawzC|7j7K(^zHGj;E(eJFj?I|YmblFuX6y){8phZByM z4$o^8{AzxFo;CuyFj#XUe|oa;?wjNGwId@dkGIzT}HVP5sk#QyzcLchEc(^D(zh0#AC${-*AM&}gdi<}`I_ZU#^SybOUI|+_p7g>Y zL3m%Rq)Dsv#wrOtN8vMq=6~ydAq3{1wLIjH`}P1>kaEgnfI^&R*dHXdO)GaC9#+Zb z{R0e;Thnr&#UHLT31$lFxd79YlMb6<3?~}q>%B0i|7|p&9AAgz-zE`zrKlrlS+^=+ zgsKXIq?jAu$7TFoFRNnjxNa@_>lC=B8p!h)R#u!n96HCG=(+WF<;Qbem0OPr{XbeN z_jZvFfhG|2*y?_Df;shY=E=zdTJ!iT=W`9vFWbBqF(Si1p@L?r&WbjuYcW`mOqs0M z*?6xM@zb_6I5GqFn5bRtab;gSbjkv+Lrm{-<3E4y?*lqjLaTcEt68UK9@c@B`60gT zU-co?Qs$la_5$h(HYa&<#MQ+CdB9-n)P@wu)HegtA4_G4rPnM&^iC@(A0L`bXK4<& z#yDQj#BvrddCqR0if{IWCc5I_I0M`OC6wRQT5ARe%@?yNLjj-_;+X%ssK^(8MQ+!R; zXC}(8#b#>@^vhXI*j`!QQrMLur?5YJkw74^g$p~lPn7aMy}5{as{5wCINNt3N+30W zoa*V*HLIJ8C;;lh-@*V7=P<^R$d;nCw97l?oFGj4va=vpX_ivO2(H{0>0YGKx|=4A zwU7@M@x(D7;$d?l)?($0Nj zN%90K8>ntvgKJ+tHeES>5HFw@8Myn{2S)Nvz$}yv#YY}nFFD@VblAd`&GIq-5yz=! zdsK0rx@nN18jJXoygu00EY~M@f=ySF?BPX<*V@iSWenedF+f^>?pk;P+^=3+v<5$ z_z#c1M?(63UTTWuhtBbc4QuVZ{^7|VH^a-IzI30d{u_?co9$h!XA z7k^qT0WZyT<@Kmv*5W>B=53C^NRqHKzeAzoaBZ@c67loY^VBnPe!$*cN20YDR{+_hq0_$6Q2%M~ zjVZMG5{B2E|7~FI|HQFKZar9Hj|wk!A8}~nRVL&tz7AB9c3qB~n*W3Xx%&lR2HT>z z_k5&%KfICZIEXINMC7P0IoBoL1U3Sq zBLWV_>0c$aJs-*^_c6}(lq&jVV^~8v2;I5%`==fJ!5$Th`nZ_tZ*1$qWZ)MswWr9@ ztN?qh8Q|qwfZY|B|7bcElw`&LpmYofXT<`h$*3zzOpF&!D>LjZLsBM{6X0fJfezc_ zXCpx6a%P;fe7q?DGq!Z8(Av-Oe%!-b4~r>+YRlvNcVBdyOuYcJgq z4Ee7WQT+M@?tSJeNJ}>~HeS!1ZxA^~4)lyrq+TcYF@+ze z_9t~o!HaJobi7&Z_e%fkk$WD{AKL|fef$WhxOe)e-u;EI-ha-23Rf`89y5pi)Ybp_ z<9(Su5XEa(Ks2LmUC)xWC^1 zuXXTpb%+zC{^R8TFNQAj?ik1t7SY_X|Ifkwy2cH?p^D1r zr%1m2zj*P#PA(XK!)Y)#7Sq7LtjYiRd%^!>Y~p_yD;O|*VlM+4D5&s%vK0bgi?2D$ zUOoALux1WmZd`TIss9ICkroBEm>$JJPx-%Hu3xgkAqwIy|DTJm>cyJIyMIdqyyOgM z&6zO(SWr6%d)S_QeN;0Zi)sPz`)JK+*=GkCGgCNl((6EBL^CL!7!Kok+8K6L?Mv8o zjYgvK^vXl$fvmnux^d(Cb-}0Tla%RJ@AsY|TY2%o@vl%*{W&tpMc zPIe49f90dhA~rX+KxJ}o7`IldwQEA$5q;6j%85PY3c37dqYU1Ce~v zt2+|Y7+GL+{mE6sH1^_*hL5QSK)BDv8p$$a+jOyXc1*E*lxxl}!Nf@V`%^IbV`r<6hL*{p?(A=^bC{_pq3$zOWzr zC`cu;6UmRW9?NAwT%U5;Rd%o%$Prv1*nA^5wW!QKdf%L8(O(eq7sx}981M2gfYYZo zT<@>d3ZUqY(aURGGkO}Tla#fsdEk?rx^GJc8K?wM66AOk&Y)my6G-8(I~pm|^6jmg z(iH=Z)?W$4q)Zz68ZjkV14r^HiY&#Ee~+AsBiNbTEi;!-mw|`hpyD$@RdPZ3HTkcB z1H8l&GBi~NWs8MLzI!E}M4e`;(;nxh)SY;Ud0!;zso*J(Gp^0}Yvd-;%IyC6TrU~1 zWAo+M+LIkH(W}~EtZw0I ztVW=0<^0_{=qtv2m$~+@QJH-5XuXVvwF$alpy|j@HSGKD2U6E*C_@|G!<%yj(vVFW zc(GSJ0A>jasoEtC37$$!U3w62r$iv%+YD(t`%|6J=b*z0xoXvqvK?t&nXWbXa|ME* zkr)y;%hNsl@j#(GlY}V)t87V z!DZ!MJgSl)e=WDa9QzA?)eY>{o*f+nLPjwlh0Y*(sP){z1ct@D=E$?@(j5EdyDc{a z_BTX1Gi|Fw$d$?hPjP!>TYoZ1Hwd-Rdb7N*E`s&oP6b_;w3^NVo8s)W%U`Q_lN^M4 zgg}r%m&+q1efp4YiexN`-MA)$g?gO;f|K&2Qz(q zr%$b`sk`2vHSn9PL{7G6s|q4SpWiz`uwke6JUJ zY&#P+jx^D%-L$jY7pupbRlTRJ;xCxc%+WVTbVP`TH$5CU*iepg@-j~&98H6yn;T1j zm#do|*TekB?INFBqa0cKK{w60Y5?m^0Z%Die5B)IMy2d+jHiiJ7NW%Pk=vg8{sI+DuahpGwM2kaa9LN3HwWUjNpLCyj=7wC|s--4P`yJvtM|7 z<#G0l-MyX|%A3mTcs(+__<)#0#(~0$Sk=q;!F_f0HWS&(>SyJ!GY2pG^+w>?1BX~d zVOu)zSZl(+hS)-JFhr;S2SWtBBV8@_plIyD|0~P*=Wzcxn)eHV*>%L{!|z2nIC@lY zkkRD27|Y^%b=132ysldNxA0QkCa2IKBpG~dqd9ownG32HPe%tIR6zY+XdsYCXUVpv z`JEL)GZg1siQtnKbW4(W{!Mpkd-2oZB>=MsPt5(dbpNC4<)$?JqPAw9B&SO^7qdY7Q&d}u8u<<*)fbYDWx za0CCKC}H9+G9Ie=a4+e9@+hmBOos!FD@D$82Z5*{S8xqT{jq5Cy`!OF3;J5&i->n27M*wksT4BFJI0p5Ip~78RQ?*FXrlt zP5qN`<`B661^u@&;}1ixnNWJwj(G&csi59?Bp)NdS6Y*;)BItPWcr zm~IZfpb`Tj@*nAI0Gz00byjfrW)BGQfO0yzbZvnV50xzcd(VCiC52kG;O)b4Yi*Qs zUinMj9{aG*0PZOC8Gc6%8=QMpDmZR%lCp-$lAuXdT!I= z+qy87S6g8}t2e65VS9ycBd*g&dl{y@bYQ38O%Vwjxq*=w@zK*z}(ybPjA^8Rq+kI~`QF)Wasa0sjY|n@AL+Vj!RqxXC z@wB38;n#G_-p>w~hi(py4$}7*?VPuiShgP@ag-K(IX`QI#b8?_fe)eQ*wV8X)k}9< zvzRJw;)7J?47I%4SNg%rK#Cvlo>7xIc&8mGbZu?>V+dd{_fNw?M(Om`x8%sT31Jze z@1;|VXoPDDZRpueR=X;)seII~N%z|9Uex4+i4)}m(!aFH!TXS27~S`a7d%FV|)u1|BHeyRnjRBp9_548KQyT%oKa*YWa*_Wql3Qz<=ueTOJ;XOzP z45FuT=iWv=33{C19-G*h?)IVb_qP6z;isf}DzisRFCJMuvq71t^a>cq_W{(N$zH{o z$OB;8HcJwQtwGE3XWijAM#D$z&Urv!L_yf?7YaVCRT&&{r!EVLbzV@!m;>4mm^&rZ zv2=};SPgVuIq?c$DF`n&eliY2_Nw7&rFT@5ES)8J@SqIMHW8r4TAl!C*n3v-R?s%Y zZ;CLg#|pU4gd);pz_=WxA4Bz1Q5;Pe*pBuf`uvexZ_HT2YM3J^u;Lhm4DM^ z6L-#y20347x$BCL5}<*tunrM)ZdG^II8z_^8${UJHbw?5dKPT?%sn5kgPHC0 zJ({!vEqlznGeg8B9sy20wBtX*E8{^cdzka6%@x?q7=$_&Nf`|)Rb%LsZ&x>bdaK{E z$HfQAn!3#&Pd%pBkp(UxlO*Mzr;qGN3eC)STUn)Dzhnx?d%%p>t10|XuHPq6tZL^C zsQz52DnQ?ql>t+_77(0o1^{)_;^N|AneFuZw55-x*i%n32}df4&Si8* zhF4OwGL-8kx$W}(x<)-j>Sn|-t`k}9m-vL>DNhPcFYm=8K-q(N`lINWuX_B1YhL+5 zb2NZLxGm(0mG9iORD~dcf{JB}{+Cef7hnHo$F>ubu4G+`?|AbFXe#`iD#JLT#aEXqpPi?PIq6h+~Y>$2SUb%5;f(Fv-EZGuJ& z{4ixSsNd>;P0>U&zeO7Jp{3Ljm9q(gKBY|rnZl5599g;d+HRJ1(Z((T1!@I%u|Hz8 zpc#na<)C&yY{>a~{QA)14Nx`YKm6_Ho-EkHgQQ|+j-ppSz`ZASiJEy^y!@z8;S)!8 zAn(C)sr}pl8H3lL){lP(B)V_z73EIMwNEk{xLkNyIE)F!6QCmlZO0m6I78Mb!*Yj@ zn*dK2kh7b_3QRUppe)<`oO^Zw=pm95utsvw-Zmmt36v&{egVYMj=823dt;y`-$g#C zm`qltD|lj&F@7t*yHYCbFOT+JuvhKaBYE7SsNi zBzu+t%f~Qfy+w}+SLyED5aA`tEFZnjlwr~vj$Z~fm(!4F&xsI)Bb}36M)`i-79O@4 zKD0JdWrr*Wihak`8by001VLT0GGmtE;H9YsuEd*r=~{$4_bq<+k588emh#BDtm0o6lU$USnDl7Id7-t*Yq`=AFBa22SfsK#_q*KZQ{AXwVC_ zS#JTHNBr4g_9GvzwE?lMo(EMFFF~1%@|gSE?Tg<_%-!F3sr>-R(J$t+yY~XWYtwfF zwg}V1Ym|`Kk(|C78<8aoBHDiZ3fBzjf03yYnvRZ|phgm!5*S)rV^JRl6nh zkAxK84DEe2^xFfwa%@BQ`8Bg#fpR)YbDo74MM|l=ma3ZY8I?@;YawZvnsMf zY)3Gp!|>uP8coUfWufHXh0z$A$0RrFHp{9VZqsHp=K8)OA?H~Dad{@@bi0<-R)0J) zTii|ZvrQlVsxAwm#s}d2yLDe41xmO+Nalr?M1tniXVngqU&CC<<%$eajW+!GE6;t7 ziqv<`8louoo{VuS=cCu z)qL#^cBUg0Z6coP_6{SJ$;hBV5Ss|TTan+%{p9Lm#gVRtJst@BXPomWVU+eLe!BTs zua+%pA<>{vZ+kCb=s{Kt=xK#%2=1U?2Ha#X39S=TlG1Tb2q@O-r%^1!`- zS-&p4Lc-{Zb|qqPwiM(2MJ~?($cqYGb7)UR$2l}!OJ-DtgzMT86=sA-e9(^=$P@nBR)$ZN>Y5KBW?b;Py?`LkFu4PLP6GNj}XPm*+y#x z*Jnzw8eg20e;X!c)k*WFO_Gp1^fkb(e7602f8mSVyTEFrRssT<+>!AOek>~En@Q3^ za_3-us@TY2?HaNpd&OE8ge>ydq9aM#$3*XY-!vaAG4GB8<^X*^DBNECzu0@vu&A=8 zU04xDf(VF!5ikOhM^MRa0tHDTl7k{SN^WwSC5jRxqeMXj$+5uzNJer-K|r$P&_I8+ zNw$v9JLh|^>s;s0Grydsd+)Vs)v8si>aM%ep*)!)x)bZ{s4b98!Ks@5C`YQmK?O4k zq%!c)XA0;XM&aqxmO0wpalP-ew?eM9p;d!?Yf|Mv7499>&GV{Su9kM+ruaDJ7Nm{t z2;J*ntJTa(J`;?`72+w>3n{q1(<^(c$E#(%pI|)JmwFxcu!WHJ>ugK0Za$>Wk<9u4+vOZ^WIV*t)8UH zZw0i+xl9E-MM!iiIv5U^Yk7yu*r^~{q+)fH(Cb7oD`7r0DLZ6$WDKLlHC_$qUyW49 zb=fqFVBVab*&;-z7C3xhhMB+Z+jzCQp;1FT4X0tG$8`MT$&|C5VWq*)c41#jzD{Wu z$@gtR_c_2f6imrf&zbB8kH%v`zP3XwNrkrZL!lQM-U`>lw~Rcr95o)d^kO)TW`ZFp zNX(`E+QD5qJ`xRGfy(_cRTJO#ssw@+_Yah~wR|XR(aZLltl-dOr%MA#epoP{p^1Ly zI6`QUZdq6cK3x-Jo%xJ@2&d3eAg4Y#nOxlE7aqPJU;16@d3$E}FWbTmb%1E!Gqt35 zbR1dFa<4W^XoMIEn@iu=YEJSgqdQcSu6yMXZroGkHvVXL?KVC9nf_q0Z%_LB+s)I) z^??z?qU53|m!(p`N##h^M&qRqZy`m`{6Phu$dnVZ+T2j=$&D^^S+(FUDyBVZ{&miJ|78OHW*s@z=WX_{7vZ)Z9+&%>VY%svb=a~L}#G~NG zeA-@FelMVJ;bmofnESZ`An?z6aQU&mYTEHU614K-(zijX4)z+$zSQ9zeHGhFcftg_ zrSmcKDU+=>aF~W7h?=T=wAk~qXN5e#$YbjLC8y4N|6I5V*6IEr_z9{ZYQhM&fi6jW zee_7oW&3xK;|ulMK^Xbmf|(~VVYehn%@@$iX@8JcO3%W(J(AWzHE z@#>_9!H`XBZD%nl=~fl)5)R~4qyLm(**9W&v5ASVdj8PE1G_Fobd!V`17fe!XHw2? z65PI%P%Oz0@V1%MF#chD3PPm>#e}*mN0E;#w^9_h#kgK4mo-4gsYBbf* z{B-f_kITDKX7=KeKG4TFRJq_3=b{_w79d}LCBx_)E+gteRm&YB6`osSMyv36t zo^h1Qaf_*1Q2R1jxZ2}}rLJ5XV=Tq> zw>L@Z(+z3O@!;f^LnNt6ZD+{mSzugpj7Z^IJ!y8aMK<+axu_Hw-)Ov3Xe6bmc;&|j zAEF9h3L}gNc!9o&+bSM1F;>DgjD*QmUpb+7pHG)C z0xCfXl7h*5nCOT9dlyel;X%h=V{eX}JVp&_V=X-^p3@c!aNjJWIRn|dBN!R6Yr)ll z;CZnx0EAmdRDE`rc+e_Vh2CpBbghYuUswj#yMDOO@<7Ga-MP=_ZPw#uyN<~<4D%z! zta9G_W-@~Wtn{?QG>{B0LW!o=nLA^v_&sa#T5Y?Gc>#Z2WiWpQw5wngw0^FVZQ+{* zZRK>XJl^%rThB*SFmEOD9^BX;J)Yeak?V28=Nmq=LgP zEbz=tJvfuQ_PJJ|&5x}EYIZ+`K<&9Z11Z0lJ2yHxsoSu+iMNGb>1I=gvfID8F5<8y z7if;=pf}H7A$FZ3A7&X7?J9v$%%qDDVe>PGsAq`V2SOVHW-EgN#Hsp4% z2i-V;D?zrc(A5h1qMP*;hxb4e0OVEl*7dCmIdN-jhY2q+W7ndWSjk5mEW0BchMQh_@Yfa%wn7+7F@JwrnM$<&;~jPkqegH9*U}`T;R1 zH8Uy_Ljp%ay2&l{1m93Gj`zKAcW#~p15Zu8V=^N~!!AtW>T|frUv^jWWDF5=b#WMX z>{hUJ&b|w%-?(Qo4t9clehL(2ZwgoJ*fif>l~LX9u6EBI8wVDJ{RgIy7bkjKd!Fo zbobMhg^2EFFMW8xhn|LpEU|D{=v}Zs>X|y0RwH`f@#aA7c`9iojhV`ZskcnYpY$OF zj?}V9f!Jj)YaQhPLWiIt$IB0PB0_R2A|~B)Lv-tR#>7eSAFeCb# z?^EvhUMEjhT&2DY_m#NdxEYz%r!Pcs(n1zh=9V@b9tfees3y-Y_W5h=HlesLr zaYuVpsH;Et8eZ6}={S=l>tegu$L;D5BxL1Jxnrl64$H0NHWzS>f}5`3>LKi9x4IT` zW*G6|=6hPicY8|>A%ba>`|YXJ_SXuGM?OFlCL8NETah|g?os6-hV!T?wH{{)o30sj z+cqm(IA6@YD1MKd6|3GN28vk+;&I2)bP3T{Q)Wzs4hRcTXyS*Il=PP$t_;7D5P*iA zA)3=K8DjSIi8de+q`8^%*rzVjQFzI$4ohQqrjeQMm)!exeNtz}t!8A00VD(i^vpul zmtalvnTF8onuC1WkX%GFASNQX=-$hnFeF)``sHo0!KiAh%&1z0a75}!thJ}S+FjEq z>C-I*)n0`~a^nhEk%!nNCv!kHQ*xc#8n#H$6J7QDlspZxo+senb|TDd3&1aa5of7 z%*-5VisQ`c_}et2@j8@8e8yA1%@%nX3aQ)CkaNouBh!^ZYWfRwaeGHs04|7YV%G|F za8#P>d#ek)Mg4lscIh<%fP5n&{)-{rAN&4-a~$7%P3QJ3>wuqo2AMfEYg!R>>#7Lu zt=B3s7x^9>qwD;na&@0=!O)QOSP2l7Oq>{?Uw&vgd+22-jfGEhzu7YuSsC8GJg?P9 zHMpY&ovbsi8ucChX~_t7=IUG4lr@A6@+LuUW-J6>EV@8i2~0iLd=8rC%IhAdS^s(@ z5mD4=vgauc5_eW9WSn3fy-A2GhqG@huDusA1zRwSyX=>TBQ%*@qE)?4bzWM?UfU(4 z)bV~r1~~R8X{A?|<$-H+j(6Q^{Jhz9f8rs6G1(kWfs)hMh^22YX^c;{Ss&3mx^-g= z=hnw?-a{8Pz5B2}jY3 zn{KlYc0-${KfAi?r>&9G!vq8baFi}FdFxhd+OF*(lo!P}=X?1za#f9G70&~6f-4eC z*8Wm7PyTKBZhj#TRyNryj_i4}xDXp~KCJx_Rz;WoIiKOxfL=(!RD`CDtWW9WUxM)) zTmTN#pKzq;h!?@be*eEG-qse}mkp$Ke-Cg7t-Ujnk$6({T$g@)zhIwkWrcc`uHvb+ zzi2y=Os<^m(%RD<*IZIhTxlE?<_CV$#!xYTQ>15P=nA~iEXb`Cs94=vpk&)I`94qP z_9o=Wp!ZJwtz@O*zpk8nv@rRuPv#g(<_0q+__j{98L-3(zU}chK3`>-tGLP)Jn9hy0PuI4=U$h41 zGULKiZRvs_WXoPaAM z>Tm26m0TYJ@UvGl4^ zd&yRR)JI~JA*+B6!pKtdFd6jh*p%K@BFe+m^?|n5!XoAQd5*ew8&vsMf3gMh6&B>| zG|kIoIrb12>7;Z&%T;Z|OwhzPidM~k_Y=KXl;7}S!!97Bpghi_TkiL|gk8xt4yw}l zl}8oVcQ`BkBP?o~>}Cayw75CZS&Tc)MLHwPZ<1!!R+N)BI7Gyz3U0Gv_{Z>$);2X= zpFfwMha2Snv_F0^L2_-ryUD&eV@QQ1m|irUS`Jn<=IuMSYP|eu;%7vqb+0|BRxENd z*srvvxvLX4pvJs;^QNJp!Oy|Lf!sLY)TKtnXKR`?uZ2;@2`v(RX8Arc@>+#qIXKu< zkYvpq>e8@|)n6zqI+g0?w(v>(>gvL-NlU5Rz{yoN#9ifY6)50RMH7b)8mb z7R5zTQL9apsj8~Fb2m3&U8JS?1K+O+GL;;-f>)orCC1k)`sY?gMQ$Y)6ci+nDg!*Z zkqDR}t93JUh}zhxMBmi}F22&AS>k7;3uBwq5di ziu*@+8sfcizyj-8wjCM?9L>|lc z26aVcU&PD=iItj~+6{Do!>-TCui~1nF|106CmVG;;yAYEQ()+R;f%DqWTeljVtW8@ zzWH!U_F7mjy~^kEdkj}T(#l2y(4YVHL-$qZ9OJP2QO)eUXN^Pv5Jd*CEpC~~9Bgh- z^GKjtn-ksl?zqR}Cx_n3DyR-mGGzpaNeK{`OjKkh$s~86nyTtmJ3BkLnyQ?t6K>jK zY&ugD-)5!}gDgKroc_`0ZxgLu_4UtqKL+>B@KNHlO%t_FK6kfT9VI+tan7&@M_!*| z?hvvVt6x9bLE!(Q!YDq9ojQVI+&VRXQ$$lC&NjBX`qitP)_WQ@T}uh8JKN@H3RJ0M zQ48himb!M=6G;!3TF1OKLr0k`@_W_Q4Xr+Ih9go|A*hLtC)qPmeQk@bPBNYrGk@3_ zg6oFG?sTmUBNG=L^C27fG|7gsdEM5dY{-$==FIGD07vq!h_Afl?0QcP(?NMYtExLA z&x+I}elS%3k*a4Y(sfErrO0WDvX8(OSe=CEl)S-PQDsj)pE>*D4AS7zOVgL19oN;u zmNNWk+L1UVM&1bi)D}#_u9ocEI+={<*O#$C`Les-uY{ojUfF$E`M|r$%*@QCYv-}U z&3w1g68VrBG(2(>t@_C4=eF=M+wla!+VitgYo(O3i^t4NPtSTO50_z|)HI(>dUt~D z@3om5W9HAQIXX&oHw=%q`m_(_rs}*7b*b9(? rDX+?sW@$&Dqk!QBRDYxcRzBC zx3#g+OWyM?6VNss7K}&QZr)P!)br4~-@b8r(>w~&xcSYxa&p&6>_>eY;(NWFr}Eug zs(y&RSvQ2cYvcCHj_QZUl+JtJU*GfVXSE75kXY(2J#Xz;7vr@TZZ6Vvr`!*(TD+}9 zbPNV>=4pl3zD{6K2&BF`V)&gKn&5YvJL9*1p!&cEV>cfm`|b0e(_WLT+YJUc5p5*+uEdRsUkUyd5$Vs0o-H2jcGb02>?6>D%(}a4L$&&EjC;0pG6~RB# zyzlk$(!Wgv4GvoQen%n#jrr40{wu(r*7O(o$o(G*(DR%&IJ{Ap6tPE%`uo!SX#Yjv z4G7|zl0V=jp{4yz8CErCfta|mLZ6N0Ka6ifQQ{B5Lhm!;xVUz{|1yV-@2q+elW=?l z)?AhOkKb6|0q0={@HZ&CuR9XIE8ynO`)C1E7!eanaDx6xy(1sMJdESt?)LwEuMv(8 z-d)ZDnk_0NuxciI9e~^ z>~E&A;VJAw&WwOm0`nmlEh47ZQw(Y^Ggo9r{kCl#KclRDmx!wDnY4?%Oz)q7eLT9&J zFIFJpJSc?^fc_GEi&vrvuG;GpkKc#sPhfj|hrn{6B1?#|GfC!g&DdEc1>!o>e_EOh z#F#po#(pID(>1v-9$HK19Hu`@NNPf_VGGslA5GI~5gNWL6HHoalhek@%QlPsrwdgq zt2aVPKc$Z{B?Y_tTNtGGXl-Mozo1ZDK>p3qNqsR~>tGD`GH&`VQ)mQsdDPtBuOCoh z+yb`$w83)w!CYm0mXRd94bYK6^Ni1fNcj211-nigJ5``Z`)bc8BqAa*2)xIapbgaC z#sY{YN<%i|he0Z%B4ieuqJc+=RRkK+L`jONzx*@|8GtLDo$L>#P7N9F$I%D)SYBLM zclLjp2aF`LLRXc#2t?G7RJ61(B{h`kFf;VD_so39fM{TUO}CgM5Hbz6&PZ`D8`|bK zUO!pikuz0i6@HSXIA^6Dbgr&&Ww>xA$#*3;eX2UG9`c1Pr^}t2(}7zcMyYTyL#4~E z3$282m-O~I)AQ*)QXD@y(pJoXKUy$fyghF3$;>NO{UhPF9k;Is=tqO#lDTtSv+rK? zppQ|IS+EX}_?FRbW>tTx-6UkTbB<(CV|;O7x^vv+G+bJC1{S*+Lm1iIcD&)0hDy#$ zC;4umujX=|Nz{_62u$8%;X_L>#Z^7RRM8l8hK6)X{ajzT%FzLDISaWWu<4lv3)&cc zJ=6WzcL3nIl{@XaowKYP6_sL67Yw#6O+Fb1=4c&<3MeHUE11J>HN5`%yG-F?V{&S< zz8cAaysm6;v>3fAc$XLil&uyQnFQF67xOYbknE#F$?x&7`i|3 zDufMhKYhAPs_8l%#l$WU$OM4WgKV1JfEvST4#Y7ne=n?qrdbhMjFZd2S#%keyTwhu zPd*dyyL^tzBl=>)j`+*Lz?$)7A^RVyw#UPbreEjt(_bRU&O|`0E+vLv@F($5Zg+|v z1;RmTme3#lzE5L9%yQWZz8&K}$fw+e?9ntp6JK#|_Xks62jNUeG;u6X#|1_gdoYc#*Q8Dlh;;{h3l7;F%W|3jz;yX-i35K0 zbYTvc^FoEbf2eovg`k%vz*8X&gfU`+Kzqg-4SC_x#UWhT`w4BKufX7tb?ekXIIa=9 z98wR7#MHlCdiQJ9R1eG*vo62AaxkKMfZ(pVW*d2)yRo%ySGc_%oLu!*AJCl{ew|kL zfO1%BsL-T!a(7fDRCdgov`zMSFlbnRjgLLx<9ImRrO#hX$`Sf--KM|4Oj?2mRp34l z0RXDj>F@VxorQP{769|mrc^>XD5WKMGH>_0d3)HDp*_*tW~l_eJ;Aco;ZI733+Gsj z3e=!&yBh|(D<*MevRq}=5>If|LgQDU9>wmE2Jtsp!NKVFw?~}%PsYVjxz3-zZ@R){ao8STVQ6H#PT;ssO)zs@!UI@-Rmt4tze`a zirIIvcUS@oMBMqEXqB%mI|+`6RTa=yfZOV6#cF2)g=mOD5r@Md3XU{!HZ87vV-fSs z>~a{UsqZHP+p}WzNgEvvEzRRhKBB{2nlkMZ(qGs@CS0i-g797?NMD3@H^FwfN4^T=B7~)S0$7c^kgKfc>#x;+ldN zz>RPR5?6TC=R>MXa{EDR?ZpWEg0t&Usk+>!&B7)fuS^wAf`mfi;lFhBg~AI&CeU~Vq!I{$&vxjvn{MyB-p;@3=| z_O{5bFa(uhC$2Ql{z~;B*2edz@n2UwRdB&SOI{`nAb%ju?>&g;i+tn30DEhBSS#&S z&6EewCrWoO_B7v$$`kv6nHz}P?kol!G!%$Gp4RmkY|hKe!-*RwebH(Me= zj9go$dBYad!e?H;ZyQ-|=JD~JD^|PGCt7#PadyP_>FzgkR4oi#OXJnhCg<9j#&#hK z=b85xg$UMs%~tb*b@16Lb(O%48`ApHVO1E=wbW1h;Pv-ho8h|Evjlts_UMI%I2oCC z(<}|a#qX!-t7p0ghlWO6jXw2e7&pfzzR5kI;krD&NHp0T3r%ZuKBY$$P}djuq)P|Y z@!onm{|<#MHW(*O2{aB7aSWuH+W*F+@5Do=-!Dxiw5;8y4|wUvl@JVR`(_@3MGo<>$ZJn|Q>m?L2!P`rHV$!S;q0quz zDkE@rypPpK_#dyLq2@6U&AhHaF#mE^>UuAPZ*wqz3LDbr09I#OIuLspxLY#HWL44) zTtXI{m`924vNhxwCxMpVVGVs!sF!O4Z9BYmyjs?l_H zX)>^o5Ll2{qo%%-3-tF^cy))IDBZ6zK;X-#f&vj~9ju7m1AkI~bQTdgh ze?lpes-ye3CClITde@u~V61qD=#9Cnqx08*yE_GWD6_`qGn&=aE(tLT!K-c@^AP|G zEa{D7`ZzreR!}zh@0gR0&a-I|!x0~W5rbgiK~J^cgUMpaC)@q=gYi=bp@hV`knW{`r}{pnXRWNP1aTv2bs=5WCSPxlI}JQm3Dd$aMqMRd z(((A)Wz<+pN^I$?D}5axom~ctwo$PjSjW&12=1B(+-5S;?^&+y^!2r)BZ|N;FYWO!GzC>ogrl{UNba4?E#%cEC7vor;^%7$+Fanzc#T z#dFM2k^kX)!XX(GF=#FIPEYu_aukz}RCOZPp6TUrS98=U-VF5Z6yaF2LTCoIJ$kQ0C!*n}V~uc((ucT2v#c$;xR#MFl#N zHJs7f-yvrc91>DuT|d&AH%;P3HK_JssnQw{C(+O{(&-b9MK)YLy9p9tElg%C;uczt zqm6^dxCQKMZ>^#;GTZ56Thr{=a)5;{8r*qEHL`{pn;x_;u$XYQySdvDOR3oP+(Bf> z1!!nv5LZZ6b5ay)DW?On@{cWlr7D!=ty5vcx0eCh$ML0d}} zWnd9Mf!2|FUi|WC%BTFP*6pQ>Iyus9XAz!{W(L2)lR(GCu?mlXqJy!J;N>9ZCFU$o z+$-g@r56twN7#GoUYpQxM1VJ&9r$6}Z&4pi8~vw3h1{iVrnuPHx0Dtwp}{^&Cs(S< zItzZ0X-XLpZ?I!mK03q+Z{KmoR8=YXl&Q~zy`Mh8x~>_VaxQJj+0VpO@%g;$@grFzkV0*B<<7Pz2AFqd<&ktz`Kn0-N@`-9!GQ z3%LMpp;tS8TdLo`8cB~tLSOj%{lgFWZPw*naCx`Ay7%AY!in6-&#|)|`Tb45jn_{D z7H%Z^?|+kvDm6qx?_a+v{x5=N&4Yz&y{!9ha>-zZc~B%pd;XiCZDHa5tAM|)8a4C( z1qDE)1lnU{W+ubQ z$qB~v@~eyt{tUpCjN2%w&}~N1SQ9}pR0MR_AvwriLLDK!V38jeheRrFVJ5}n(*#%5 z8e>HNh$*4ir>Tcd>{dkM=Zz?BO;-ecZuGtyPq)nvuY* z+@)}7cU0?f+3-+jGN#oOW&X|RkPRRU6Q;)vT{*u?%uKDo!DhCrv*2)XVpP-->7c)l z?MI7>#!T+scrNBont%KnbF4BncDP8-QA4pyD?2MIOaI;EQs^375T$*SxaXk}Z?LfD z#Q97ok4Ut+x%t=a<`Yp_^E&`UR~~CoQ;%Ltw1WD_Gh!wf@43=;BV{6Z|tq)_nB9Zu8yr%i}}vLg!>k>-P~&O`;fh;^WwBg0~+smU=x7L7XVVy z$;fIWuopakVfH9?b#{hz($r_$+S;n(t#`OQU6(w~qhr@%rH6<1YjpWKXO>d+0FEM9 zx|Q*r_5KY@g6f6f*lDx&M1hS@Ko8E7eiV%7O%T>f6c&#xo=#dvAVG@%X8G*ilX|y? zpO@-8FY%axugfMnT5&{ny ztE`(~#lzHM_dLF!o%&0uzV%Fr5e?qySFA(1Z$yOmNMQPJI|WD(p2v|xBsbGlh%0)f zrV)pKKj!+({p+Z;0cckenVOom>N~>&^QZZ<^TRmd^|+o3H=lGTcKsU1l79UP7;sTEg&sLtrZ; zJqVOU#{&WV5RBspjN^=HQY?Xj>^OvgAKvr5u8)&FO^KtHky*!f&^;P#MZhyxsu-QO z{aiO45b|kpp+rKk8i2f~6M>`b%E5yN4S_xJL$vjJ(kWgE^L^U|E#^hySiR)t>({y0 z*Qy8w78!HAn&337MG=AHei?cSlpA%lwzi`9l@!;$9a)I#Vt9lFFx1bf%y5IQ<4s=^ zp0PWQJlS3mCo`IEw!kC9wJJA^IQ65M$|zZCwJr&Rdk%>kCt0K~9QpfmW*UE9mQZ&o zUPBus06W|w4+~S+uYP`J?YzYR(2n@C#3SsTO?+h}7JfdQ=iEpbQMy44-fvpsTRlUo zG*?E-^L=Y6d4oNe@3a@XnKSc~YkB;YhcJjX>-_#9iW}bbR=QsH^dEHF_ixQP{ao@V^&Jw>grv?mS zVJ&mxb?J?lpGS7z1_EULxgh;AYT}Az&h`Jl3kWa3F7hbv8`u~Nv5^*>^t0`9l$)QB zQnwIe_VCiH85<8D?--?De{C1Z8k}%$F@b4)J4VVQGSBF14B2$;5SeS_ouWmsj(4Tv zMc2N`^L!11c{k=~#4d6cer#Mw*+_7RVWg>*3tgOTm87I9{x`3NGRs4>p9*)FTkLFH zH>8VebFLjv-E;;qf)F1_e)ixR<+|{Y(U%;DL`%uYgIMs9J6ZYH#$8KIgl0N4evKR3Ae ztH;;KQrq4h;sR}(;=H}t1|J<+Ih2u=Wo~(h$^MJ^V1J0Y3S zl2eAx{f8eZM+LK)sdXPBcs#0;OdXn~52jYU`7{JIi{;ku$yhvdyxEoBTwzeRxREhM z*q13{ZDFJV5fIbgP8l$OzQ8O}cR_X2IBm!?k_OSVw~dWK8=n9!DwpArZyyDHhid$Q zAKSq}67Cjm$6^=k#o$ZE?M@gZ69Tx>wJ$3Tgw%>%$!$lN(i-|#x>X+N&Jee?r zVvilEI3fqU6NSm(?CLt&x)2sAJ(6J7B-}*yx zZTwcoB82#Zu(KIfb&!ix($Bc|TZl-`l}P+~vsOp~VfK%b>j$p8TaFq~amDW@v#Bvt zXOx8NmS7FJI&}0$h@e_P@z`l31Sjcza6_&eI?@O@bIq{Pm)8gm0P2=om|_nGhOw~I z=9)Kdp}*ehmLaa{RmIYEKZ}?Wb-<{k>G>b+a>0#C{po>lwHq>Fh}m?}5FG@_gZ+p7 zni0^VH)t$>s@nR;J3LFlkNZ=`@zcM`2Fe_$mn>E;qFa3o*`Vy za_%2X17d|w1``z57Kx;4>KP4(kJW9??w!Iv+?<+mdZeTQ=6{8&{rbE=*VagqR|aP& z2rm6lie*n;x;Xnh#B5Q)p;V|V2nn69mh|-Z_dkWmc^K5W9rH*pLz{!q0VW!bjP&$q zsHOLMUIRQWIC1;aac|yK)70?S5?oI80xdsuSuas){^+!pr;;^s<#xP5ILF8cDIq=B_Mu>*An#-EnBdNiY)H zgV#v;+8)jlTbb|~ln~2hW;l2W=7c=Jp}}gQ z8p*t|T;n!K9@a@|TK;%apTw=6%>(2Lc4;`sPy1ni+^-3Yc7`Nj-Cq4AsYBgJ4hks% zxfH17auF%A31W0zdi*{E+J2pI?BXpw5SH1h7xEsB#I)m2VW2?@pJ`SYJ|ZF0R-SP~ zN|?6*=<%tNGTQh6QHX|nNOed3L(%DX*6&Cd^o~?Ph@GO(TfT(`;^=*#66v%#U<~*= zAm1DNl6V2fG2(;pW|?AzM|Y&-SlE>;?gADC92h(hQw8Y-FeF|$yFR_4|NT{@4j zX*O%(hNsJ9U4)SU-L|@qj~f$}^xw@wEZ3=aSpJRuMN!B!MAYYXFTZJM6Z{cTC*PmH z(^np!QK_?Usb?5*gu?gF3>IGeA?(sYojiw~6B+z+7cYxH>J7Td^OXpUS<_t9>-JR3 z0}kJ%PO(`qZkt&9cTy#P*>v$<0(Uo^pF3(Bu61fxI_~lTJA7WPpo00MR z5dh=Uj!nV(DLNjV(eutKkQDs;9j zH*hAwvm&$417o~=J0RMpdHKl_wD7r-H+m{Ax}0~};q`bpG*ww7V+nl{zC6;(7HdtF zR=Cv1J?PktbGcz{f8{ol!Y3xEyI(L3nRc0~%DOdo@b*WsXh_P4IqHQ%lQ~>{78v=b zhF>9Vgs;@2Xo=pQgZRXByILH_MQ|%(3vbUw3g79DI(RI6d&Sht;`A}!h)w^}t>^+$ z%11L4P5@rmf+5@eD5D?|?P1ueb8w2G;Cm!Cqde~_fLTtRTk$+88bVU%QNeh24C%zO z+}XXX(akrdfFtTRHAE08aiTM?IKGF)6%4<@9H|7=W1p&M#lfd#*1-5MEzO>UB8YX9t`a zi9*^gkd&YGa*I&B+JC0yrUz#of|RIcvZ~}Yg!BuC0K;|~;RrGOIQf81!{Xx1Fh%KG z_?yI>w6v?<>>{i?@As2OG=#J4DW{e9J6mPVe||r#<=PP0df`hxK0|q+6QTwfquqO? zYSmNn_o>MRZJde_HCv`6JSrorNx)a~Am<-pdc>(7|1vDcYG9`d)Q?HVDFXE2MSZ_Q z?LbhHO4{-6s;(oojF<&`N_uN@ra^HarQyl@fl+Ptq;4Ct27frJ|16*+J!xGMTgIy(pgC9)QOce!5(WX3@*pZm&#HTNC-tij zJd=k^fLZ8i^RDM(=J!5A&eU|#2S2}c%hYGWD*6Q8lgxuVY4T}$O z6i65!5Sb&0V4xyBi3okvXyl|qFg_|{u1mergCA+T!+vpCAIW;Xf_$oz-UY4K8Y>S@ z=evBw?PCM$_T$5JeT3$z$a0}^VRqc@b4p4|LnEQV2q)O0tf|**vM^|AwRcgfVsT<|pt)UXsJgV05*{LNaHYc0}4IjX@c+{=nfUD^Ly`L*@Ma z?)kr}rVLw1Djwp6RP$_2FQ*7M3Ar}s$y@=MnIqUViz(oOlZwq^dQwD&2!WM`b!RX| zKw#||M9QlR@E=}%^A?(sg9>V@on_igvjo_P@@R@Q3LK>WqBT4`+TJzWv{jCmJQvS5 z;``~-@=4)5)a-Qdy??4xoC4*DBPP@yF{hTDv zAy|Cc_hTq3?Vj+qiv^$z2d8HK8Ru_D zn53b#D|<(?E7YkjUzGHTlL@vF71$45U55q-IdA1c zuag)kR)1+>@_UXno(eR2(Lf?&Q_(=9ACSPI`|#W#g0R7&Ol#ca`)`i{iIXfi_|8LP zV=_pA_+@i+MMxUX^EmepFNe5Suh_zzCd&X-vv?J7gqcrqW7)lf@=FV4NCMIjf*gZ) zD7Y$Re}+KUUpRCjGDl|U#XdsKidVr5KoOA?3Nw$;`7ke#KNlmTYEj=kIrpDdPY2vz*Ybetz#h)m<%@%{U=v zx_n>N=9=01$`=_BA0HArCMFL$eQCX-c2zeq2yc#^uw5aX=x%a&3ZO%Vk z-rb7&DfZmJE%OI3h`lTMunu(;I=~iGNs`}Pq7LXYP4QkiNeiV7wvsz^EBW5 zM>wE_<^nhD9r85H3EJmy5p!rv^nRUsmF*w6sK^!KD`lFlrU~MN+Cw;w^*zHw4q7hH zeEHmO3reuBSKm8>z-0e-&qFPf@$vKP`a_>ton=KCueE7ms_0kCes83m^xMSHq7)IN zscstUZUS-p(;Jw%EJmD%)>O&UQQy{8uOV_Rw#Khaa&Z$6vgba4l3AY|{b`?3APK0M zOqJ}@deE#z*|_e3w;Wh2>pjK7{qrcjmJCL1Ce!OFK{QhCECwk~%Si@i-#fCt>j5&k z#I*ofgOP~eW)M)@9z^-oS)HJ~BvOV1z#D17z~c8t#yDPeZ83`aNmm1sDFW!6^|Dql zEe?nk&ocG%B(P@Wy|e8bvKa(!5k#`_Z(M}_!iaHF?(oJ5eF zT{4GM_}}Y`Yox|JPJ4mr&?5P!caB+vjgmY*tGHeZzB*lT>gQl#0&ez|k3nCqT$-zS z>k-U`G}JW7%hiZ_{J>(uX7CLqNz}hWzPb5GsSOM;P;L00p{KJ`*7a;xE%S*r9o(nP zJWc^Ajzv;}5g^rW_*2&j4=Zu%??Xe9($dne;^N{`^ae?@vNwhhgnF&U=)4+NFWNlO zYxjUp;q|%Nh~Umt#Iso-><)CXF@WXX@vQCG+Tula5%(ZTmbVupU}b*}ri8k7%GlHP z`Z~SBx;Van|9&YfEKDTEH6L^PCR&-)5UFTy`nLway**W8Xv|Nb z*V@FG=Pvx%qgoKP20n~9;wp(BmTNJ}hFlb6mDcKiwNK2dn#=cX=!hp|*PTZ6#t6(1 zFh1N2dHIHXg9~6^)9malhw{p|XR^WJ1>WtdjmSDgz9qT2Z+8B*PbAuDcAz4SFVnqk zBdNC!DPEdrQ}-fJyglNPaOwidO%zYv(qoqJOQ3=K`gaDdTOL)~jcVV2q_=9@>=m!; zY-|a{2<_m0vc2lJ%3gj`q_X$x%=%VuWT%cQ>rE?&i(_HG<&+unpunMBs%%4ndJlaG z37?Rg-Spw%sYX|su_&J{XyVFVj~RREu(lwm42bR5qqS|k6?I~@nw2lQ2snxtiTc<9 z9Nek0+*^8^m&Eb48geaJvk(R*$ikSpW^Bk8Bn1oe=OSLaegCP5cOvSHm`h^yDTNd3 z(=M_H)Q3-2_5h(7v?7|g?;uLf*(B`c+dsjWoK1grYR_W?F0{KoyRuEBPAnGe1G*0tpK7q0ICBRa5CO#$*;gu0H*^ylfb`lk4JI1?|T zbvH;?{`rlyPa2VVBymQm|7lPJ&y|x0rFEYy5B=>uzdtuY5$2()CZ6*j1hVn-$d_O% z>H7Q$v+sWz!ZieNk&)?XNubpKm@EtebrFtX_HuTsf0N5~n1_++-o9V*1^-+ej61S$ zeoFm+8Wf>il8_)m+u!B?rZIHL!m%b-{@g+YPx(2cNL9q0$k6p$gQfiOJO5R{|3SI_ ztAIb1=@+B$Uj_U{9Gm<4|J(v%n%w)j{%BwlG_^Z(Z47~Vk*x~|&qENxF~omAW!9lQ zqw7O-il09Q@^B4xbx)Br69NneI+R&WS~|H)8wLwQ2Ib}vJPuTwx1yi66*z%t4vY^D zN*5G}s6;yTNTx2xdKbA6FZ9x3@J=2@XduBD`fk7=TqB>qc_R4%P$tmgXT0s_&Y};|oSes?@(&wyLDi)6SL|R;&N{&kc!Ph4`)s~}nuvx~Gt;CszUe5F zVdtbWcYZ*Yll3x0nQ^g3#MeT+7QH2{T#fIcI{s3o7;|c1ha)^I#=hVDy zk)M>r36)O*Pk#u{3ei#NFWD=_lb2fgk9|n|xtL=fVQLnu#yTw?J+!P5TReFX+WX9;&=< zHF2u#Rg9FMD^CzypVr-lT2dmKX)l|c?fW~!WFs^UAKJ@YnbXXtydK^& z+?dK_yWm5a5Od{cAYV=ePWfL+UpADaD4P^uH!o7W?eWkmL`Xc)r}>o4P{Y=y4JtmmI0Z0iVg7Pvg!G&)Mb;knL1x;ii&K!)L@Jfzbt;MqDT0=ih>{14- z>+H7Vm6~C=GD4?_@2(Eed`jd8P;yZ|@6T_$+Yc8j$s0&|-|RZ$Cfx%MFQ_4H@7SwN z+el1$EvN`7ygKN*L>6_T5o%MyG#Bg6*R|@q3KaAn9N*I@(syY(Y}|>Z6Fs1za=pf} zYYHhCxgwD2zshIUkc}da&^hI|qUJdk4i$Ww;jHJ0BY~E4QlZt6lemhcQYyG|BaRfw z1$JgQRYlQ#!%YNl{Vgf9KgxiTR3IM>nuXp9>5bRbVo4~>q@m-o#O2I!SN!(+RW8$B zv1(2MtygzFxN^@d&t^62w=$u>(Gd0f-wEJ`qaTFNx47dZ5t6 zRS|F%Zs_Pxzk1JTXYkzgbaZufbwk?_d&5(4tBu1n{v@W3(I`w&#)i=M;CYH7-rEI< zasQ+3kO;1mKHd3ztPtO2z0fBn-Mu`99>gyfhSUKiai4DqyZ97><%|^anNtQ48)Y^iLtvwZP+w-- z@mH^Uz?Ct2MpA1gK`90@kjWNWSDrB*X_QF2_~Z-177N%e#u<^QvaIWM99r1JQ2p&H zW!(JcU?A{ZRC4wK2 z_&?BewMI6d?)wIH@pb2^MEqWghU680Z;)U_N595X7P}Tsbl+M^y09$K7Qn3)&Iswe zhITc<1iNV5gFHsps2l0lgLPk@dO_Co@+zis6IG;*!9`<2?Sw;VkWv)+)kl2|GwwLp}9hUk;Fk- zZd>axz%%6bjd`q)?$mOckgcoGw7t|lovmRAb)a#un>e9sT9mohv~yh{9w%`Aud?d- zj=hE}OUr3W#QjsFlNHIVp+3V*xR%l>sVJ91K+n)k+D~{;G4jUeTYPGP=+4SR|p0FX#+Mk(ltvT26Km39HUKAhiMEvGX-W_dQ(q@@EZrF1G9uaF4<+q zxE@LZlcUJr?3_#4&g7Kxg>G~YW{A`&!m>OLv3`L_iT`ZYE;9+ng`srqcXytSFuKft zorYbKtc?pDs4OdI&|QK5Q+jF}f0qZiiC0((`Z&$2!gFSt+M`8gTTYr5E~nM`v4yo- zMR7_j`hL(hWpbUH$l}*22~gP^B`TkMNo{FP_*(1a6paD!&K3qBi~-KWWU^9e`eJcE zy5*KMocm8kNF&xV+^Kd>S@4i&ug&~d{AnpGNaRNYsf10ds|TVcrjTZj*fYHX?dT63 zw5kkAoixwt+-W%0fksmP)%m^SL*b6}lnz=hmMH@dm%;1??=9{&XwZFl(6%z1#`S|d z_OlsuSEycb?N9lj8I+;6rd02j!p4PpJMDYDqN-$a_w9Pb6#Y$YMP;|x(oo@b`*6L( z-BDK-eCj4s=>zpstcsgij0#)qUzUH#*)+ZWv<5@NkFJj&KI@;D6-sdO#6JN>TqgfM zr{W0)#qVT&RkQ8gE4Eri6G1j*!1b;)7Nwp%0{qPF=#pYrgs8<>*hCUX3ZxSoTti& zD}cc*7_bhF>Ch-pQ;BQ}_=gA3>@D2!C()A^rp8^nbwn4w)iZPNLqi#T0p-?#ePk)n zDo8y2j9-(UHzY3E{RWPwtDHTTaH0LySxq{C8cNGv>K4&!{9eGVn2??`l3JnDlo5oq z(AmrLsnu5Y4$xLfv%|)cxUDR>dvzX0H+0a6*vkB?EQS``~&;_r&s#)zdMHr z+PJp@g6r=Y$BAMF^!{UvRQt-^mnJK4(bJ4Dtls{Y9$e&YxxU}$fro-8F5E%2&THH9 zVyDrx)NXoC)o(L4xj}%7d}-vOlB_up0t^cceq0)Yh8icLxwpOu?CY})_hG*%%DG+316)%71BOum%25LIAhT8XBKE%*9v3R`Dg8Gqz z>k|XBr0n|JP{v6&t5d}-ukw0v!Iwcdlu76Bzg8u^Dp=GC4T`5mtjUx37fDAS!oV8u zQM&f@SoVc6XrI_6#v;I?5YU%f&7O5OVEFul9kc4EYv!thHHXOj#~oe{7-qHZYxd!xHBwRJ7+?`;za=hJoz|i%uRAumIBY(zK+_FsUbi&cZs{{yPGrj;VFvCo2v^kFMjcBbaRwJ3EcZd{ZTT z9zYR2dqZy%4xayKAHyd|5HvJzDR%@wZLs=qYjYyH$2w zdUvJHOIs(u9Gh1>I}q;SJ2MoSzinqrx6^DZ&-kZ%87t09qglFoUy9<+)nGfmRuqf8 zu-Ns8yxd`@pT4WAqM+H!)b!Dg5vQo(w=;EvCrXHa?m3J`;1;e{yH3Z7a%6LE>_s_d zV)An5>oW8>a0EVPJQ!`8k*k@^OB~2WyVlsuV%hR;dF57^HNOel%iCi$zGG_g#Va6^ zs1J2@Nq*v=Oq?UdT{Xg`u20);6>%&TRzU2Ib^Hg8|Bt=54y)?x)`k^91w;u25fM-j zB}GbFN>E7=5Gkc=gLH!u3ewUbt$=_a%_f!ZO-Ps2rn~za`#I-P{GIc>*Zckd{>8e0 zz1LiG&Nb#3_qfMBXjl8`N@5zny^M1>cOk#w7eiAo=yaYj6n_wKZAPU@&*a?MOSKOr zO`sd&!*4voSWBt$H$<@#5Ddc4SymB&y-q)H%1k=QsI9~D2*6;yx1S6RN8BwkYG!Y} z$NuefPx5QJ$1c*-9fAh)Vu>t$inQ&!8M&=iM&w8PuaJY+cr0{oX;w}rytBcboQa(6 zn!{Qfb|h!nRnF2dYz$+j_!%tj)D-rTdzIv-?^?!s)s`rMm5f83{}~*oQ2MPS-qYU+ zG9TMaQkhp1#opRilIj`ZjT?v=srDu*WuF=-9*ShlENVPQ$;(mCHyILq;7HV@o{O#9 zgQvPUUgw7&r?^xsRv7c>Rsi01fz+I7$EPpSyQt3IZ0$13)-AkM6S1&W5Em(vc2HW0 z96>!BH`cCmJ=$}TGFQ;=tXQu66)(H8Kb>^JE$_Nn`A!&exzd+_7)lB6!f3ZzeX|nB zoceKBT;Zw?G zTpuZ32j9icPDaEc#(R|>v_n_&wsoDNgDE}TXm`-D(`y?AD*mVSx!qTK=pIUW9M~f#>V{vK5 zWCwaCF#h}mD-DKUv5nmt9XXoYGSwVOVni{SVcD+jJ!wQ6H2t-(GMZg2o9}0Ka3I+m zyD6O!C(GXG@6f;UV^}SwmyKoDp-dpX?KX;kO^P}L2j|FV(5lmqhS3Qbp!w~^%e?2e zpyk`a`1{GU?FRZ${S{ycd*2RA&t$4(EnPmkxKRaUs(Je}+f%-J(PU+_C3mc*1L1jQ z1=ri$hi}H57iLF(Dx(Dr#be5pLnAl^8J$X z`pVGt$KRwb-jw;MV_KFU*Jp{+LnlX@ZVrkZ1$`-ARTEx;z(~>{66zUvmOf4dySZ@G zLipom_0mr=qI`GOmG0vqZNd!PmM-Y6IzKUKE05M8&o;CWmm093M}*~qb+ zUFaNIvD%o9i~8QZa_SO;N7?P7m|_aC5LO>sZmEc6>-v^$2z)R0PygyxREx%j-A&PW zP0-2i7Nzu6bFo4LrCVRuIuQngML`d%RX1dK=&CH=bd1*pbkdm?ZFH9>Kk&O^-qaLw zdmL$dp(L70V7Dp0eDK=^iZB|xxoen4B*OL?Ugegi+u&ji(XNO{o}eit9Og(q_s3EO z+F(EWG~^pW_-Dc~FUcFM>(s_$(CeZ`sOP!!18Pls0I6Voa28kwp770u-U)6in=?V=yYsv14;`;;{jFiXNnyxWb=(H!sIn#8< zno}e>gyle^v3ZqU)8(2T0*dZErHcN*z*|>cwqM3>Y^S?~LZ*J#bX<4Hx!*8lcX4dU zF(x%`K15vHyf6UJBjm#y>2r28L4@gCVTEIvmvTE+M54LAiefE*;M$le_CvIi=9V%A zNwxAzI0O@3y6#L)$ranLm5I(g^VVyr%Z zlv%1K%lZ#?=Y&{N5LE5PRtlndYBOb9t;_rg>y@75N^4;;tCv1_Po`m7`W*SL-Bw6u zFm&0bSy7pDp*y5sz^%^d4GWCTR6;9F6k7UfFu#g6>%_5_Ru02y@W}qXhrefvo%rFT zTpXQ&^V@yI*robQSO7L{Fq?kuTF9z6G@{LM0fa0ex0bWF)PAiQoQ_HS1)Js6?}9JB z-*`}w;Q`I`^gcU0@AjJ--sQ{T~*f76Fp2KHacLzJ5k@&${}CJ(EV!62;Pctcf9orcURxL_jDGUDGTOuq59ez8pc>ntAKCKHvGc6|bOesf%zDZS zGtT`zp>$Y|^V#oa`qr#8FCOhod6vt~+A#ODWEyWmRR^-B@4eYz5sm6X#}|2!n|cx@ z1CqTW8(@*C9;JNfg^t-sbd+%!JGvwqP$Jd=Eo5y!DC@LL#a-A^GpVydvChrEyS5vk zA6ZrbqG6&fJ({voy6+7Y^bdCLjKIvKa1;Wq!DANk@LVA_Bs}@GY9)YNcn|D;CRSry zOO5~d$WgV9as;irab@xn9D!Hua>eQP7r_#of7s*Vd92i{V#b+KP}F+PQp@QS3( zl9+(_b0_DgwZSnqpPG9b>Z`wZ)d_4os*_C3_#*<^wf_!S{>zO%Nt~*f9!Ab<<<%~< zU7~;0b#Fnc^Gm1jVKc+i)XPyXOKcXT?rx#@Y!~ma>p4*r)eQq(Rn+-nt=Lapt5QxT z)dK#fA!+xFC>pL5K@{OTC!(r5E1}d52rwHc%d;z{J>47{A93EQKy(7BJIK*RrKAF+ z2hqW@Z|xViB=pj<*aGe)mP|SS5?$(NR z-cUwGytLU2Q=|#2D%boff9fwWQs%~2Dww=W3axSb>Lhzy#V}w8pJJq9`TMNqd)u>m zz9^)4Y|y376}=S`4l8^du2*D}HSy}pGdB02-9YgJ4M)z$KVvjWomo4(@OWlKQV9va z4HIY7Ao22uu6J8rkRr2tLk@_`hvR@pcqTpTJ4Y_&pkDdHx3~|Uv{vv()o4=fh zRqyWrp&yPiBcM=p1ahJCicm*_l9`ZHX(SRqYkR+y+l(%7UCAKB5wr53c_ zFzaH-p0l$jf2Hng+$n0~t~Orc%Tm65eXW`#K)wj^$1vj6kS*#X5Bq2G2i#l} zpI>NHxE!>7gr_8XRQE{osjaB{>6c`yrYa2P;q9Lu1}hkT_{`f*a5npjM2|X<5#yh) z^O2MZ3D-#KfLx!jOj_MdYyz)ObZ=6_Pk5tp1*7#m4|LWZUEc!(DHVD^TmM!0FJ%D10tL#FIk&X-bwyC>`;zI8_+N)FLlaf?$ zJ9B)khq~+1_;njEvg4f4+hz*=?v&CEMugYdYs#8Pac4wBeTWJ=_p^R zr4X4MaTQ_=k(sJ~NFQ@qN_J~#$cpgdJt9O{pl&$<{l{0O4UbQLv7Gw$dHvT9cR#fy zdOYZIjeCj8`l+3$XzCr$YVYAIh&H{mWpUna9s*mG-DqF2mu>M=&ZBoUVq*AgqlDd0 zd%nNGmthcJDGsYeuFHIH~GoIZ&zlY|NLM6|iQ`h~Do;Wi!P?JE}mz;QbM) z4s)3X>YDNB49dx4R?YL>2{-#uq;m7czYV@F7Vk*cr2@L-azJ7pN(9Y~r^H>moL0D0 zz92diE8uwA5O)<217WovvX#A_WEwiqsfTJmqp3fhgmo;|?+_f_||Zdd6L`; zxKR|3O1xRiw=1W^yD(zGk*T2>3);})J~n-q-K3)e0FdkiD+cezQ1(^}xPiYn{nJO- zOFc^k9_r=Gl`lGrR$>pcOow)9g6{Rd0vtIZqo0U-ETNL)F@Pet3FI->-75d`q4=ZQ z(7v6rOXS4QWd$~#s(z$bw#T~%!I*nFv?A1pirh?UO25*T+GsSO82CA$+@J#h0OhA# z5}w8FWwajve61srL|IvYL*Nc;mNhl-KTh2*o~w*z87!xAoHt*C{J?2Uk5qQ~^qp7% z*$a(y9&^r?sCVb_%Djd}LrX@X;K@9=8lUJ*>ZCPO7X8dEnUwL5ABHwTbn0fh2+tos z@jeax>lYgJX4IYU{xXRc58{C)nQ-1=tGxQ7RmbhvA`b3gK2?>g5Cr1KsxBUgPASKk zKR`)|blXqG%z0<}xs~e%WtP)RN9hzG21qARk?eI;OGyEO=U1WcAMXu(v_Y>W>ZWj5 zbw5=1R!oc-^pN%&Mo@sb%Iw#@ zr%6c^kli-RJ<#8VW`yhf=LauNc(()8bNSP_xQ4?Fo$HO)194nV(|neYW_}m7u@q;Y zTL*A2$!@DbC+c&!hF%zx3b7F*>p6!DL$5%LH!5|`vGAka=ykaQlkHphF$9@gRn7%? z4&qThXdM)D;hJ|c!lhU($)r^yow@_=uvIEnr*BNd-Ya_?}`mFb$0 z;8Bc-`&g85=7t)T5S3*)rY|vg0V_CGxO(mJmLDq)9ZJnnqy^UC{FwRkroEGXn~4eY zbH3RO-AES!JwvdVU0bL2>c^3Iu3v`v6!w4(5YQt`X!fx zUrphCexA;^$Wes~z`{{%;p_CqLt$ZU;IlU+RoG2fhHJ0HAZ|@H8OpfSA z9SLmh59E@TbN##->cMs1YWka|oOOTR?PQ=H3-|j0?97@h?&Iv1k*!^EcW)uQo$J=} z^_;N`g%s1kjnQ{UEqUZG;ibB^hnl!NBg0ewD-=|KT=Cve}4gQs1HFb+QG}eYSkXiuernritVudj$$GOg3eW9oCAd z#i^x=BfaSAvRTTm)8t#o!qA$B(QI0wepEtSou~0^oi-Bmhw?>~d55EP5J#|gdlN*J z5!3hfmv4yJKbls3k}O5;>e6ne4C(E%rEcsStP~!VqTdhbOAXX0Jo3Igu6uMV)1t&s zQooCgQRy2OdsI`RxX-@5Aq#QCQ2L_VrPhV6;Yfpi^i-WVs~Gl1>&Rilq?UDE9(vp_S&H z6<3@yS2LL^g2J&2*{+nAZx5SlHADFwpvQ_5-Kb1_`vI8)=)_ZdGuJAVFl9r+-Gg75 z2^{wz@_Wl)4Dvl@G|F1n)Z+EMVu%-hW~u#@s9GM4(|ydOEJVDJA{9B|vtn97d>5`} z_3ZW2DvZ^9*5yWzh-INQslMV6<5Sw&Rbpxy0p24hSHG>QWpD5rOLF?$yf+EG&e*jj z!M+xn?CRChsKYMhqbB~{=^K&7J(izr*>}&YLyPWM<4yg$T_{rsYB+tX&B~(Nsb%B= z(BGeKzrpT3*0mS5px^+Ebrgn>gs5+erURGxY&3bwtXM zfY#e%ha=4VHIl&40YF`r@Um<)VYb9>5r^wUGly(x{yzP@j-2{>Ff$z-%T;UFuG|z^mQqAE!u#xz|RqF zk+Jt;P8|%W-s*&RBo|w+g?a$r;#Coedj(-sO}xm}iAVqd zs||vsGN>Ow@Di{C<%v%$YBB{U&O3K!ED1F2s%lx!1khy>v6kQCSZ}UP8-y4t_MTwX zNIdbJy&{FmH=(V;TtRvSHuXhQtZZ!kG70%N${Rpun?|HPSAT&Y#*N=X)BO?O%69To}oud7Ev znn$l#*h;MDl-RyXE0Ak0h5=7#ajV2~YNVXbzUnQ3R;+UDBUg)(uY%S$Gpgt9L|!sD z_wmkxDrnzf-!!C;R$KK(s%VMz5PXi(6Jd^3Z~bDeHv@*r7hSKYa2qekLtS@p=Nxp3 zF0=d??x2)6DHVLvvG!t_0;OoCAM|ZQk8tA(GC$AbxWq8;keQJ$gQN}@&uPVFRWA;y zU=tz@Kl zHzNlibxV&mE^E^OCh_tO+Z1R=t{25@upg9F<)FLR_om_o4tR{*39j3BsD^A_THipA&rISNrusJ;mUqr zDt4lP4D$P>p*}i$@n^;Dnqiw5*Ev1foUOd_*3H9COCiir=MIYa&*;5e&bF@@G_@!S{LbJUoMS+GFx#X&8NdL`w5o zdK9NZ=lIuz4!5h!()srkG@<uqGkVNV$hqE*;<9r6JYhX+M1 zq_;BF5jdJEd=~mM+9J$oGxust{xRB5oNqutI(cJ1;wm=Y`};_XNhyF3@Qv(hhs1Fu zb;3RuId(l!e{A)cQ87*DQOK=P)o9g(!R}mZ>rlF4u~*S4yxDHGov2F%aEWMPe*s`(W?B=kI49ehj;3 z>du9z*K&f9l!Ldk@tGH_(S_N5u9ezstfGF#BIQt|P-tJ?*A%XT3yz8!E~m2t6_I=? z`&Z+#k8P3;ABZ{~hA!xx`m=1uRuBLVlE7`IpaG38;irLNp~#H1NmKRiiCsEkzobOu zKpa9piy_xsJ=DfE8?8+?vl*Ql`!#MTJ)>cv_RajJFyHUl1qdbJgxgN0t*i>s|FRzm zUw>zLbbl;|QAeWFrca)zAN{zwU@CZSe^KbLSF6Ber)rwX($nssZ?nLEK~s58A(Any z#Cm9#Yov@JmP|Mr8`S>hkQ%JxC7)3~Y||viru7wOS_iiR`u@YTnqv_ssn1z(Q(o}% zz$5`2U|TH@1}iV)tO*_McbdSKKU(O`u9_xeEW$!ws_cq$Q`M`n9C-KDI16rnlfiOM zeB3ByWkN$^?t>f)*?KYYu?eOQ^g3}Az(z#*S4Q{P6bI^I)1EI;LNBhHL^@hG4HbP& zD$l5&50j{qbLPIaaQGCRJXFMNnbmHWk+*vG_in*}>yNR{qU|4sm;YnG{(H{^Ucjc6 zQGGK|JCq*d)-r&!OlesaHy!9MOEcx@EwxkbNmH{P>r$vFVB$S(_-CQu^`r;OvHz*% z+3~ymu^oi=~#R`Zt>JI`}D~(YIxeJ=yE~yoC4f z$i6H2e)aeo9vfjG0TywZw)cQ(xu2@M>PC`%djbL(Z8lKXlsmbZ=CCrhvioYy`}kI) z76Q96bw;=L_TBDGswJMblpZN`C@uZ^i*xqxLDJC(aI`<=NJkJE5ivZ zQ+iYC=s&HDHWqQL0#OSmfhy{KSN9ly-$lfML79O|P9B2ltNt2Nd-5Ki;(7+iL*zd4-97%xW9xZ~7CS?3;d!t`is_u#S`uQc%csDy zv(Iq6fd2e3!}_N5=Ia-+JsvYuf9%t-2Rea;BlR7xN1lkkJyK@O|9J^>FPHdACR*j6b9uj* z7?U^b1N2y^435Vr2F0`qyEI@aa^RCP-Pv2JaLrr~55~nDkxq~!)oTj-I_$K`4j!CL ze@s6Ry$3VYkig?rsKszOF;RvgA44@gWCR}MA_kNyL@*B3&g$g2axylSp%kWqN^fs- z;qV-Ip3|;3I_!#Zc=P9-T=A_c&mDW22kkot$>&v%5`@bhG2Nq2wDIUk2fX4XSs_Y2Oy1b_iuK&0X{^(#_f=`b?d4JQ z&eWMbXP^&KudR2=Vl+Z0Qc)i{uHE@X1XR+C6+Qs5M+4*O`XYNSa80xJ4T0~LDaV;3l!Eq`Lo=H|vpAW0NdEa$f;SvAul5!WT3}cQeIG4b`_Lf@GBUxD zpGP=yRu7~r`q*#$c~jn4(ZLIsY5Ue*_^*AugK5JmjdsI7WW7AsZ=A&z!$)=XlY;lZ zV08Bjg6rwssq#bo5VwEfNRoMvEx2c5mx?YjAIFz638PEB)WrD(FpZ(+7`~o)0Ot~T z7-)=Ffyp|Q@jRbbft(y;;k1ahVO_O#gQtk<8@I?_9JhM)cyI(|v?a3q<;8t#BJz4q z(k&iQLH%znfDV2}{1%z$jPHC)$p56&%RK5#^0B7Ip=w4$ig`5XXwp#S<{sP2Y$$3!mD%0Ymx$rN$G)4$x zguiJ<}woe4?c@auy#}cRk^87Gr{# zh%uw^QCFb+V=UvnFfQlVg%eH3Y$4{f2wcRT?a4CR-KrR>r}%DKvY_;J$8P<<$LOrDpHUf>^B)I=B!H(Z(4;_Xg#; z@G7_ML;0gIls-m`8#Znn0*|G+HHOb}P}$TfK7Xbp`(@SXkvS35^~gBq`aKa|*Yx#k zUSH9vNVHNL_j8oIX}PNXN^Ad8?r!Tt$&{t6lJk4}pQ}c2Y&DL1et2P!lf@4cO8R>y z#35wNWG%n^l9Xw?p*ecXy)S2yD!UY@je017=!o-_yxUV&DO%EBH(}+oBSD6zE#MU} zsv4|jEWBpglioq{U8VrH0?H5oXlroU({xd}x{i7AEr+ao&dhKjo=4-e6j4joz265+ z5e=kx?xY8P=ifujsoh^_W(LJctd`rO@1g;Jz|l3;fr-(p4@_`Tg1%5K7~WV9XGtpo zm5|Fv4B2_9d2N||4C+5N>I{dS%nJ9I>VyE2UF%ZT-nZGC@9a>sY8Q9e2PBsb_;(&u z;rGyQp${Ai3@UGZ@pK}7i{Rco$tMzVsB$p{9nW{}3<8d^rXV8wotl!>;^^SQc4Ay3 zgxbaq8@xgair(7VwNAPZd@mb9mgNdVmV8pNt&+2H=huPJWFYn?+~rQtUv6TpSj~lk zHXx5LE|BWKPtWYXg|Xght_RkUvpU?`tsi;N!13jVsM*%($M~ zb^h#-nqr6ODOaVy#J(*&HU_x)yDU4Z`9_x}7!z$E$@Ox+tVf`u>=CJk^9Cm-r?lM# z2a68m1pTF?X;=NO2{cy7E;>Dxx8y}fXiEX@^K#6}#~8wxJz%IAw+d{1{G?vCx9Erl z)4n+u%B%-q#eKG#{w}OmI&M+Wk>keOX$D6(#$$w^>#b!l2lQ(NfggUS@T365u;^ zM)1<7+$$=jcG)}7{j3FY>mno5H>I!ajZ9^#U*L?=R1z^Q&0Vx3_6Gt5B*WI)4%*A0 z01LTQ%Don6d*J+t6mNCUcq%y`W3F8~%4Pfcla}1d1vbqx8GdGIqBI8pqeVN%HTAL- z9rM*M3S;%{v3|LJ_C4L-o1L)!_DS4|3;fG3rm5x;al|1Td%JVq%8Kd|v*c+UB+JC;0UOb**|J=hZr-2XoRz_WVF|Q7IYr-kEcv1PNv#loZ+U)};wF$&mS*r=B2cFmiYnlX%5-11I$ z8h`$~YwYoUq{L(DCvO}461S?L^_sP9pd*V;^5<=2K0n41@cxpvP_D2p>-Fr8)!>LI z)tA6-MsE(V`?PEhb(9@#^k|ac{m9AeDS_IcLbjC8(hNr?Pj@&-NCbj`$-@RsB{v3U zV`q3C(|Q>l088V-;txm{G;m~g)0uM*JLgz_IGb*pYSfh$xhok)WW4AgOMATzKc|R_ z%Os+G>%r*vQ+#?3tTl(Q^-y`_RhwTpA6EaArC^7gaIYj`!09s9%}DvkS{d31<4!kK zq1}&&K4KT;4L|a`I$o}3N!t3{2au?)KDfrLR#flWy53Se?tgguLXhfG2BjS7Qn3&V zqiV8a($@V7Ob(HDSM|gB5lud`gR<A==)=gN+#*Xliu>rY%l zf`dpj_k2}Y)(?6>Rf9IFM{+TC2M;~UCd116Y($s*zw$UA9c-<3699r8VmFeri=0n093dn;eN8DMQpraj9vGc9f5Tf9m;FSx(_I>f)D ztu}GcNgs%0+_JRgJcQvx_BHS4%o^5ELR4#)Ut4V-)<)&VY9sL8JD|L}yGBwVwZb&u z>Y8{EbSzl8<%Iq14y)6aFZtiEsi*IE0M(rme#C4-jmb=jboeWVAUj}?wt!CZB`<4> z5+-92B$I6weVo%Qu1c;O6S4)Wf`a+OJHI*=_JO0lK2WySS|S_+u1QUOjRk0PyO%z_ zuB_Hxm&;K4Gs^+E>Sx?KT=uNbBHLwXFFyVj7)bv{%5*@rz~m*Q4{TAhOBY56mVxPV zicL;rdA={#d294bGpal28AJFOSH0gVXO9|XkzE+)49MNKbjn^h=dlOR{<0Og)u{JE zRU(50s6|DV&m(r@oE1C3sMOlsEaRM>9eqc&IutPA`%EdXfT>$Cvs!5Xj`nyJl;p7E zhM1OQYuBA_fRlnXPX?iN`QED+a+&on-&u3g$5P$Ghp_y@45&}DiU^W3tpZ~|io7G#?|8Fnsxjc20IwaXVj*NJ z&_D@Z%aGYx-#Gv^N4>G?hp~jb9I5m-C9bx&JY&VTaL&>ndjE^JgL<}js8v*XL*L#1 z$*ZCDCW1X+^bNh46NF0bH;@x29lor(?{_n2wVN-VdURvsR;OvmR~pXDQmIvQUBe&V8y zq?JJzeO;o%W_HwDE`EcxFn>fFd+J`&)Y4oQy&bBP@y9_>$u4+Rd#Jb=?P4d_1*b&i zy{#PEC7;p?A?B8Aj`J_qSx_H$VvZ>DP^pJ#|0|pfne=`J6~{pq8)mF$5lhdvg1i2X z%MB%8tc+=%`XSs|vfeRV-fQ^Pmre$H2mDlX-spOORYVZy8fzYwxk?*V3Y74IUNSVs zsTIOk)+!pLpF1}LrBzjGPAi_m0^*R5D>0aXTokpt@ee&(WeKcsmJSN&vNyq`lIQy z$ou(URM7D%s4bWxC-nyWTtj;^EQ{Cpu7a0(c-7iN9H4$bf04E=hV)VJm+&})(j5?i zIZNTOk846xY*|AC2bMB2y7GB`oJMpP0Xby9<cDlzV{P*nW`K=&;6swx-%iYEeP zu(?d0QANqPpC%ABj81))?KTzW^m^*bCecw($yQB4eT7U6FK5W&z*g9IEw-n>=%BRJ zKz6?VUg2|=VqHaLLg6XRreY4Iz?!&>R>U^AKG1qFT|l&t%ZuK^@VxtJ0gB~?4mu$F zAfj89V^&N=uNTf|^4X{y7HifQJfbMYO$QDY1^>gkQF4QQfA==0nO#``4P~@?_gi3iX z^5O?W*;E#iQ}Jro_v(YlHAr+8Tt+=drSBBvlv5Or45Mxyr0<>c!23X(Xc;gSrcQdW z=-7j_ghGsJ4_p$F8zA-T7h7YqBNr;ArsBT9MU=`HrE|hg=0SA{LzxD|!TV4|J%yZ$=;?+X$KDn?W2@G#gmX1j^eA$_}KNk5qe z%Dr@F;!@vgf%HYAbuIbTSqAFXy(>ShO zcCF;Q(rKOvi>7OgzU1sT>%**(O#O(q$o@?09bi*jQNFB1;q4&cxS7{-U|ec08oJ6u zbCPfOYLP;q_!r{@s;1yK9)cSQnmPKSBGCk@g>OeDp}^RVwEC!MScy`_s16U77Wtva z($F2-a7&O9%Ef8sELBk&*3H6eXvcw1L5$n;9@B$EJjDl~p0mRI;nzT(VJ%;V8T=qe zCC3VfhYtk!0WUC{YgRLt??{ebMH0AAW~4@SSyv8RVk{bOKR{`eQZJF|e>8tkswE^; zIMO$L(Eh+rFZNxqm@q2NKlGarGQE&ycep{pou8{34`<~dv?o;T$HCr>!ub_+Z0d#M zc^o_;KpQGuFQ}aSy%Ly32}EO0^eeNNAp!?_pa`wQHcQZK_<}if&feXeeXa>f%hrr_ zCRLIHV2&W7cYAdJprZJfX_qFu6#UYXs-6J?zuP^qNcow%mGi`hOT5PGf z@oC-L)F%7rxJE_O4uscan82)mnQEc$u2G@GhS9)aMKQ%C5gZwjI)x&QTdM;dwo7Fs zK54B_NglX@Lndd>u+($Sk@ip!y~#&WCIrk0CWB7D!Jh+h0y1I?9S3{qJoI>+MmqZk z@?~}sw`gbG?;f)_m9p_-qncQZ$M*QYX7&&pdJI2U$`~DR_iprC0Of({qmVv`KGCmF zZE|CT2);b|{74STO}GNVlv=V(Xo7&rJvs^{ryo5zgI{e{YPLfRlHwdnWtdu(jjz;?NA}O@Hcqs1)6B;5hi*L{ zK1u93og4Tl&U?6TW3I~ej2h~+H<~DmDW;-gcauJ6xhD#?9=Vy}#4$JZA`Q3#WC_tN zPyPl}C$Lu=DboilhXMGaDQs9Yfmj~#_MCmYnw7lS8ua^x$gaDnMh~cv305}5uKPi2 zf;qgVD`PuraWQq2wjYtJjf_q&xp^hLU5GzGr*<~W&AurItzSMEn77@?^ZHPN=(|8V z^Pd8{5Tv?U*FU*uWL;*zmK?99^+8P}g?P|1EXmD)VPUP<-*_czD0^b)7l3ozP#v!a z-E9_3d?v4G4xa$%g-nWWHf+e+dN_Oh5VT3E%N@26Lv zW4%;Qr&=n^A@ z(g++CPrSYYP`Y31J6Y1i%u1l&IUVUt4i`QhVHI!$n>f^4l3}qI<5yn6o0g)0 zhN0VmIH2`jQp(Xlj;@a_%c>JQqMu_8+z*@s$@>trry{`tJ>bVh6ED$L-nwf2)K<2- zxH@1>h#Xr-p4r&t;392zOAH@M>f^n3K6VE!Ir+tA3ID5x{vcaIo%K!3iUoP8S^ZzG z3UWJOgGuSj6P`RN#HK;-x0knAqXJVGi|aF$z8d8{3Y4i~xW`>ehkXkDMCXT_Crx%K zWG?{SXSoB6Dq8ee0N5mr-ej(!7x>b*x{GyfhqBX4)l1Gjw&HsRoPCp@6|;`=We!e^ z6LOPklJkX{@8Zc?hKh9qinV*#h}-4B9LjZLO7Av-VlStW;Zf3e!w7NhD{Bx>Q2ZfC z=Zi&8Jm%$F3NIn2>!!`^)K9c6u$Wxt2KT=v88J|h{kGLYLw@^Ej~tKScN!PSML2Kv zSNxQ3$=&(KoZljD6Iw1=Os+U`Q3@NhW>v|dCCskL0-K>yd26efS97ltpOph3IAF(p zq~U7lP^%0i$UKo|8HU?{TYtAmA;sM{qhYCd&R_1-&|KwZ08_I9=j`X;wXPe6QoxAE zKE_z z6qN|OnJ~Qk;dai9!g|(Ys7Rt_Wg0o$eh4T5l(Uw9O4?!uYfFJg>~aF{@&>GzHddz@IYwHX^d7%0Z)#91c8Tpk(j?uWfD4tcauJWm0QFH^`O-+TYDpc zJ)c?A)?GNy6m-3$fJNpu4-hw-7g@3wmwgdS@no3#R_~>9EtNwfKWP1Rj@i1}izq>w z9CLo@crTsaGBKTO(nS(L`sI#y>;;v>#^*dkl~5P%ew!1~|I@bQnvU4@oQtxYRx=+) zbDZ|Kap8P4HJKjd5tXyu^Btz&YPKwlrRZ^dF|v{BXj!O{W^RA?o3K_zxw>|(Z??)| z`w8Jn@245hemJ(?^>@9@XY+As=Es*0w;7f$bUVJqOG26b)U~^tK5teL6KUwXU+*kCb{cc`Ti;OnNW0vh)C`L;t865^kryT}09dr^Xq)sV?-22_V~A9~bJgy=EP#=c`R z?h&iB>UL;VL3qo9b3umV1kEf)aB&#Iot4T?PM9Pk2X+HRdCyQbGVgg2ktY_k-V2CT zFkx)E{)}{s3xMl^(!*T}uE-f)z2;}^CeLb<36YJaKU3vXHGY2Hn{H1MoirUg*gB#h zelV2d=36o))^weB7)^|5w%eIheiEBDM{qwHci4Vv=*7XRNqgQ*EZbfO&o4^8YlI;W zf9@|=U2wPJxDNW$6lQqC8~U;KH=olr&7fPhxHygWwV7GiR4se1T%5qY(T%3&lbmWj zGmu&_3{@b6TV)~P{wGge!<}W!IXZl)yd+PyQ1#ZCG;QhT1j|S)IVxNkQx2opw zBadZ^aaP$i+i8#w=%ih<3L;yY|8Yj&Nr(e^=9=A|#Rp_6--Y((<6jW;TYZuy!V}-v zqxepZ^=Ey)H38XSMAwuK|L-!zoX7E?QH}n7ian#S3l%TS8o@o{#F(u6X;4P!VEy~A ztA>1wVD5Bjt;F5uuBldbie5OV6Jw^eCfx;qjhMGiO)F|34n2eSnRjX*q~zEw8Wv*l znSClSiaix%?q4_zJ9;HgG@14~Z}AE%cp{=7cO-%`6?yxbgdB@=!r>}kd#?WWK}QL>bH#+Gusuts*qW~(K995h zhV3Uv?fnScWie6^{TX_&zazA>BP`Bp0S}Aakhpt5aDwpIQugYe)w#-1(8T2J`8WJT zSkL>0F>`txUp_OQ!ROHdEz|T>6>kON;vrs}Pv>?FQ5iy89W3fJL;QKFMvMZXpnN3(`0v>$BFe_A{T)JvQ_X*frGlEIpI) zEc<%(QKM+w1t#f9gZ-*FkBB;QC@o{N@ZH^n3aiNViP8 z^wIo)Lm9UMKMK$*N%CVVKzwt{ja9M7ewIU9_0>*TP}^~#i>Y((#Rx0olae}muXp^Kv<|W0 zn}xPHV+ynYZD|-=|GJu0G{$grSfA@%ezJWpNt(A^KRwmO_0%h|V^-G&7i*>P)Dm%% zHqmb%?!OogPi{~@Uc~5dSrw!sZkvmmW=*2G!=AZJ1P!%V_o!3!j6E5v2CjfH?WZDP zkwk1v-^zDlrnpw8PVduq+IJc;(u^m(yLL|HOurzV=`)%k^uuQ*;BAi;yA*7EP@k;j z3-c@%yN0WYLr%-I3FsHAY4KX%>zm5m#G&eJkD@66GnEg}6)$v1@R3koH$KU$5f62F z4|@_@u*w`YL%zgvy_mMQwg1uq^%aP`FSHs(zufReGKUpqoh1!yYAggKhy^>DpMH5# z1D#^4B4cUFWaYE>p(>OuQ`{jZf7;pRYm%a-zNB)x60?eeW#eu7y1ZF3)$sHM$>=Mz z9*w;G+#)f&)^}UfvGTD8b%aNJ92a*ASr<#JH#BB>eBNhkeKHGm+;<<4LABP9X-@0y zm~TwJpB!`EnGDxW3y&jrpjx-3xw3AG)Iye{ocD&c(x7v~*Qnbu01d{zJYa4|V{vV?0D2)E{ z4|=2)%};yXjWY|QG1I;B)pV=`F(*bpWLqTmW zRE{y*0syhdSTkIAVj`&SO+Px{d;U=vlVOrddGUNwskU`kM!81?oPnGEcQ4PD@C2A% zX?x%U0t0m%25sLh4+NMlC)%x4qp}!`Znzs$4&~3i6yDPb8u#aG%`<540G%lP!_$G! zHaH7GOp&=W`QtO|+^C+XW#xwUKH1E|;IG(lRaT;1(Gs zEVdDNDy{X_YWFbgR#3j#qxDFijV(HKV#6_RP4DNk^P7caHeW7fU;b;W#NWrgdbB!o zxJ?yzB=e^A2KVV6`^^#PO>Z^G|n& z0U|C8dJ$>MvcVc?1@F&W*M zVwQ%$Ks2+}gIp#>>rAV!&p8ilKYzoOx0qyQ9Du$v6bQQpKR^1uVjh_r0zJjDyEhjK zRM}9E%Fi%1;ZbkQ@lM-Iqz8fZRTm#F4}N-SLtA*$0jZ%md(DUUPjK9 z7v(%qAS4~i5PG1^ZlSu}+FGiW-(CzgB{NjEa=?l>at!Ho41>3{ObAm86)u;n=O?A# zQ1@Ilqcm~#z%Sos^_U5Tnq;U@ybY4DAHTlqKK9~bF7X6Tdh6^?iU&Ts9;8;#E~1#=iahaVkaqdU8LGGb zn)i06uOa&cod2f15lZ3%Je5*|ctQM+=LHg0HTHxSgd!E(P<84<&S#@G%|DGPJe`&T znRW}27nq8zT+VK&TxpexxbuUr`-Od*I>bj(@CSDeqQ7?T39J$f!%clsCg=P={y^CK z85dx@o^w~$MUpuop<4^N8S}{1hS&F%aHpNtpP`=lUFm884b7;oMd&~G*T(^-08-e+ zLhpyicpd-k_1q=7hmN?G40>3}Vz`HEg6xzQ7Vh@}^Nt35==Okq_*CuH>0^b>|DtTZ-#EVgVp!xm%A7vmf!hwWX-ZcE2^z`3P1G7Z@28fZD56%+SGh%@X06P>@ z#wrhWvi@0oOn%}`9<3Y`vwqE|W83%tcxf*M^t6DJodSP<&p&Vf?@jOtQ>(CE%G!+g zKlazLK=04xY6KL#TsxKQ_}Ak6_m2GYZ~q>mq%71}%-Cy2T>8Ho&IB6_hyS$H*1yO1 z55M-Gcy=rX6j&?2!}xzUoO*3c$;Y{f#lIlh|1>xEsRb~#v{TM6mHsb>Q-@*PU%oT+ zKeyDsC*=48+;;%}wJd6{GUI>y>!0k@zdu7AfT<2(dr|xkTIBzn_J4ii%{tJ*V`H~G zRsLZL{{4ObST!gS20FO*cdLKAdH?vg-{YEjh#^8Q;phH``iI~D_+OLvh95)TuX{c7 zkDBm*{M+xv=m^G?Rt=Ns;r#y9|8biB-^K^X_BHN2@W_FR+=$`d?(haf>%Ax-qDFz{ zHRDVXgl=0?Kog}k$bh7NGyw%yM8(k|AH6yb0#YT0|DvHn-;HrWPWp{}NTmgL=J(^K z$$nMN!06BBj%#dOO3RmYz#S(@~Jyy7pyY2>uRRdD|S zKTrpXVy&SMUVu&}0(4t-0Qb4L-u><6sm?q@h0a8A{LcKj1iiu`8~nx`66D^Z>mJs( z{#f$|vYpx55^L~W(a?&v7egKu4u_@`ToBCW%>0~*rjXUwVFF!5?>cS*@0Pp;l4mSMB97BZH)*bQdK>~hY zCkjF?@jK`VbpRaUn-`$}$aBKrxz_$X^-<9AiP076`{b$7kKQj?V~tbdV*h1^pgXW#bw)xRI;e$J1LA5dNzc35TEx z^Lf1^uQ>0!@X1&OsJ!PDUV<*m)@kRhK4qW7*slPI<1$*zatWq#u?nmduws2RVh@}T z9L%OwpvUOoeii3`+Hd`9;M|}tlwxyA_Wq>__YwOnz~M93@d8zR2N0Ma@dgo2P^i_Q zd3S<}E-+Y`9;_Y*rib1amNh^$+kZ4KPDvKZtL?-Kpjc+E1Df(r04W-F72IJU>u`}*ZPam^gr)I4UK=nM1eP1!z0=G zw}A4h?Cv_izGU5xg?$5^TLB=K@K@sMf2N>5EQ5fJv1bwWWG_(xHm};R5Hi?x9F+ z^t4UlJAe6lv?6DOz%~0+1zAqr5pK*;8~xt1p^)PttM9~4^5Q19trs2pCko$s=dteg z_J)R-(afyY zf~-rXhsDAr$`J^iaNGx41B1CuByD_oC4wXjuUi}eGk0mh2Ss$(T ze^I+pJ|NM&Q#d}DXZA&{0|wuDbN0`rb!1m=GPFgV+XILzYw(5hwUD?Z*XldCoAw_X z#sFdlEPwB`)9FCHH9uGVAnt~5^-z(w+x=kp~S(;8@85gvJwPJVSK}ZtD&O z0C1_x1&V$?a~Gns0dt zcAgw`+X0pK{_6fthaV6C%mKLLU)4m zXWedB-5~7L4vO>D0SOUW!mz|b5opS9bbsCxBrV$-3VF*_c6N7_`|L5Rtc}+bUD05< zgadzti~;fUBseFJ2#R)GfNaaH)Xq|E6jdwvt@4J&DdN%An=wvI*k}%5sc85Ej*lSF zO&0VfEC8(y@z)zlJKk08Zz}+qwU~nN`y$S*{e0rObm9CMkI$~1&|))-ui-TVMwczW zMp}f*i3F3cp5+@7j!ii3UiowV*ZS}%uaMu-Mzgoh7V)UGzFa2-Vp8camKL1fGv>5X zj*CATM0zL}SxJtvnC-1iOcc!NXHcrO;$Jc>>i01&>>6!=96kP|Q((<0q!5jBKINbX zpb}mrBB@6I*xT*-OVL^rA`l&8FR(^geYx{{&JHx>CGP-! z^VIPg2tjYa$ekHq3169Ay8<(@l?C#@@Wj{wqD&?-W>!X%%QJ^V2qtDmdaKm z3oN1M+y_gKUvTMt>8Wy!6>zI7#jp%RT{{JiJu8S{BB9D#ISs5KDY&e6_Ea^u!J_TE z8}7i@^~puwD}qT}tOaH0;XxYR1fvzS$76$Hx%V6dkPQi!fZ0S>S^fd1H_ z>O^DE?jh9Ow9{cLa)P5RPrCmXx7dHCnCzP;I;kV(KmPb@zD;9)8jMo6WL+-K2D6ca zQ0b#l2X2QusZsAaU$JO3lb86pcV{>N4@JJMUuu4|F>DHC9`Bag>}zkR39mdCN`ROE zt-UMwmWyEnG zp@SJ38C3$_JF`K-Ee zxy5`50R!aov#Lp}i%8wu7C(YyWbt6>OmnWykt=SR?zkuou%Mh#`G%ET&*^BtO9zmY z-x~uC)*0O`7}g^Hkvs9n>tiqlkm}^B%~xkn;k*V+)e~uwo@b=WMza8UuFg3Cq@^Qv zq)@lL>H)8%+_wu&WM{XY=V+4sy*dp(X)=6v$<}B4E$h4**U%D~4m7_aH!6K~*`3ZU zdhbvf=8f#g84oy)#tS_@*!tRwRT~8~mN|i5kDLM(!T4W&xn9WPrNg8yNM=eG@-9|08LPxHh`|ZzlQoOt}{%|rK^?asJ_1kOt@bneX zJ`ehWoG0Nr&>c1`Tspa)63J=XPOMEymE+#R&+5N@)chnB@Mm6b4Pyj(&um+x_%o3O zk)%k_csTdaQubloK3FEP|O4ED^r?|XIp{1@VfwvH-8`|Zt2C@k<`C%wEwf}`coGaWoV8GW9;vj z-TnJtfRgfqo=LR}i!11kCxEd5jt1xio{fNlVFZ|ZgcCL?q~F0Faz*OGPFf#SYNFm* z9^m&=VY?Mgfja8j7eZvnkp)*XOJ1#&FKF2dus!49Vy^aH>!07exkGP%gfCK70ff%a zLkWE$bi|u8pqcpaJ?zY@{IvqZU8H|k4*m1sYrRztIYv)9h95HjFV~Un*uH-c0NpE&wAT~CnK^=%@QnkqnHeZ6D&HdHZ~&C&sS5UvX!MwTK0XmGW|+(Jj{^bf z>(9W*$-|=b%Z}?0seg1AgGIoLzel?8$8V{HY@EcwCgc2zkZ&JZOmTy;9RSH>Y2s=6 zMU}1%1}3b&9^>wtYk*4$_DR&JzNoRS2R>)=&04o7_tgV*Qcz>L&)zYJz_4~(An80i zEzf+C9RpJhWy!2my=J z{|4(V+5EKPcUKUQ=L2YjXZrV3WXnts{1-lv;ytbUU^m08jH^(lz(gjsqWE8_(*Lwc zKw1kvnd7rx{Qi1yXiQIopnj>~cruVIUcdAOV~TxY8Zd2%9-WBvKvM0$JAP(3e5zyb z;r&m^EcZXWb)i#wNtMR=O5*;-tGzG7!io{ie6DLL^9hG93TnseggpxMcMbV)eCFK@ zWS1(6FPy&d<}BE(PR`E!*5x$VC;pa-iot|v_#C+;CcG_{-3^?GTZh=;>{=9xh4L?BJv>7xausqcPTImS=!^P;EjXrCqaT!k_;ceUkBV@qRd@JJ+>fs- zmEA%250^{*dB8-{PUdTVD+SnQlz6ZaK@yzH=E%^;zrXpDfIQ#|n)A4=^AbCMts^y%7n4D4G`B`NUh8CuyOjIZ z6pyvP)|j7<06QUdASTA-8VJ&%KgsbLg=Gv>$rNJD2WiKUh!_QnCnQM?8c_zC|0Z1o}<@!RVw zj^ftuD4FQa1IXQuOR%HIXXUt%4$|=i$(oIq-&HcQAiv9hJDur#)P*DJ#EwtfQ@#>BsONe+dr-o5GC0G0wi7J@$b#TCB{<_Ch+!1YYmqV^0Xb}!MK@QN}{bDOe4Ah zXVCJ+c%9WZ*OE(xc?$;F`}RM1_Ar*m2f$S(ZWZeSS-o#)H2YB5ym~HG+~3byai!38 z1YekBT39`Iof)-eH#I-GW)(7#qbYmf+K7B){*LjnQ<`zQuOAC;oohuiolEGXeqj{M zmpZl5Rb9Y2huApSpWGk)U$J^QS%!N2(8Auyg zzi1P4(7$PbsfGRgz3Fn2SuEXnwS_Lzns}gUzaEP}UL`U+eNV4E7bNbn z79|j;csc7tOXdpN2Y(tnLfW^ghYG)breRr(VpC6y5F@lCi+HtR54z=oe**J%yb<}z zXPRY{N|{MjTQ(F}PgKDa=k=y#DY`JI1U%7{;v#0CX0*3>HD2w?)(_fye~Rn+9qz4F z2Jd06q#psQlmChHb#eoE)9eg|Z{7rtieQeeR;FM4`>|fkPIClPW&63C7qLFLA7`tr zbQy2(Hxws#2mi*DIk^hh!I*wWHTT<5n%j`ZU)1aW%2j2V?}TjW6cA`1VurgEVml7< z6JVvGCGSrpW^bVOG15xj#J*TyaAF|lacE7!%;c-pS97@73jf(0x475vd`so|g*X3K ztNFij;(tAuuS(cneydw{d_?<~LG3>u+5e6zuT;)z#9MuqV)!k}|4*>_?T4Sb5G{I& zX3o+-B=^q$+t*v%>tTO($Mhdr=cx(lSt#gkjBFu zb|?Y)+Y6CM>$q@oy<~yjp`{K--rq)7C!Y`Z=_(8EqC-Xdzklm*Nx^@=v^#gfTe~QE z?egD~_5c0b+d}>z-`cD}4xImg`+6!W3DeZ8G`;`(Py747rq!Li?|;Aee-wV;DF6E} z|G)iJ{&j->eQf^wasJ0c{_kV+?_+Zk*ZzIa|KHEZzk}5O`HcMg*!=(Y*jPvN-2Pwk zvUArS`|RdFK@i-WQ~^xQ29LSA&0%*msg5y9+CP6aF z+x)~s%3t~>FppQEQB;pz=R$`7%g7$}P_;W%v=i(WiQDcA-T1h@6-tkN({SR80d)~? z&Z5`601r?}8PEi}mm>oj zT`K8vISR17@K~MIvUhzoOwoVKVI>N#_B1!1Y^dKo(>4FKIZ1_yo)!yuM?Yo_>%GJD z37hSbN4uaJTl1a&^aDp#>_`3B>DNoIZCu2=t7uZ3zl}k;E#vLdGpFQVIyXh;3>Bna zgM#G(9~3`zzgA(1>XV4NmAvoa~{b(44|PpefMp z2%c@1W?<&NWm5?3MC*FOKo1*yv&gU#Jwr1WdHTg;_KYi9=Z{t^G3_6eR?Zg~*K%pS ztQ;SbB2e3y21RSwA!fz^vs>e{Tv(S7m}7H(>eH@g#}`o9 zwnevUD@o9$f!`cv#DOZRa{Cfh>RbKmb@;Jq*a~=?UA|x&pdgVP`#rAa~4Y*&67ib_K(4xI{^o6v>e}(!5q*qn|2P2-uY2F zh2;2WT;#5hIyMysXlt0aUhhp|u_hyw#42Mg_VpAL{rW7wQ~sonE?Am-TIntq#q$S(s1dMG zzw>e)s_@dV^;nU9CpPWFyt%QT$snh!mb%g(0bW{KKmOKI&``gilJImevF`&$6guJDoEf7Y^BZ+ZWh-)C+okYFhf12{+@DgvwUI!ePD4{!WAnj%%1?mx zehvUmy^s!oIO+t`9;=M!dzRqx_}c6y9{L}x8+Pbv7*=L1k1cl*wC5amF^3Kxb4-(6 zG&pBafV^~*0*^}3GU^wE-nvKo>yOjrDlc~p+J#;&mr|wKzmSdEkkL+!;OTn*vEeM} zn6SN+q51ohlXIshP4Z0bl?8_WN+^a$1E0wB)Qw%Fa5a1s(-yM?)^wSSWrSjzV&HY7 zOgg$$-PHyv(VH;X4wppK}{h&J&_i?$t+3H9&DgjtB|AAF!Mgw*E zS16}?%2Vw>6+@_v5z<6eduh8(#Y7?>)MW4p_ui^mp_rlZHRdp8#r@|(MR_Jg=sX`i z&d4c4@^vW-pjQZxDbg8rP1OvKv%_q0WLGT7z($vz7;=4{&uWTW5_r8V?MCD{WbtjG0l|Ol%*rOT)z44?mb};Rc9^;8>qbobNveHv#V$k|tO9AARN?yDmDv{j^2KTdBj50H z8Lao|LC=HETDQfiD-`2sSPZvgUGebpc)f5*EX)-)RtSH_UAxTN53W3!#Rmnz^Vfe< z%=hO_F}KHcSph0L|kL;JUo17Is^7_!5(t$g?sYyRWa$$&IprsT0MprDxyj34jTZ6znB6CeXx= znbxQifgNDX7A5S7di0dO=q6t+^)J|saW^3HrB;LkNATX&GPG&2RhU#8Mi#0bc`?iR1OEo?GRQ#-ae_i42CQ70jx!4SgnDJM-~w7P#gE zSW_OOS33c2EQ%c+tpua0G1q;)REjwqTa#iL02_oYfUcaT74L!Z8CCn^sgUBIpgAnJ z>LBoVGdj$hHsoO;&vl7gZq0b(@3n0+Jow)FE;(GrC>yT z2ZBkl9^KiB-aG;UmRtlQvis8!DEQ~2br6K@^69;qI$8aSW%vkg;>whO!{`s7cEpjp zkkxstnUp$Be)~lLOOVdlWBuK2@3oFryMA{8-^`}R<_pHeauJdOT=7NAJc99*}2Wio}n%T!ETx~~(iMy)f51_;?(Uh+M{ zKqpz>xxX<@QHWgnhQ1haR2cM92qx6Os7z9k}U90>+J%YY@%2m$P4*U zuMKQEk>V3}-mcF)>oHra!fOmfAUd%wtXu?XUW@pxA^+y4{y@Thvn0J@Y$Czfns(iF zZqxx}w~K1DbupVQ5Z~>)Ds&Z?gHA_groot;Ds=URYAGBqxK&;>W}abfQnO9FMJTb1 z*%YxA?{e(vc4;p+K_nh=fK8q+#aKaAP&&y7*=18pX1HCOVz#N9S~3chBiZ+&1dQ~5 zAaGqNU)7n;I#ye{v#_L15tIxdFE?Asm~LKNtKEzUVO6bi|AekJZ&u@5Tg;yBeQ+y# zNSuRZ^_;?DQm#LHM~q=_1XFh>7!*d$0fG=}U_7RaZp36eN^34$*r7Y`{k1iE6VJO< z@+Q~58{?n?tesWvay$uaA~qgihQbIb_3tVQVKP}j(*%J6hAbV;NIy7O{sc3P1e z&6GIocl8gJr%Ezc(bsqu$x4&vQ*huP{W;nB~OxWz9+t`Iku#OlG1 zG`+FWALF7+UAbMmk#$2_Hj7FAuuXc_WWVo;EaIqcv)?ftaU721xf_3BlEw~+pnDkM zU$D7H+c7l!{5pc8pkgr&dbrd-RCV*<*O_!=>fjPZ<){m+YcI%5NLZ-tY+2mTGDY;{&F%;wa_Sb_3i#d?*}s zDAE?|Q0O#!0N90O_K@4^=0W2jJGC#G1hQnef-lBxR2>&LU989B8Ix7r*M=>(@n&op zW8QfCCnJS@3MlT3jjq@NwT<<3dGRYF_U*9+Q`v8(`AMXnvr z%≫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 @@ -60,3 +62,29 @@ If you encounter problems with the GitHub app, resetting the connection can solv 2. Authorize your account in the [My Profile](https://dashboard.mintlify.com/settings/account) section of your dashboard. + +### Feedback add-ons are unavailable + +If you cannot enable the edit suggestions or raise issues options in your dashboard and your repository is public, revalidate your Git settings. + + + + Go to [Git Settings](https://dashboard.mintlify.com/settings/deployment/git-settings) in your dashboard. + + + Click the green check mark in the corner of the Git settings box to revalidate your repository settings. This will force update your repository settings to reflect whether your repository is public or private. + + + The Git Settings page in the Mintlify dashboard. An orange arrow points to the green check mark that revalidates the repository settings. + The Git Settings page in the Mintlify dashboard. An orange arrow points to the green check mark that revalidates the repository settings. + + + From 6d9f2dbe7ccff11ed22c5210b51c38f99fa09ae5 Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:15:41 -0700 Subject: [PATCH 08/19] Vale improvements (#1212) * update header exceptions * remove FirstPerson rule it mostly flags UI elements like "My profile" * remove Will - too noisy * add drilldown to accept list * update accepted words --- .vale/styles/Google/FirstPerson.yml | 13 ------------- .vale/styles/Google/Headings.yml | 5 ++++- .vale/styles/Google/Will.yml | 7 ------- .../styles/config/vocabularies/Mintlify/accept.txt | 8 +++++++- 4 files changed, 11 insertions(+), 22 deletions(-) delete mode 100644 .vale/styles/Google/FirstPerson.yml delete mode 100644 .vale/styles/Google/Will.yml diff --git a/.vale/styles/Google/FirstPerson.yml b/.vale/styles/Google/FirstPerson.yml deleted file mode 100644 index 0b7b8828c..000000000 --- a/.vale/styles/Google/FirstPerson.yml +++ /dev/null @@ -1,13 +0,0 @@ -extends: existence -message: "Avoid first-person pronouns such as '%s'." -link: 'https://developers.google.com/style/pronouns#personal-pronouns' -ignorecase: true -level: warning -nonword: true -tokens: - - (?:^|\s)I\s - - (?:^|\s)I,\s - - \bI'm\b - - \bme\b - - \bmy\b - - \bmine\b diff --git a/.vale/styles/Google/Headings.yml b/.vale/styles/Google/Headings.yml index 756f95209..6e2645923 100644 --- a/.vale/styles/Google/Headings.yml +++ b/.vale/styles/Google/Headings.yml @@ -7,13 +7,15 @@ match: $sentence exceptions: - API - APIs - - APP - CDN - CORS - CLI + - Cloudflare + - Cloudflare Worker - CSS - DNS - GitHub + - GitHub App - GitLab - HTML - JavaScript @@ -36,4 +38,5 @@ exceptions: - UX - URL - URLs + - Vercel - Windows diff --git a/.vale/styles/Google/Will.yml b/.vale/styles/Google/Will.yml deleted file mode 100644 index 128a91836..000000000 --- a/.vale/styles/Google/Will.yml +++ /dev/null @@ -1,7 +0,0 @@ -extends: existence -message: "Avoid using '%s'." -link: 'https://developers.google.com/style/tense' -ignorecase: true -level: warning -tokens: - - will diff --git a/.vale/styles/config/vocabularies/Mintlify/accept.txt b/.vale/styles/config/vocabularies/Mintlify/accept.txt index 647318c6b..d842eda5d 100644 --- a/.vale/styles/config/vocabularies/Mintlify/accept.txt +++ b/.vale/styles/config/vocabularies/Mintlify/accept.txt @@ -11,6 +11,7 @@ discoverability callout Callouts callouts +drilldown expandables favicon isHidden @@ -92,26 +93,31 @@ RubyGems Rust Spring Storybook +subpath Swift TensorFlow Terraform TypeDoc TypeScript Unix +Vercel +vercel Vite vite Visual Studio Code VS Code Vue Vuex +Webflow +WebKit Webpack webpack -WebKit WebStorm # ============================================================================= # TERMS # ============================================================================= +allowlist APIs args async From 060ac1535b590c10270139a88d03f636de516a8a Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:28:26 -0700 Subject: [PATCH 09/19] Fix vale errors (#1213) * don't lint inside JSON examples * actually don't lint inside JSON snippets * update vocab * fix errors * update vocab * remove latin abbreviations * don't lint snippets * update vocab * don't lint in angle brackets * add language tags * update vocab * regexify vocab list * grammar --- .vale.ini | 3 +- .vale/styles/Google/Quotes.yml | 3 +- .../config/vocabularies/Mintlify/accept.txt | 89 +++++++++++++------ advanced/dashboard/sso.mdx | 4 +- advanced/subpath/route53-cloudfront.mdx | 4 +- changelog.mdx | 6 +- components/cards.mdx | 2 +- guides/auth0.mdx | 4 +- image-embeds.mdx | 2 +- installation.mdx | 2 +- 10 files changed, 76 insertions(+), 43 deletions(-) diff --git a/.vale.ini b/.vale.ini index 9c3a813f9..febeefd3b 100644 --- a/.vale.ini +++ b/.vale.ini @@ -22,7 +22,8 @@ Vale.Avoid = NO # Too aggressive about common technical terms # Token and block ignores for MDX-specific syntax TokenIgnores = (?sm)((?:import|export) .+?$), \ (?)(?!`), \ -(<[A-Z]\w+>.+?<\/[A-Z]\w+>) +(<[A-Z]\w+>.+?<\/[A-Z]\w+>), \ +(<[^>]*>) BlockIgnores = (?sm)^(<\w+\n .*\s\/>)$, \ (?sm)^({.+.*}) diff --git a/.vale/styles/Google/Quotes.yml b/.vale/styles/Google/Quotes.yml index 3cb6f1abd..d8eb51fd3 100644 --- a/.vale/styles/Google/Quotes.yml +++ b/.vale/styles/Google/Quotes.yml @@ -4,4 +4,5 @@ link: 'https://developers.google.com/style/quotation-marks' level: error nonword: true tokens: - - '"[^"]+"[.,?]' + # Match quotes with trailing punctuation, but exclude content in JSON + - '(? Once the application is set up, navigate to the General tab and locate the client ID & client secret. - Please securely provide us with these, along with your Okta instance URL (e.g. `.okta.com`). You can send these via a service like 1Password or SendSafely. + Please securely provide us with these, along with your Okta instance URL (for example, `.okta.com`). You can send these via a service like 1Password or SendSafely. @@ -97,7 +97,7 @@ Use single sign-on to your dashboard via SAML and OIDC. If you use Okta, Google - 1. Under "Enterprise applications", select **New application**. + 1. Under "Enterprise applications," select **New application**. 2. Select **Create your own application** and choose "Integrate any other application you don't find in the gallery (Non-gallery)." diff --git a/advanced/subpath/route53-cloudfront.mdx b/advanced/subpath/route53-cloudfront.mdx index a39be3c41..bcd6589e0 100644 --- a/advanced/subpath/route53-cloudfront.mdx +++ b/advanced/subpath/route53-cloudfront.mdx @@ -70,7 +70,7 @@ All Behaviors must have the an **origin request policy** of `AllViewerExceptHost If you use Vercel, use the `.vercel.app` domain available for every project. -3. Create a new Origin and add your staging URL as the "Origin domain". +3. Create a new Origin and add your staging URL as the "Origin domain." ![CloudFront "Create origin" page with a "Origin domain" input field highlighted.](/images/cloudfront/default-origin.png) @@ -101,7 +101,7 @@ Behaviors in CloudFront enable control over the subpath logic. At a high level, Create behaviors for Vercel domain verification paths with a **Path pattern** of `/.well-known/*` and set **Origin and origin groups** to your docs URL. -For "Cache policy", select **CachingDisabled** to ensure these verification requests pass through without caching. +For "Cache policy," select **CachingDisabled** to ensure these verification requests pass through without caching. ![CloudFront "Create behavior" page with a "Path pattern" of "/.well-known/*" and "Origin and origin groups" pointing to the staging URL.](/images/cloudfront/well-known-policy.png) diff --git a/changelog.mdx b/changelog.mdx index 8a0e11113..45b452f2a 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -184,7 +184,7 @@ noindex: true ## API playground enhancements - New [Search API endpoint](https://mintlify.com/docs/api-reference/assistant/search) so you can build agents and MCP servers on top of your docs - - `openapi` and `asyncapi` files are now served at their specified paths (e.g. `https://mydocsurl.extension/{openapi-or-file-name}.json`) + - `openapi` and `asyncapi` files are now served at their specified paths (for example, `https://mydocsurl.extension/{openapi-or-file-name}.json`) - You can now use the [`x-mint` field in your openapi files](https://mintlify.com/docs/api-playground/openapi-setup#x-mint-extension) to override generated fields, customize preface content, or change endpoint URLs in code samples - [`x-mcp` is now `x-mint.mcp`](https://mintlify.com/docs/api-playground/openapi-setup#mcp) in OpenAPI configurations to control which routes are exposed as MCP tools @@ -426,7 +426,7 @@ noindex: true ## AI Assistant Improvements - New UI with dedicated chat page & pre-filled prompts - - Stability improvements, e.g. bug fixes of editing the wrong file or no files at all + - Stability improvements. For example, bug fixes of editing the wrong file or no files at all - More robust knowledge for adding & editing components - Improved `docs.json` file editing @@ -439,7 +439,7 @@ noindex: true We’ve overhauled the design and performance of the [API Playground](/api-playground/). Updates include: - Easier detail expansion for an overview of a field - - More intuitive nested design, e.g. adding or deleting items + - More intuitive nested design. For example, adding or deleting items - Faster response times ## Quality Improvements diff --git a/components/cards.mdx b/components/cards.mdx index 87323c823..db1151f79 100644 --- a/components/cards.mdx +++ b/components/cards.mdx @@ -107,7 +107,7 @@ Use the [Columns component](/components/columns) to organize multiple cards side - Icon color as a hex code (e.g., `#FF6B6B`). + Icon color as a hex code (for example, `#FF6B6B`). diff --git a/guides/auth0.mdx b/guides/auth0.mdx index 2d3b6843e..f976c7e13 100644 --- a/guides/auth0.mdx +++ b/guides/auth0.mdx @@ -13,7 +13,7 @@ This guide walks you through setting up Auth0 as an authentication provider for - Log in to your Auth0 dashboard and navigate to **Applications** > **Applications**. Click the **Create Application** button, give your application a name (e.g., "Mintlify"), and select **Regular Web Applications** as the application type. Then click **Create**. + Log in to your Auth0 dashboard and navigate to **Applications** > **Applications**. Click the **Create Application** button, give your application a name (for example, "Mintlify"), and select **Regular Web Applications** as the application type. Then click **Create**. ![Creating a new application in Auth0](/images/guides/auth0/auth0-create-application.png) @@ -23,7 +23,7 @@ This guide walks you through setting up Auth0 as an authentication provider for ![Auth0 client settings page](/images/guides/auth0/auth0clientsettings.png) Make note of the following information: - - **Domain**: This is your Auth0 tenant domain (e.g., `your-tenant.auth0.com`) + - **Domain**: This is your Auth0 tenant domain (for example, `your-tenant.auth0.com`) - **Client ID**: The public identifier for your application - **Client Secret**: The secret key for your application (keep this secure) diff --git a/image-embeds.mdx b/image-embeds.mdx index 700030a79..3725e0d14 100644 --- a/image-embeds.mdx +++ b/image-embeds.mdx @@ -32,7 +32,7 @@ Use [Markdown syntax](https://www.markdownguide.org/basic-syntax/#images) to add Always include descriptive alt text to improve accessibility and SEO. The alt text should clearly describe what the image shows. -Image files must be less than 20MB. For larger files, host them on a CDN service like [Amazon S3](https://aws.amazon.com/s3) or [Cloudinary](https://cloudinary.com). +Image files must be less than 20 MB. For larger files, host them on a CDN service like [Amazon S3](https://aws.amazon.com/s3) or [Cloudinary](https://cloudinary.com). ### HTML image embeds diff --git a/installation.mdx b/installation.mdx index 988d4e196..69a05574f 100644 --- a/installation.mdx +++ b/installation.mdx @@ -116,7 +116,7 @@ You can use the CLI to check your OpenAPI file for errors using the following co mint openapi-check ``` -You can pass in a filename (e.g. `./openapi.yaml`) or a URL (e.g. `https://petstore3.swagger.io/api/v3/openapi.json`). +You can pass in a filename (for example, `./openapi.yaml`) or a URL (for example, `https://petstore3.swagger.io/api/v3/openapi.json`). ### Renaming files From bb0204cd17fc7ffc6650147a9d7b5264019c8146 Mon Sep 17 00:00:00 2001 From: Brandon Waselnuk Date: Sat, 20 Sep 2025 18:09:33 -0700 Subject: [PATCH 10/19] changelog added for Sept 14-19 (#1215) * changelog added for Sept 14-19 * Update changelog.mdx Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> * Update changelog.mdx Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> --------- Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> --- changelog.mdx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/changelog.mdx b/changelog.mdx index 45b452f2a..92d56b10e 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -5,6 +5,29 @@ rss: true noindex: true --- + + +## GitLab integration enhancements + +- Enhanced GitLab connection UI in dashboard settings for easier repository management +- Added webhook support for automatic documentation updates on GitLab commits + +## Web editor and authentication improvements + +- Continued app router migration for the web editor, removing blockers and improving performance +- Enhanced login error handling with explicit email validation messages +- Fixed whitespace handling in email address validation + +## Bug fixes and reliability + +- Fixed app router socket update functionality for real-time features +- Fixed SVG path rendering issues in documentation +- Fixed keyboard navigation in search and chat functionality +- Fixed history status endpoint reliability +- Resolved middleware edge cases and onClick event handling issues + + + ## Major releases From 4bc40db8f84513ee40de0aa0ec244f74acf48e97 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 09:48:11 -0700 Subject: [PATCH 11/19] Documentation edits made through Mintlify web editor (#1242) Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> --- api-playground/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-playground/overview.mdx b/api-playground/overview.mdx index cbabdc303..aa0ada383 100644 --- a/api-playground/overview.mdx +++ b/api-playground/overview.mdx @@ -25,7 +25,7 @@ We recommend generating your API playground from an OpenAPI specification. See [ Make sure that your OpenAPI specification file is valid using the [Swagger Editor](https://editor.swagger.io/) or [Mint CLI](https://www.npmjs.com/package/mint). - ```bash {2} + ```bash {3} /your-project |- docs.json |- openapi.json From ca156420f7e1580707781248b2af8e2079629aad Mon Sep 17 00:00:00 2001 From: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> Date: Tue, 23 Sep 2025 15:07:42 -0700 Subject: [PATCH 12/19] hide slack app page (#1250) --- ai/slack-app.mdx | 2 +- docs.json | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ai/slack-app.mdx b/ai/slack-app.mdx index ca2705b90..3335a5834 100644 --- a/ai/slack-app.mdx +++ b/ai/slack-app.mdx @@ -5,7 +5,7 @@ icon: "slack" --- - The Slack app is available for [Pro and Enterprise plans](https://mintlify.com/pricing?ref=slack-app). + The Slack app is available for [Pro and Custom plans](https://mintlify.com/pricing?ref=slack-app). The Slack app adds a bot named `@mintlify` to your Slack workspace that can search your documentation and answer users' questions. The bot responds to direct messages, @mentions, and to any questions in a channel specifically named `#ask-ai`. diff --git a/docs.json b/docs.json index 89c231597..7e738d5e6 100644 --- a/docs.json +++ b/docs.json @@ -58,8 +58,7 @@ "guides/geo", "guides/claude-code", "guides/cursor", - "guides/windsurf", - "ai/slack-app" + "guides/windsurf" ] }, { From bad67622c0648f1bcd4cdbdc97fa6d237a04a07d Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 19:30:13 -0700 Subject: [PATCH 13/19] Updated codeblock styling documentation with new theme options (#1252) * Update settings.mdx * Update code.mdx * Update components/code-groups.mdx * Update settings.mdx * Update code.mdx * Update components/code-groups.mdx * Update settings.mdx * Update code.mdx * Update components/code-groups.mdx * copy edits --------- Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com> --- code.mdx | 2 ++ components/code-groups.mdx | 2 ++ settings.mdx | 48 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/code.mdx b/code.mdx index 9cdebff96..2ea701e37 100644 --- a/code.mdx +++ b/code.mdx @@ -59,6 +59,8 @@ Enable syntax highlighting by specifying the programming language after the open We use [Shiki](https://shiki.style/) for syntax highlighting and support all available languages. See the full list of [languages](https://shiki.style/languages) in Shiki's documentation. +Customize code block themes globally using `styling.codeblocks` in your `docs.json` file. Set simple themes like `system` or `dark`, or configure custom [Shiki themes](https://shiki.style/themes) for light and dark modes. See [Settings](/settings#styling) for detailed configuration options. + ```java class HelloWorld { public static void main(String[] args) { diff --git a/components/code-groups.mdx b/components/code-groups.mdx index a4694711e..f8574ecbc 100644 --- a/components/code-groups.mdx +++ b/components/code-groups.mdx @@ -26,6 +26,8 @@ class HelloWorld { +Code groups inherit global styling from your `docs.json` file. Customize your theme using `styling.codeblocks`. See [Settings](/settings#styling) for configuration options. + ## Creating code groups To create a code group, wrap multiple code blocks with `` tags. Each code block must include a title, which becomes the tab label. diff --git a/settings.mdx b/settings.mdx index 778b78a96..c857b7d62 100644 --- a/settings.mdx +++ b/settings.mdx @@ -127,8 +127,52 @@ See [Themes](themes) for more information. The style of the page eyebrow. Choose `section` to show the section name or `breadcrumbs` to show the full navigation path. Defaults to `section`. - - The theme of the code blocks. Choose `system` to match the site theme or `dark` for always dark code blocks. Defaults to `system`. + + Code block theme configuration. Defaults to `"system"`. + + **Simple options:** + - `"system"`: Match current site mode (light or dark) + - `"dark"`: Always use dark mode + + **Custom theme configuration:** + Use an object to specify [Shiki themes](https://shiki.style/themes). Choose a single theme for both modes or separate themes for light and dark. + + + + A single Shiki theme name to use for both light and dark modes. + + ```json + "styling": { + "codeblocks": { + "theme": "dracula" + } + } + ``` + + + + Separate themes for light and dark modes. + + + + A Shiki theme name for light mode. + + + A Shiki theme name for dark mode. + + ```json + "styling": { + "codeblocks": { + "themes": { + "light": "github-light", + "dark": "github-dark" + } + } + } + ``` + + + From eaf7385af823eae6951b1f30f637a414f273f5bd Mon Sep 17 00:00:00 2001 From: "locadex-agent[bot]" <217277504+locadex-agent[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 23:51:12 +0000 Subject: [PATCH 14/19] chore(locadex): add .locadex/LOCADEX.md --- .locadex/LOCADEX.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .locadex/LOCADEX.md diff --git a/.locadex/LOCADEX.md b/.locadex/LOCADEX.md new file mode 100644 index 000000000..2644b553b --- /dev/null +++ b/.locadex/LOCADEX.md @@ -0,0 +1,23 @@ +# 🌐 Locadex Mintlify i18n + +This Mintlify documentation site is configured to use Locadex for automated internationalization. + +## Configuration: + +- **Working Directory**: `.` +- **Branch Prefix**: `locadex/` +- **Default Locale**: `en` +- **Target Locales**: `en`, `fr`, `es`, `zh` +- **Hide Default Locale**: Enabled +- **Route Example**: `/docs` + +## How it works: + +- Once this setup PR is merged, Locadex will automatically monitor your repository for changes +- Locadex will analyze your Mintlify docs for translatable content and internationalize your changes in your configured locales +- You can configure when Locadex should run (PRs or commits) and whether it should create PRs or commit directly through the General Translation Dashboard + +--- + +Generated by [Locadex](https://generaltranslation.com) • [Documentation](https://generaltranslation.com/docs) +Timestamp: 9/17/2025 From 299383f3771c7eac90b52d812093c1ea6a232bb0 Mon Sep 17 00:00:00 2001 From: Fernando Aviles Date: Wed, 24 Sep 2025 12:30:15 -0700 Subject: [PATCH 15/19] pulling updates to docs --- docs.json | 1179 ++++++++++-- es/advanced/dashboard/permissions.mdx | 21 + es/advanced/dashboard/roles.mdx | 26 + es/advanced/dashboard/sso.mdx | 141 ++ es/advanced/subpath/cloudflare.mdx | 208 +++ es/advanced/subpath/route53-cloudfront.mdx | 237 +++ es/advanced/subpath/vercel.mdx | 99 ++ es/ai/contextual-menu.mdx | 162 ++ es/ai/llmstxt.mdx | 61 + es/ai/markdown-export.mdx | 29 + es/ai/model-context-protocol.mdx | 398 +++++ es/ai/slack-app.mdx | 31 + es/analytics/feedback.mdx | 89 + es/analytics/improving-docs.mdx | 40 + es/analytics/overview.mdx | 29 + es/analytics/search.mdx | 28 + es/api-playground/asyncapi/playground.mdx | 5 + es/api-playground/asyncapi/setup.mdx | 95 + .../customization/adding-sdk-examples.mdx | 49 + .../customization/complex-data-types.mdx | 103 ++ .../managing-page-visibility.mdx | 96 + .../customization/multiple-responses.mdx | 31 + es/api-playground/mdx/authentication.mdx | 105 ++ es/api-playground/mdx/configuration.mdx | 170 ++ es/api-playground/migrating-from-mdx.mdx | 163 ++ es/api-playground/openapi-setup.mdx | 576 ++++++ es/api-playground/overview.mdx | 161 ++ es/api-playground/troubleshooting.mdx | 106 ++ .../assistant/create-assistant-message.mdx | 25 + es/api-reference/assistant/create-topic.mdx | 3 + .../assistant/generate-message.mdx | 3 + es/api-reference/assistant/search.mdx | 3 + es/api-reference/introduction.mdx | 46 + es/api-reference/update/status.mdx | 3 + es/api-reference/update/trigger.mdx | 3 + es/assistant-context.mdx | 9 + .../authentication-setup.mdx | 322 ++++ .../overview.mdx | 74 + .../personalization-setup.mdx | 397 +++++ es/changelog.mdx | 755 ++++++++ es/code.mdx | 365 ++++ es/components/accordions.mdx | 114 ++ es/components/banner.mdx | 44 + es/components/callouts.mdx | 49 + es/components/cards.mdx | 146 ++ es/components/code-groups.mdx | 106 ++ es/components/columns.mdx | 38 + es/components/examples.mdx | 64 + es/components/expandables.mdx | 49 + es/components/fields.mdx | 108 ++ es/components/frames.mdx | 44 + es/components/icons.mdx | 45 + es/components/mermaid-diagrams.mdx | 62 + es/components/panel.mdx | 21 + es/components/responses.mdx | 60 + es/components/steps.mdx | 73 + es/components/tabs.mdx | 73 + es/components/tooltips.mdx | 29 + es/components/update.mdx | 51 + es/contact-support.mdx | 35 + es/editor/branches.mdx | 42 + es/editor/content-management.mdx | 121 ++ es/editor/getting-started.mdx | 92 + es/editor/git-concepts.mdx | 66 + es/editor/keyboard-shortcuts.mdx | 27 + es/editor/publishing.mdx | 79 + es/editor/troubleshooting.mdx | 62 + es/guides/assistant.mdx | 156 ++ es/guides/auth0.mdx | 62 + es/guides/changelogs.mdx | 146 ++ es/guides/claude-code.mdx | 174 ++ es/guides/csp-configuration.mdx | 143 ++ es/guides/cursor.mdx | 433 +++++ es/guides/deployments.mdx | 31 + es/guides/geo.mdx | 129 ++ es/guides/hidden-page-example.mdx | 61 + es/guides/hidden-pages.mdx | 88 + es/guides/migration.mdx | 201 +++ es/guides/monorepo.mdx | 51 + es/guides/windsurf.mdx | 153 ++ es/image-embeds.mdx | 196 ++ es/index.mdx | 53 + es/installation.mdx | 216 +++ es/integrations/analytics/amplitude.mdx | 25 + es/integrations/analytics/clearbit.mdx | 25 + es/integrations/analytics/fathom.mdx | 27 + .../analytics/google-analytics.mdx | 55 + .../analytics/google-tag-manager.mdx | 27 + es/integrations/analytics/heap.mdx | 25 + es/integrations/analytics/hightouch.mdx | 33 + es/integrations/analytics/hotjar.mdx | 14 + es/integrations/analytics/koala.mdx | 25 + es/integrations/analytics/logrocket.mdx | 13 + es/integrations/analytics/mixpanel.mdx | 13 + es/integrations/analytics/overview.mdx | 644 +++++++ es/integrations/analytics/pirsch.mdx | 27 + es/integrations/analytics/plausible.mdx | 32 + es/integrations/analytics/posthog.mdx | 42 + es/integrations/analytics/segment.mdx | 25 + es/integrations/privacy/osano.mdx | 57 + es/integrations/privacy/overview.mdx | 47 + es/integrations/sdks/speakeasy.mdx | 84 + es/integrations/sdks/stainless.mdx | 34 + es/integrations/support/front.mdx | 21 + es/integrations/support/intercom.mdx | 25 + es/integrations/support/overview.mdx | 43 + es/list-table.mdx | 93 + es/navigation.mdx | 621 +++++++ es/pages.mdx | 189 ++ es/pdf-exports.mdx | 24 + es/quickstart.mdx | 293 +++ es/react-components.mdx | 257 +++ es/reusable-snippets.mdx | 133 ++ es/settings.mdx | 1574 +++++++++++++++++ es/settings/broken-links.mdx | 48 + es/settings/ci.mdx | 425 +++++ es/settings/custom-404-page.mdx | 46 + es/settings/custom-domain.mdx | 55 + es/settings/custom-scripts.mdx | 195 ++ es/settings/github.mdx | 82 + es/settings/gitlab.mdx | 95 + es/settings/preview-deployments.mdx | 66 + es/settings/seo.mdx | 224 +++ es/text.mdx | 284 +++ es/themes.mdx | 56 + fr/advanced/dashboard/permissions.mdx | 21 + fr/advanced/dashboard/roles.mdx | 26 + fr/advanced/dashboard/sso.mdx | 141 ++ fr/advanced/subpath/cloudflare.mdx | 208 +++ fr/advanced/subpath/route53-cloudfront.mdx | 237 +++ fr/advanced/subpath/vercel.mdx | 99 ++ fr/ai/contextual-menu.mdx | 162 ++ fr/ai/llmstxt.mdx | 61 + fr/ai/markdown-export.mdx | 29 + fr/ai/model-context-protocol.mdx | 398 +++++ fr/ai/slack-app.mdx | 31 + fr/analytics/feedback.mdx | 89 + fr/analytics/improving-docs.mdx | 40 + fr/analytics/overview.mdx | 29 + fr/analytics/search.mdx | 28 + fr/api-playground/asyncapi/playground.mdx | 5 + fr/api-playground/asyncapi/setup.mdx | 95 + .../customization/adding-sdk-examples.mdx | 49 + .../customization/complex-data-types.mdx | 103 ++ .../managing-page-visibility.mdx | 96 + .../customization/multiple-responses.mdx | 31 + fr/api-playground/mdx/authentication.mdx | 105 ++ fr/api-playground/mdx/configuration.mdx | 170 ++ fr/api-playground/migrating-from-mdx.mdx | 163 ++ fr/api-playground/openapi-setup.mdx | 577 ++++++ fr/api-playground/overview.mdx | 161 ++ fr/api-playground/troubleshooting.mdx | 107 ++ .../assistant/create-assistant-message.mdx | 25 + fr/api-reference/assistant/create-topic.mdx | 3 + .../assistant/generate-message.mdx | 3 + fr/api-reference/assistant/search.mdx | 3 + fr/api-reference/introduction.mdx | 46 + fr/api-reference/update/status.mdx | 3 + fr/api-reference/update/trigger.mdx | 3 + fr/assistant-context.mdx | 9 + .../authentication-setup.mdx | 318 ++++ .../overview.mdx | 74 + .../personalization-setup.mdx | 397 +++++ fr/changelog.mdx | 757 ++++++++ fr/code.mdx | 365 ++++ fr/components/accordions.mdx | 114 ++ fr/components/banner.mdx | 44 + fr/components/callouts.mdx | 49 + fr/components/cards.mdx | 146 ++ fr/components/code-groups.mdx | 106 ++ fr/components/columns.mdx | 38 + fr/components/examples.mdx | 64 + fr/components/expandables.mdx | 49 + fr/components/fields.mdx | 108 ++ fr/components/frames.mdx | 44 + fr/components/icons.mdx | 45 + fr/components/mermaid-diagrams.mdx | 62 + fr/components/panel.mdx | 21 + fr/components/responses.mdx | 60 + fr/components/steps.mdx | 73 + fr/components/tabs.mdx | 73 + fr/components/tooltips.mdx | 29 + fr/components/update.mdx | 51 + fr/contact-support.mdx | 35 + fr/editor/branches.mdx | 42 + fr/editor/content-management.mdx | 121 ++ fr/editor/getting-started.mdx | 92 + fr/editor/git-concepts.mdx | 66 + fr/editor/keyboard-shortcuts.mdx | 27 + fr/editor/publishing.mdx | 79 + fr/editor/troubleshooting.mdx | 62 + fr/guides/assistant.mdx | 156 ++ fr/guides/auth0.mdx | 62 + fr/guides/changelogs.mdx | 146 ++ fr/guides/claude-code.mdx | 174 ++ fr/guides/csp-configuration.mdx | 143 ++ fr/guides/cursor.mdx | 433 +++++ fr/guides/deployments.mdx | 31 + fr/guides/geo.mdx | 129 ++ fr/guides/hidden-page-example.mdx | 61 + fr/guides/hidden-pages.mdx | 88 + fr/guides/migration.mdx | 201 +++ fr/guides/monorepo.mdx | 51 + fr/guides/windsurf.mdx | 153 ++ fr/image-embeds.mdx | 196 ++ fr/index.mdx | 53 + fr/installation.mdx | 216 +++ fr/integrations/analytics/amplitude.mdx | 25 + fr/integrations/analytics/clearbit.mdx | 25 + fr/integrations/analytics/fathom.mdx | 27 + .../analytics/google-analytics.mdx | 55 + .../analytics/google-tag-manager.mdx | 27 + fr/integrations/analytics/heap.mdx | 25 + fr/integrations/analytics/hightouch.mdx | 33 + fr/integrations/analytics/hotjar.mdx | 14 + fr/integrations/analytics/koala.mdx | 25 + fr/integrations/analytics/logrocket.mdx | 13 + fr/integrations/analytics/mixpanel.mdx | 13 + fr/integrations/analytics/overview.mdx | 644 +++++++ fr/integrations/analytics/pirsch.mdx | 27 + fr/integrations/analytics/plausible.mdx | 32 + fr/integrations/analytics/posthog.mdx | 42 + fr/integrations/analytics/segment.mdx | 25 + fr/integrations/privacy/osano.mdx | 57 + fr/integrations/privacy/overview.mdx | 47 + fr/integrations/sdks/speakeasy.mdx | 84 + fr/integrations/sdks/stainless.mdx | 34 + fr/integrations/support/front.mdx | 21 + fr/integrations/support/intercom.mdx | 25 + fr/integrations/support/overview.mdx | 43 + fr/list-table.mdx | 93 + fr/navigation.mdx | 621 +++++++ fr/pages.mdx | 189 ++ fr/pdf-exports.mdx | 24 + fr/quickstart.mdx | 293 +++ fr/react-components.mdx | 257 +++ fr/reusable-snippets.mdx | 133 ++ fr/settings.mdx | 1573 ++++++++++++++++ fr/settings/broken-links.mdx | 47 + fr/settings/ci.mdx | 425 +++++ fr/settings/custom-404-page.mdx | 46 + fr/settings/custom-domain.mdx | 55 + fr/settings/custom-scripts.mdx | 195 ++ fr/settings/github.mdx | 82 + fr/settings/gitlab.mdx | 94 + fr/settings/preview-deployments.mdx | 66 + fr/settings/seo.mdx | 224 +++ fr/text.mdx | 284 +++ fr/themes.mdx | 56 + gt.config.json | 68 + snippets/es/counter.mdx | 32 + snippets/es/custom-subpath-propagating.mdx | 3 + snippets/es/icons-optional.mdx | 23 + snippets/es/icons-required.mdx | 23 + snippets/es/vercel-json-generator.mdx | 104 ++ snippets/fr/counter.mdx | 32 + snippets/fr/custom-subpath-propagating.mdx | 3 + snippets/fr/icons-optional.mdx | 23 + snippets/fr/icons-required.mdx | 23 + snippets/fr/vercel-json-generator.mdx | 104 ++ snippets/zh/counter.mdx | 32 + snippets/zh/custom-subpath-propagating.mdx | 3 + snippets/zh/icons-optional.mdx | 23 + snippets/zh/icons-required.mdx | 23 + snippets/zh/vercel-json-generator.mdx | 104 ++ zh/advanced/dashboard/permissions.mdx | 21 + zh/advanced/dashboard/roles.mdx | 26 + zh/advanced/dashboard/sso.mdx | 141 ++ zh/advanced/subpath/cloudflare.mdx | 208 +++ zh/advanced/subpath/route53-cloudfront.mdx | 237 +++ zh/advanced/subpath/vercel.mdx | 99 ++ zh/ai/contextual-menu.mdx | 162 ++ zh/ai/llmstxt.mdx | 61 + zh/ai/markdown-export.mdx | 29 + zh/ai/model-context-protocol.mdx | 398 +++++ zh/ai/slack-app.mdx | 31 + zh/analytics/feedback.mdx | 89 + zh/analytics/improving-docs.mdx | 40 + zh/analytics/overview.mdx | 29 + zh/analytics/search.mdx | 28 + zh/api-playground/asyncapi/playground.mdx | 5 + zh/api-playground/asyncapi/setup.mdx | 95 + .../customization/adding-sdk-examples.mdx | 49 + .../customization/complex-data-types.mdx | 103 ++ .../managing-page-visibility.mdx | 96 + .../customization/multiple-responses.mdx | 31 + zh/api-playground/mdx/authentication.mdx | 105 ++ zh/api-playground/mdx/configuration.mdx | 170 ++ zh/api-playground/migrating-from-mdx.mdx | 163 ++ zh/api-playground/openapi-setup.mdx | 571 ++++++ zh/api-playground/overview.mdx | 161 ++ zh/api-playground/troubleshooting.mdx | 106 ++ .../assistant/create-assistant-message.mdx | 25 + zh/api-reference/assistant/create-topic.mdx | 3 + .../assistant/generate-message.mdx | 3 + zh/api-reference/assistant/search.mdx | 3 + zh/api-reference/introduction.mdx | 46 + zh/api-reference/update/status.mdx | 3 + zh/api-reference/update/trigger.mdx | 3 + zh/assistant-context.mdx | 9 + .../authentication-setup.mdx | 322 ++++ .../overview.mdx | 74 + .../personalization-setup.mdx | 397 +++++ zh/changelog.mdx | 747 ++++++++ zh/code.mdx | 365 ++++ zh/components/accordions.mdx | 114 ++ zh/components/banner.mdx | 44 + zh/components/callouts.mdx | 49 + zh/components/cards.mdx | 146 ++ zh/components/code-groups.mdx | 106 ++ zh/components/columns.mdx | 38 + zh/components/examples.mdx | 64 + zh/components/expandables.mdx | 49 + zh/components/fields.mdx | 108 ++ zh/components/frames.mdx | 44 + zh/components/icons.mdx | 45 + zh/components/mermaid-diagrams.mdx | 62 + zh/components/panel.mdx | 21 + zh/components/responses.mdx | 60 + zh/components/steps.mdx | 73 + zh/components/tabs.mdx | 73 + zh/components/tooltips.mdx | 29 + zh/components/update.mdx | 51 + zh/contact-support.mdx | 35 + zh/editor/branches.mdx | 42 + zh/editor/content-management.mdx | 121 ++ zh/editor/getting-started.mdx | 92 + zh/editor/git-concepts.mdx | 66 + zh/editor/keyboard-shortcuts.mdx | 27 + zh/editor/publishing.mdx | 79 + zh/editor/troubleshooting.mdx | 62 + zh/guides/assistant.mdx | 156 ++ zh/guides/auth0.mdx | 62 + zh/guides/changelogs.mdx | 147 ++ zh/guides/claude-code.mdx | 174 ++ zh/guides/csp-configuration.mdx | 143 ++ zh/guides/cursor.mdx | 433 +++++ zh/guides/deployments.mdx | 31 + zh/guides/geo.mdx | 129 ++ zh/guides/hidden-page-example.mdx | 61 + zh/guides/hidden-pages.mdx | 88 + zh/guides/migration.mdx | 201 +++ zh/guides/monorepo.mdx | 51 + zh/guides/windsurf.mdx | 153 ++ zh/image-embeds.mdx | 196 ++ zh/index.mdx | 53 + zh/installation.mdx | 216 +++ zh/integrations/analytics/amplitude.mdx | 25 + zh/integrations/analytics/clearbit.mdx | 25 + zh/integrations/analytics/fathom.mdx | 27 + .../analytics/google-analytics.mdx | 55 + .../analytics/google-tag-manager.mdx | 27 + zh/integrations/analytics/heap.mdx | 25 + zh/integrations/analytics/hightouch.mdx | 33 + zh/integrations/analytics/hotjar.mdx | 14 + zh/integrations/analytics/koala.mdx | 25 + zh/integrations/analytics/logrocket.mdx | 13 + zh/integrations/analytics/mixpanel.mdx | 13 + zh/integrations/analytics/overview.mdx | 644 +++++++ zh/integrations/analytics/pirsch.mdx | 27 + zh/integrations/analytics/plausible.mdx | 32 + zh/integrations/analytics/posthog.mdx | 42 + zh/integrations/analytics/segment.mdx | 25 + zh/integrations/privacy/osano.mdx | 57 + zh/integrations/privacy/overview.mdx | 47 + zh/integrations/sdks/speakeasy.mdx | 84 + zh/integrations/sdks/stainless.mdx | 34 + zh/integrations/support/front.mdx | 21 + zh/integrations/support/intercom.mdx | 25 + zh/integrations/support/overview.mdx | 43 + zh/list-table.mdx | 93 + zh/navigation.mdx | 621 +++++++ zh/pages.mdx | 189 ++ zh/pdf-exports.mdx | 24 + zh/quickstart.mdx | 293 +++ zh/react-components.mdx | 255 +++ zh/reusable-snippets.mdx | 129 ++ zh/settings.mdx | 1573 ++++++++++++++++ zh/settings/broken-links.mdx | 47 + zh/settings/ci.mdx | 425 +++++ zh/settings/custom-404-page.mdx | 46 + zh/settings/custom-domain.mdx | 55 + zh/settings/custom-scripts.mdx | 195 ++ zh/settings/github.mdx | 82 + zh/settings/gitlab.mdx | 94 + zh/settings/preview-deployments.mdx | 66 + zh/settings/seo.mdx | 224 +++ zh/text.mdx | 284 +++ zh/themes.mdx | 56 + 389 files changed, 47741 insertions(+), 186 deletions(-) create mode 100644 es/advanced/dashboard/permissions.mdx create mode 100644 es/advanced/dashboard/roles.mdx create mode 100644 es/advanced/dashboard/sso.mdx create mode 100644 es/advanced/subpath/cloudflare.mdx create mode 100644 es/advanced/subpath/route53-cloudfront.mdx create mode 100644 es/advanced/subpath/vercel.mdx create mode 100644 es/ai/contextual-menu.mdx create mode 100644 es/ai/llmstxt.mdx create mode 100644 es/ai/markdown-export.mdx create mode 100644 es/ai/model-context-protocol.mdx create mode 100644 es/ai/slack-app.mdx create mode 100644 es/analytics/feedback.mdx create mode 100644 es/analytics/improving-docs.mdx create mode 100644 es/analytics/overview.mdx create mode 100644 es/analytics/search.mdx create mode 100644 es/api-playground/asyncapi/playground.mdx create mode 100644 es/api-playground/asyncapi/setup.mdx create mode 100644 es/api-playground/customization/adding-sdk-examples.mdx create mode 100644 es/api-playground/customization/complex-data-types.mdx create mode 100644 es/api-playground/customization/managing-page-visibility.mdx create mode 100644 es/api-playground/customization/multiple-responses.mdx create mode 100644 es/api-playground/mdx/authentication.mdx create mode 100644 es/api-playground/mdx/configuration.mdx create mode 100644 es/api-playground/migrating-from-mdx.mdx create mode 100644 es/api-playground/openapi-setup.mdx create mode 100644 es/api-playground/overview.mdx create mode 100644 es/api-playground/troubleshooting.mdx create mode 100644 es/api-reference/assistant/create-assistant-message.mdx create mode 100644 es/api-reference/assistant/create-topic.mdx create mode 100644 es/api-reference/assistant/generate-message.mdx create mode 100644 es/api-reference/assistant/search.mdx create mode 100644 es/api-reference/introduction.mdx create mode 100644 es/api-reference/update/status.mdx create mode 100644 es/api-reference/update/trigger.mdx create mode 100644 es/assistant-context.mdx create mode 100644 es/authentication-personalization/authentication-setup.mdx create mode 100644 es/authentication-personalization/overview.mdx create mode 100644 es/authentication-personalization/personalization-setup.mdx create mode 100644 es/changelog.mdx create mode 100644 es/code.mdx create mode 100644 es/components/accordions.mdx create mode 100644 es/components/banner.mdx create mode 100644 es/components/callouts.mdx create mode 100644 es/components/cards.mdx create mode 100644 es/components/code-groups.mdx create mode 100644 es/components/columns.mdx create mode 100644 es/components/examples.mdx create mode 100644 es/components/expandables.mdx create mode 100644 es/components/fields.mdx create mode 100644 es/components/frames.mdx create mode 100644 es/components/icons.mdx create mode 100644 es/components/mermaid-diagrams.mdx create mode 100644 es/components/panel.mdx create mode 100644 es/components/responses.mdx create mode 100644 es/components/steps.mdx create mode 100644 es/components/tabs.mdx create mode 100644 es/components/tooltips.mdx create mode 100644 es/components/update.mdx create mode 100644 es/contact-support.mdx create mode 100644 es/editor/branches.mdx create mode 100644 es/editor/content-management.mdx create mode 100644 es/editor/getting-started.mdx create mode 100644 es/editor/git-concepts.mdx create mode 100644 es/editor/keyboard-shortcuts.mdx create mode 100644 es/editor/publishing.mdx create mode 100644 es/editor/troubleshooting.mdx create mode 100644 es/guides/assistant.mdx create mode 100644 es/guides/auth0.mdx create mode 100644 es/guides/changelogs.mdx create mode 100644 es/guides/claude-code.mdx create mode 100644 es/guides/csp-configuration.mdx create mode 100644 es/guides/cursor.mdx create mode 100644 es/guides/deployments.mdx create mode 100644 es/guides/geo.mdx create mode 100644 es/guides/hidden-page-example.mdx create mode 100644 es/guides/hidden-pages.mdx create mode 100644 es/guides/migration.mdx create mode 100644 es/guides/monorepo.mdx create mode 100644 es/guides/windsurf.mdx create mode 100644 es/image-embeds.mdx create mode 100644 es/index.mdx create mode 100644 es/installation.mdx create mode 100644 es/integrations/analytics/amplitude.mdx create mode 100644 es/integrations/analytics/clearbit.mdx create mode 100644 es/integrations/analytics/fathom.mdx create mode 100644 es/integrations/analytics/google-analytics.mdx create mode 100644 es/integrations/analytics/google-tag-manager.mdx create mode 100644 es/integrations/analytics/heap.mdx create mode 100644 es/integrations/analytics/hightouch.mdx create mode 100644 es/integrations/analytics/hotjar.mdx create mode 100644 es/integrations/analytics/koala.mdx create mode 100644 es/integrations/analytics/logrocket.mdx create mode 100644 es/integrations/analytics/mixpanel.mdx create mode 100644 es/integrations/analytics/overview.mdx create mode 100644 es/integrations/analytics/pirsch.mdx create mode 100644 es/integrations/analytics/plausible.mdx create mode 100644 es/integrations/analytics/posthog.mdx create mode 100644 es/integrations/analytics/segment.mdx create mode 100644 es/integrations/privacy/osano.mdx create mode 100644 es/integrations/privacy/overview.mdx create mode 100644 es/integrations/sdks/speakeasy.mdx create mode 100644 es/integrations/sdks/stainless.mdx create mode 100644 es/integrations/support/front.mdx create mode 100644 es/integrations/support/intercom.mdx create mode 100644 es/integrations/support/overview.mdx create mode 100644 es/list-table.mdx create mode 100644 es/navigation.mdx create mode 100644 es/pages.mdx create mode 100644 es/pdf-exports.mdx create mode 100644 es/quickstart.mdx create mode 100644 es/react-components.mdx create mode 100644 es/reusable-snippets.mdx create mode 100644 es/settings.mdx create mode 100644 es/settings/broken-links.mdx create mode 100644 es/settings/ci.mdx create mode 100644 es/settings/custom-404-page.mdx create mode 100644 es/settings/custom-domain.mdx create mode 100644 es/settings/custom-scripts.mdx create mode 100644 es/settings/github.mdx create mode 100644 es/settings/gitlab.mdx create mode 100644 es/settings/preview-deployments.mdx create mode 100644 es/settings/seo.mdx create mode 100644 es/text.mdx create mode 100644 es/themes.mdx create mode 100644 fr/advanced/dashboard/permissions.mdx create mode 100644 fr/advanced/dashboard/roles.mdx create mode 100644 fr/advanced/dashboard/sso.mdx create mode 100644 fr/advanced/subpath/cloudflare.mdx create mode 100644 fr/advanced/subpath/route53-cloudfront.mdx create mode 100644 fr/advanced/subpath/vercel.mdx create mode 100644 fr/ai/contextual-menu.mdx create mode 100644 fr/ai/llmstxt.mdx create mode 100644 fr/ai/markdown-export.mdx create mode 100644 fr/ai/model-context-protocol.mdx create mode 100644 fr/ai/slack-app.mdx create mode 100644 fr/analytics/feedback.mdx create mode 100644 fr/analytics/improving-docs.mdx create mode 100644 fr/analytics/overview.mdx create mode 100644 fr/analytics/search.mdx create mode 100644 fr/api-playground/asyncapi/playground.mdx create mode 100644 fr/api-playground/asyncapi/setup.mdx create mode 100644 fr/api-playground/customization/adding-sdk-examples.mdx create mode 100644 fr/api-playground/customization/complex-data-types.mdx create mode 100644 fr/api-playground/customization/managing-page-visibility.mdx create mode 100644 fr/api-playground/customization/multiple-responses.mdx create mode 100644 fr/api-playground/mdx/authentication.mdx create mode 100644 fr/api-playground/mdx/configuration.mdx create mode 100644 fr/api-playground/migrating-from-mdx.mdx create mode 100644 fr/api-playground/openapi-setup.mdx create mode 100644 fr/api-playground/overview.mdx create mode 100644 fr/api-playground/troubleshooting.mdx create mode 100644 fr/api-reference/assistant/create-assistant-message.mdx create mode 100644 fr/api-reference/assistant/create-topic.mdx create mode 100644 fr/api-reference/assistant/generate-message.mdx create mode 100644 fr/api-reference/assistant/search.mdx create mode 100644 fr/api-reference/introduction.mdx create mode 100644 fr/api-reference/update/status.mdx create mode 100644 fr/api-reference/update/trigger.mdx create mode 100644 fr/assistant-context.mdx create mode 100644 fr/authentication-personalization/authentication-setup.mdx create mode 100644 fr/authentication-personalization/overview.mdx create mode 100644 fr/authentication-personalization/personalization-setup.mdx create mode 100644 fr/changelog.mdx create mode 100644 fr/code.mdx create mode 100644 fr/components/accordions.mdx create mode 100644 fr/components/banner.mdx create mode 100644 fr/components/callouts.mdx create mode 100644 fr/components/cards.mdx create mode 100644 fr/components/code-groups.mdx create mode 100644 fr/components/columns.mdx create mode 100644 fr/components/examples.mdx create mode 100644 fr/components/expandables.mdx create mode 100644 fr/components/fields.mdx create mode 100644 fr/components/frames.mdx create mode 100644 fr/components/icons.mdx create mode 100644 fr/components/mermaid-diagrams.mdx create mode 100644 fr/components/panel.mdx create mode 100644 fr/components/responses.mdx create mode 100644 fr/components/steps.mdx create mode 100644 fr/components/tabs.mdx create mode 100644 fr/components/tooltips.mdx create mode 100644 fr/components/update.mdx create mode 100644 fr/contact-support.mdx create mode 100644 fr/editor/branches.mdx create mode 100644 fr/editor/content-management.mdx create mode 100644 fr/editor/getting-started.mdx create mode 100644 fr/editor/git-concepts.mdx create mode 100644 fr/editor/keyboard-shortcuts.mdx create mode 100644 fr/editor/publishing.mdx create mode 100644 fr/editor/troubleshooting.mdx create mode 100644 fr/guides/assistant.mdx create mode 100644 fr/guides/auth0.mdx create mode 100644 fr/guides/changelogs.mdx create mode 100644 fr/guides/claude-code.mdx create mode 100644 fr/guides/csp-configuration.mdx create mode 100644 fr/guides/cursor.mdx create mode 100644 fr/guides/deployments.mdx create mode 100644 fr/guides/geo.mdx create mode 100644 fr/guides/hidden-page-example.mdx create mode 100644 fr/guides/hidden-pages.mdx create mode 100644 fr/guides/migration.mdx create mode 100644 fr/guides/monorepo.mdx create mode 100644 fr/guides/windsurf.mdx create mode 100644 fr/image-embeds.mdx create mode 100644 fr/index.mdx create mode 100644 fr/installation.mdx create mode 100644 fr/integrations/analytics/amplitude.mdx create mode 100644 fr/integrations/analytics/clearbit.mdx create mode 100644 fr/integrations/analytics/fathom.mdx create mode 100644 fr/integrations/analytics/google-analytics.mdx create mode 100644 fr/integrations/analytics/google-tag-manager.mdx create mode 100644 fr/integrations/analytics/heap.mdx create mode 100644 fr/integrations/analytics/hightouch.mdx create mode 100644 fr/integrations/analytics/hotjar.mdx create mode 100644 fr/integrations/analytics/koala.mdx create mode 100644 fr/integrations/analytics/logrocket.mdx create mode 100644 fr/integrations/analytics/mixpanel.mdx create mode 100644 fr/integrations/analytics/overview.mdx create mode 100644 fr/integrations/analytics/pirsch.mdx create mode 100644 fr/integrations/analytics/plausible.mdx create mode 100644 fr/integrations/analytics/posthog.mdx create mode 100644 fr/integrations/analytics/segment.mdx create mode 100644 fr/integrations/privacy/osano.mdx create mode 100644 fr/integrations/privacy/overview.mdx create mode 100644 fr/integrations/sdks/speakeasy.mdx create mode 100644 fr/integrations/sdks/stainless.mdx create mode 100644 fr/integrations/support/front.mdx create mode 100644 fr/integrations/support/intercom.mdx create mode 100644 fr/integrations/support/overview.mdx create mode 100644 fr/list-table.mdx create mode 100644 fr/navigation.mdx create mode 100644 fr/pages.mdx create mode 100644 fr/pdf-exports.mdx create mode 100644 fr/quickstart.mdx create mode 100644 fr/react-components.mdx create mode 100644 fr/reusable-snippets.mdx create mode 100644 fr/settings.mdx create mode 100644 fr/settings/broken-links.mdx create mode 100644 fr/settings/ci.mdx create mode 100644 fr/settings/custom-404-page.mdx create mode 100644 fr/settings/custom-domain.mdx create mode 100644 fr/settings/custom-scripts.mdx create mode 100644 fr/settings/github.mdx create mode 100644 fr/settings/gitlab.mdx create mode 100644 fr/settings/preview-deployments.mdx create mode 100644 fr/settings/seo.mdx create mode 100644 fr/text.mdx create mode 100644 fr/themes.mdx create mode 100644 gt.config.json create mode 100644 snippets/es/counter.mdx create mode 100644 snippets/es/custom-subpath-propagating.mdx create mode 100644 snippets/es/icons-optional.mdx create mode 100644 snippets/es/icons-required.mdx create mode 100644 snippets/es/vercel-json-generator.mdx create mode 100644 snippets/fr/counter.mdx create mode 100644 snippets/fr/custom-subpath-propagating.mdx create mode 100644 snippets/fr/icons-optional.mdx create mode 100644 snippets/fr/icons-required.mdx create mode 100644 snippets/fr/vercel-json-generator.mdx create mode 100644 snippets/zh/counter.mdx create mode 100644 snippets/zh/custom-subpath-propagating.mdx create mode 100644 snippets/zh/icons-optional.mdx create mode 100644 snippets/zh/icons-required.mdx create mode 100644 snippets/zh/vercel-json-generator.mdx create mode 100644 zh/advanced/dashboard/permissions.mdx create mode 100644 zh/advanced/dashboard/roles.mdx create mode 100644 zh/advanced/dashboard/sso.mdx create mode 100644 zh/advanced/subpath/cloudflare.mdx create mode 100644 zh/advanced/subpath/route53-cloudfront.mdx create mode 100644 zh/advanced/subpath/vercel.mdx create mode 100644 zh/ai/contextual-menu.mdx create mode 100644 zh/ai/llmstxt.mdx create mode 100644 zh/ai/markdown-export.mdx create mode 100644 zh/ai/model-context-protocol.mdx create mode 100644 zh/ai/slack-app.mdx create mode 100644 zh/analytics/feedback.mdx create mode 100644 zh/analytics/improving-docs.mdx create mode 100644 zh/analytics/overview.mdx create mode 100644 zh/analytics/search.mdx create mode 100644 zh/api-playground/asyncapi/playground.mdx create mode 100644 zh/api-playground/asyncapi/setup.mdx create mode 100644 zh/api-playground/customization/adding-sdk-examples.mdx create mode 100644 zh/api-playground/customization/complex-data-types.mdx create mode 100644 zh/api-playground/customization/managing-page-visibility.mdx create mode 100644 zh/api-playground/customization/multiple-responses.mdx create mode 100644 zh/api-playground/mdx/authentication.mdx create mode 100644 zh/api-playground/mdx/configuration.mdx create mode 100644 zh/api-playground/migrating-from-mdx.mdx create mode 100644 zh/api-playground/openapi-setup.mdx create mode 100644 zh/api-playground/overview.mdx create mode 100644 zh/api-playground/troubleshooting.mdx create mode 100644 zh/api-reference/assistant/create-assistant-message.mdx create mode 100644 zh/api-reference/assistant/create-topic.mdx create mode 100644 zh/api-reference/assistant/generate-message.mdx create mode 100644 zh/api-reference/assistant/search.mdx create mode 100644 zh/api-reference/introduction.mdx create mode 100644 zh/api-reference/update/status.mdx create mode 100644 zh/api-reference/update/trigger.mdx create mode 100644 zh/assistant-context.mdx create mode 100644 zh/authentication-personalization/authentication-setup.mdx create mode 100644 zh/authentication-personalization/overview.mdx create mode 100644 zh/authentication-personalization/personalization-setup.mdx create mode 100644 zh/changelog.mdx create mode 100644 zh/code.mdx create mode 100644 zh/components/accordions.mdx create mode 100644 zh/components/banner.mdx create mode 100644 zh/components/callouts.mdx create mode 100644 zh/components/cards.mdx create mode 100644 zh/components/code-groups.mdx create mode 100644 zh/components/columns.mdx create mode 100644 zh/components/examples.mdx create mode 100644 zh/components/expandables.mdx create mode 100644 zh/components/fields.mdx create mode 100644 zh/components/frames.mdx create mode 100644 zh/components/icons.mdx create mode 100644 zh/components/mermaid-diagrams.mdx create mode 100644 zh/components/panel.mdx create mode 100644 zh/components/responses.mdx create mode 100644 zh/components/steps.mdx create mode 100644 zh/components/tabs.mdx create mode 100644 zh/components/tooltips.mdx create mode 100644 zh/components/update.mdx create mode 100644 zh/contact-support.mdx create mode 100644 zh/editor/branches.mdx create mode 100644 zh/editor/content-management.mdx create mode 100644 zh/editor/getting-started.mdx create mode 100644 zh/editor/git-concepts.mdx create mode 100644 zh/editor/keyboard-shortcuts.mdx create mode 100644 zh/editor/publishing.mdx create mode 100644 zh/editor/troubleshooting.mdx create mode 100644 zh/guides/assistant.mdx create mode 100644 zh/guides/auth0.mdx create mode 100644 zh/guides/changelogs.mdx create mode 100644 zh/guides/claude-code.mdx create mode 100644 zh/guides/csp-configuration.mdx create mode 100644 zh/guides/cursor.mdx create mode 100644 zh/guides/deployments.mdx create mode 100644 zh/guides/geo.mdx create mode 100644 zh/guides/hidden-page-example.mdx create mode 100644 zh/guides/hidden-pages.mdx create mode 100644 zh/guides/migration.mdx create mode 100644 zh/guides/monorepo.mdx create mode 100644 zh/guides/windsurf.mdx create mode 100644 zh/image-embeds.mdx create mode 100644 zh/index.mdx create mode 100644 zh/installation.mdx create mode 100644 zh/integrations/analytics/amplitude.mdx create mode 100644 zh/integrations/analytics/clearbit.mdx create mode 100644 zh/integrations/analytics/fathom.mdx create mode 100644 zh/integrations/analytics/google-analytics.mdx create mode 100644 zh/integrations/analytics/google-tag-manager.mdx create mode 100644 zh/integrations/analytics/heap.mdx create mode 100644 zh/integrations/analytics/hightouch.mdx create mode 100644 zh/integrations/analytics/hotjar.mdx create mode 100644 zh/integrations/analytics/koala.mdx create mode 100644 zh/integrations/analytics/logrocket.mdx create mode 100644 zh/integrations/analytics/mixpanel.mdx create mode 100644 zh/integrations/analytics/overview.mdx create mode 100644 zh/integrations/analytics/pirsch.mdx create mode 100644 zh/integrations/analytics/plausible.mdx create mode 100644 zh/integrations/analytics/posthog.mdx create mode 100644 zh/integrations/analytics/segment.mdx create mode 100644 zh/integrations/privacy/osano.mdx create mode 100644 zh/integrations/privacy/overview.mdx create mode 100644 zh/integrations/sdks/speakeasy.mdx create mode 100644 zh/integrations/sdks/stainless.mdx create mode 100644 zh/integrations/support/front.mdx create mode 100644 zh/integrations/support/intercom.mdx create mode 100644 zh/integrations/support/overview.mdx create mode 100644 zh/list-table.mdx create mode 100644 zh/navigation.mdx create mode 100644 zh/pages.mdx create mode 100644 zh/pdf-exports.mdx create mode 100644 zh/quickstart.mdx create mode 100644 zh/react-components.mdx create mode 100644 zh/reusable-snippets.mdx create mode 100644 zh/settings.mdx create mode 100644 zh/settings/broken-links.mdx create mode 100644 zh/settings/ci.mdx create mode 100644 zh/settings/custom-404-page.mdx create mode 100644 zh/settings/custom-domain.mdx create mode 100644 zh/settings/custom-scripts.mdx create mode 100644 zh/settings/github.mdx create mode 100644 zh/settings/gitlab.mdx create mode 100644 zh/settings/preview-deployments.mdx create mode 100644 zh/settings/seo.mdx create mode 100644 zh/text.mdx create mode 100644 zh/themes.mdx diff --git a/docs.json b/docs.json index 7e738d5e6..93962f72f 100644 --- a/docs.json +++ b/docs.json @@ -12,267 +12,1074 @@ "library": "lucide" }, "navigation": { - "tabs": [ + "languages": [ { - "tab": "Documentation", - "groups": [ + "tabs": [ { - "group": "Getting started", - "pages": [ - "index", - "quickstart", - "installation", - { - "group": "Web editor", - "icon": "mouse-pointer-2", - "pages": [ - "editor/getting-started", - "editor/git-concepts", - "editor/branches", - "editor/content-management", - "editor/publishing", - "editor/keyboard-shortcuts", - "editor/troubleshooting" + "tab": "Documentation", + "groups": [ + { + "group": "Getting started", + "pages": [ + "index", + "quickstart", + "installation", + { + "group": "Web editor", + "icon": "mouse-pointer-2", + "pages": [ + "editor/getting-started", + "editor/git-concepts", + "editor/branches", + "editor/content-management", + "editor/publishing", + "editor/keyboard-shortcuts", + "editor/troubleshooting" + ] + } + ] + }, + { + "group": "Core configuration", + "pages": [ + "settings", + "pages", + "navigation", + "themes", + "settings/custom-domain" + ] + }, + { + "group": "AI optimization", + "pages": [ + "guides/assistant", + "ai/llmstxt", + "ai/contextual-menu", + "ai/model-context-protocol", + "ai/markdown-export", + "guides/geo", + "guides/claude-code", + "guides/cursor", + "guides/windsurf", + "ai/slack-app" + ] + }, + { + "group": "Components", + "pages": [ + "text", + "image-embeds", + "list-table", + "code", + "reusable-snippets", + "components/accordions", + "components/callouts", + "components/cards", + "components/columns", + "components/code-groups", + "components/examples", + "components/expandables", + "components/fields", + "components/frames", + "components/icons", + "components/mermaid-diagrams", + "components/panel", + "components/steps", + "components/tabs", + "components/tooltips", + "components/update", + "components/banner" + ] + }, + { + "group": "API pages", + "pages": [ + "api-playground/overview", + "api-playground/openapi-setup", + "api-playground/migrating-from-mdx", + { + "group": "Customization", + "icon": "wrench", + "pages": [ + "api-playground/customization/complex-data-types", + "api-playground/customization/adding-sdk-examples", + "api-playground/customization/managing-page-visibility", + "api-playground/customization/multiple-responses" + ] + }, + { + "group": "AsyncAPI", + "icon": "webhook", + "pages": [ + "api-playground/asyncapi/setup", + "api-playground/asyncapi/playground" + ] + }, + { + "group": "MDX", + "icon": "markdown", + "pages": [ + "api-playground/mdx/configuration", + "api-playground/mdx/authentication" + ] + }, + "api-playground/troubleshooting" + ] + }, + { + "group": "Authentication and personalization", + "pages": [ + "authentication-personalization/authentication-setup", + "authentication-personalization/personalization-setup" + ] + }, + { + "group": "Guides", + "pages": [ + "guides/migration", + { + "group": "Analytics dashboard", + "icon": "chart-line", + "pages": [ + "analytics/overview", + "analytics/feedback", + "analytics/search", + "analytics/improving-docs" + ] + }, + "react-components", + "settings/custom-scripts", + "settings/seo", + "guides/changelogs", + "guides/hidden-pages", + "settings/broken-links", + "settings/custom-404-page", + "guides/monorepo", + { + "group": "Custom Subdirectory", + "icon": "folder", + "pages": [ + "advanced/subpath/cloudflare", + "advanced/subpath/route53-cloudfront", + "advanced/subpath/vercel", + "guides/csp-configuration" + ] + }, + { + "group": "Dashboard Access", + "icon": "gauge", + "pages": [ + "advanced/dashboard/sso", + "advanced/dashboard/permissions", + "advanced/dashboard/roles" + ] + }, + "guides/deployments", + "contact-support" + ] + }, + { + "group": "Integrations", + "pages": [ + { + "group": "Analytics", + "icon": "chart-no-axes-combined", + "pages": [ + "integrations/analytics/overview", + "integrations/analytics/amplitude", + "integrations/analytics/clearbit", + "integrations/analytics/fathom", + "integrations/analytics/google-analytics", + "integrations/analytics/google-tag-manager", + "integrations/analytics/heap", + "integrations/analytics/hightouch", + "integrations/analytics/hotjar", + "integrations/analytics/koala", + "integrations/analytics/logrocket", + "integrations/analytics/mixpanel", + "integrations/analytics/pirsch", + "integrations/analytics/plausible", + "integrations/analytics/posthog", + "integrations/analytics/segment" + ] + }, + { + "group": "SDKs", + "icon": "folder-code", + "pages": [ + "integrations/sdks/speakeasy", + "integrations/sdks/stainless" + ] + }, + { + "group": "Support", + "icon": "messages-square", + "pages": [ + "integrations/support/overview", + "integrations/support/intercom", + "integrations/support/front" + ] + }, + { + "group": "Privacy", + "icon": "folder-lock", + "pages": [ + "integrations/privacy/overview", + "integrations/privacy/osano" + ] + } + ] + }, + { + "group": "Version control and CI/CD", + "pages": [ + "settings/github", + "settings/gitlab", + "settings/ci", + "settings/preview-deployments" ] } ] }, { - "group": "Core configuration", - "pages": [ - "settings", - "pages", - "navigation", - "themes", - "settings/custom-domain" + "tab": "API Reference", + "groups": [ + { + "group": "API Reference", + "pages": [ + "api-reference/introduction" + ] + }, + { + "group": "Admin", + "pages": [ + "api-reference/update/trigger", + "api-reference/update/status" + ] + }, + { + "group": "Assistant", + "pages": [ + "api-reference/assistant/create-assistant-message", + "api-reference/assistant/search" + ] + } ] }, { - "group": "AI optimization", - "pages": [ - "guides/assistant", - "ai/llmstxt", - "ai/contextual-menu", - "ai/model-context-protocol", - "ai/markdown-export", - "guides/geo", - "guides/claude-code", - "guides/cursor", - "guides/windsurf" + "tab": "Changelog", + "groups": [ + { + "group": "Changelog", + "pages": [ + "changelog" + ] + } ] - }, + } + ], + "language": "en" + }, + { + "tabs": [ { - "group": "Components", - "pages": [ - "text", - "image-embeds", - "list-table", - "code", - "reusable-snippets", - "components/accordions", - "components/callouts", - "components/cards", - "components/columns", - "components/code-groups", - "components/examples", - "components/expandables", - "components/fields", - "components/frames", - "components/icons", - "components/mermaid-diagrams", - "components/panel", - "components/steps", - "components/tabs", - "components/tooltips", - "components/update", - "components/banner" + "tab": "Documentation", + "groups": [ + { + "group": "Premiers pas", + "pages": [ + "fr/index", + "fr/quickstart", + "fr/installation", + { + "group": "Éditeur web", + "icon": "mouse-pointer-2", + "pages": [ + "fr/editor/getting-started", + "fr/editor/git-concepts", + "fr/editor/branches", + "fr/editor/content-management", + "fr/editor/publishing", + "fr/editor/keyboard-shortcuts", + "fr/editor/troubleshooting" + ] + } + ] + }, + { + "group": "Configuration de base", + "pages": [ + "fr/settings", + "fr/pages", + "fr/navigation", + "fr/themes", + "fr/settings/custom-domain" + ] + }, + { + "group": "Optimisation de l’IA", + "pages": [ + "fr/guides/assistant", + "fr/ai/llmstxt", + "fr/ai/contextual-menu", + "fr/ai/model-context-protocol", + "fr/ai/markdown-export", + "fr/guides/geo", + "fr/guides/claude-code", + "fr/guides/cursor", + "fr/guides/windsurf", + "fr/ai/slack-app" + ] + }, + { + "group": "Composants", + "pages": [ + "fr/text", + "fr/image-embeds", + "fr/list-table", + "fr/code", + "fr/reusable-snippets", + "fr/components/accordions", + "fr/components/callouts", + "fr/components/cards", + "fr/components/columns", + "fr/components/code-groups", + "fr/components/examples", + "fr/components/expandables", + "fr/components/fields", + "fr/components/frames", + "fr/components/icons", + "fr/components/mermaid-diagrams", + "fr/components/panel", + "fr/components/steps", + "fr/components/tabs", + "fr/components/tooltips", + "fr/components/update", + "fr/components/banner" + ] + }, + { + "group": "Pages API", + "pages": [ + "fr/api-playground/overview", + "fr/api-playground/openapi-setup", + "fr/api-playground/migrating-from-mdx", + { + "group": "Personnalisation", + "icon": "wrench", + "pages": [ + "fr/api-playground/customization/complex-data-types", + "fr/api-playground/customization/adding-sdk-examples", + "fr/api-playground/customization/managing-page-visibility", + "fr/api-playground/customization/multiple-responses" + ] + }, + { + "group": "AsyncAPI", + "icon": "webhook", + "pages": [ + "fr/api-playground/asyncapi/setup", + "fr/api-playground/asyncapi/playground" + ] + }, + { + "group": "MDX", + "icon": "markdown", + "pages": [ + "fr/api-playground/mdx/configuration", + "fr/api-playground/mdx/authentication" + ] + }, + "fr/api-playground/troubleshooting" + ] + }, + { + "group": "Authentification et personnalisation", + "pages": [ + "fr/authentication-personalization/authentication-setup", + "fr/authentication-personalization/personalization-setup" + ] + }, + { + "group": "Guides", + "pages": [ + "fr/guides/migration", + { + "group": "Tableau de bord analytique", + "icon": "chart-line", + "pages": [ + "fr/analytics/overview", + "fr/analytics/feedback", + "fr/analytics/search", + "fr/analytics/improving-docs" + ] + }, + "fr/react-components", + "fr/settings/custom-scripts", + "fr/settings/seo", + "fr/guides/changelogs", + "fr/guides/hidden-pages", + "fr/settings/broken-links", + "fr/settings/custom-404-page", + "fr/guides/monorepo", + { + "group": "Sous-répertoire personnalisé", + "icon": "folder", + "pages": [ + "fr/advanced/subpath/cloudflare", + "fr/advanced/subpath/route53-cloudfront", + "fr/advanced/subpath/vercel", + "fr/guides/csp-configuration" + ] + }, + { + "group": "Accès au tableau de bord", + "icon": "gauge", + "pages": [ + "fr/advanced/dashboard/sso", + "fr/advanced/dashboard/permissions", + "fr/advanced/dashboard/roles" + ] + }, + "fr/guides/deployments", + "fr/contact-support" + ] + }, + { + "group": "Intégrations", + "pages": [ + { + "group": "Analytique", + "icon": "chart-no-axes-combined", + "pages": [ + "fr/integrations/analytics/overview", + "fr/integrations/analytics/amplitude", + "fr/integrations/analytics/clearbit", + "fr/integrations/analytics/fathom", + "fr/integrations/analytics/google-analytics", + "fr/integrations/analytics/google-tag-manager", + "fr/integrations/analytics/heap", + "fr/integrations/analytics/hightouch", + "fr/integrations/analytics/hotjar", + "fr/integrations/analytics/koala", + "fr/integrations/analytics/logrocket", + "fr/integrations/analytics/mixpanel", + "fr/integrations/analytics/pirsch", + "fr/integrations/analytics/plausible", + "fr/integrations/analytics/posthog", + "fr/integrations/analytics/segment" + ] + }, + { + "group": "Kits SDK", + "icon": "folder-code", + "pages": [ + "fr/integrations/sdks/speakeasy", + "fr/integrations/sdks/stainless" + ] + }, + { + "group": "Assistance", + "icon": "messages-square", + "pages": [ + "fr/integrations/support/overview", + "fr/integrations/support/intercom", + "fr/integrations/support/front" + ] + }, + { + "group": "Confidentialité", + "icon": "folder-lock", + "pages": [ + "fr/integrations/privacy/overview", + "fr/integrations/privacy/osano" + ] + } + ] + }, + { + "group": "Contrôle de version et CI/CD", + "pages": [ + "fr/settings/github", + "fr/settings/gitlab", + "fr/settings/ci", + "fr/settings/preview-deployments" + ] + } ] }, { - "group": "API pages", - "pages": [ - "api-playground/overview", - "api-playground/openapi-setup", - "api-playground/migrating-from-mdx", + "tab": "Référence API", + "groups": [ { - "group": "Customization", - "icon": "wrench", + "group": "Référence API", "pages": [ - "api-playground/customization/complex-data-types", - "api-playground/customization/adding-sdk-examples", - "api-playground/customization/managing-page-visibility", - "api-playground/customization/multiple-responses" + "fr/api-reference/introduction" ] }, { - "group": "AsyncAPI", - "icon": "webhook", + "group": "Admin", "pages": [ - "api-playground/asyncapi/setup", - "api-playground/asyncapi/playground" + "fr/api-reference/update/trigger", + "fr/api-reference/update/status" ] }, { - "group": "MDX", - "icon": "markdown", + "group": "Assistant", "pages": [ - "api-playground/mdx/configuration", - "api-playground/mdx/authentication" + "fr/api-reference/assistant/create-assistant-message", + "fr/api-reference/assistant/search" ] - }, - "api-playground/troubleshooting" + } ] }, { - "group": "Authentication and personalization", - "pages": [ - "authentication-personalization/authentication-setup", - "authentication-personalization/personalization-setup" + "tab": "Journal des modifications", + "groups": [ + { + "group": "Journal des modifications", + "pages": [ + "fr/changelog" + ] + } ] - }, + } + ], + "language": "fr" + }, + { + "tabs": [ { - "group": "Guides", - "pages": [ - "guides/migration", + "tab": "Documentación", + "groups": [ { - "group": "Analytics dashboard", - "icon": "chart-line", + "group": "Primeros pasos", "pages": [ - "analytics/overview", - "analytics/feedback", - "analytics/search", - "analytics/improving-docs" + "es/index", + "es/quickstart", + "es/installation", + { + "group": "Editor web", + "icon": "mouse-pointer-2", + "pages": [ + "es/editor/getting-started", + "es/editor/git-concepts", + "es/editor/branches", + "es/editor/content-management", + "es/editor/publishing", + "es/editor/keyboard-shortcuts", + "es/editor/troubleshooting" + ] + } ] }, - "react-components", - "settings/custom-scripts", - "settings/seo", - "guides/changelogs", - "guides/hidden-pages", - "settings/broken-links", - "settings/custom-404-page", - "guides/monorepo", { - "group": "Custom subdirectory", - "icon": "folder", + "group": "Configuración central", "pages": [ - "advanced/subpath/cloudflare", - "advanced/subpath/route53-cloudfront", - "advanced/subpath/vercel", - "guides/csp-configuration" + "es/settings", + "es/pages", + "es/navigation", + "es/themes", + "es/settings/custom-domain" ] }, { - "group": "Dashboard access", - "icon": "gauge", + "group": "Optimización de IA", "pages": [ - "advanced/dashboard/sso", - "advanced/dashboard/permissions", - "advanced/dashboard/roles" + "es/guides/assistant", + "es/ai/llmstxt", + "es/ai/contextual-menu", + "es/ai/model-context-protocol", + "es/ai/markdown-export", + "es/guides/geo", + "es/guides/claude-code", + "es/guides/cursor", + "es/guides/windsurf", + "es/ai/slack-app" + ] + }, + { + "group": "Componentes", + "pages": [ + "es/text", + "es/image-embeds", + "es/list-table", + "es/code", + "es/reusable-snippets", + "es/components/accordions", + "es/components/callouts", + "es/components/cards", + "es/components/columns", + "es/components/code-groups", + "es/components/examples", + "es/components/expandables", + "es/components/fields", + "es/components/frames", + "es/components/icons", + "es/components/mermaid-diagrams", + "es/components/panel", + "es/components/steps", + "es/components/tabs", + "es/components/tooltips", + "es/components/update", + "es/components/banner" + ] + }, + { + "group": "Páginas de API", + "pages": [ + "es/api-playground/overview", + "es/api-playground/openapi-setup", + "es/api-playground/migrating-from-mdx", + { + "group": "Personalización", + "icon": "wrench", + "pages": [ + "es/api-playground/customization/complex-data-types", + "es/api-playground/customization/adding-sdk-examples", + "es/api-playground/customization/managing-page-visibility", + "es/api-playground/customization/multiple-responses" + ] + }, + { + "group": "AsyncAPI", + "icon": "webhook", + "pages": [ + "es/api-playground/asyncapi/setup", + "es/api-playground/asyncapi/playground" + ] + }, + { + "group": "MDX", + "icon": "markdown", + "pages": [ + "es/api-playground/mdx/configuration", + "es/api-playground/mdx/authentication" + ] + }, + "es/api-playground/troubleshooting" + ] + }, + { + "group": "Autenticación y personalización", + "pages": [ + "es/authentication-personalization/authentication-setup", + "es/authentication-personalization/personalization-setup" + ] + }, + { + "group": "Guías", + "pages": [ + "es/guides/migration", + { + "group": "Panel de analíticas", + "icon": "chart-line", + "pages": [ + "es/analytics/overview", + "es/analytics/feedback", + "es/analytics/search", + "es/analytics/improving-docs" + ] + }, + "es/react-components", + "es/settings/custom-scripts", + "es/settings/seo", + "es/guides/changelogs", + "es/guides/hidden-pages", + "es/settings/broken-links", + "es/settings/custom-404-page", + "es/guides/monorepo", + { + "group": "Subdirectorio personalizado", + "icon": "folder", + "pages": [ + "es/advanced/subpath/cloudflare", + "es/advanced/subpath/route53-cloudfront", + "es/advanced/subpath/vercel", + "es/guides/csp-configuration" + ] + }, + { + "group": "Acceso al panel", + "icon": "gauge", + "pages": [ + "es/advanced/dashboard/sso", + "es/advanced/dashboard/permissions", + "es/advanced/dashboard/roles" + ] + }, + "es/guides/deployments", + "es/contact-support" ] }, - "guides/deployments", - "contact-support" - ] - }, - { - "group": "Integrations", - "pages": [ { - "group": "Analytics", - "icon": "chart-no-axes-combined", + "group": "Integraciones", "pages": [ - "integrations/analytics/overview", - "integrations/analytics/amplitude", - "integrations/analytics/clearbit", - "integrations/analytics/fathom", - "integrations/analytics/google-analytics", - "integrations/analytics/google-tag-manager", - "integrations/analytics/heap", - "integrations/analytics/hightouch", - "integrations/analytics/hotjar", - "integrations/analytics/koala", - "integrations/analytics/logrocket", - "integrations/analytics/mixpanel", - "integrations/analytics/pirsch", - "integrations/analytics/plausible", - "integrations/analytics/posthog", - "integrations/analytics/segment" + { + "group": "Analítica", + "icon": "chart-no-axes-combined", + "pages": [ + "es/integrations/analytics/overview", + "es/integrations/analytics/amplitude", + "es/integrations/analytics/clearbit", + "es/integrations/analytics/fathom", + "es/integrations/analytics/google-analytics", + "es/integrations/analytics/google-tag-manager", + "es/integrations/analytics/heap", + "es/integrations/analytics/hightouch", + "es/integrations/analytics/hotjar", + "es/integrations/analytics/koala", + "es/integrations/analytics/logrocket", + "es/integrations/analytics/mixpanel", + "es/integrations/analytics/pirsch", + "es/integrations/analytics/plausible", + "es/integrations/analytics/posthog", + "es/integrations/analytics/segment" + ] + }, + { + "group": "Kits de desarrollo (SDK)", + "icon": "folder-code", + "pages": [ + "es/integrations/sdks/speakeasy", + "es/integrations/sdks/stainless" + ] + }, + { + "group": "Soporte", + "icon": "messages-square", + "pages": [ + "es/integrations/support/overview", + "es/integrations/support/intercom", + "es/integrations/support/front" + ] + }, + { + "group": "Privacidad", + "icon": "folder-lock", + "pages": [ + "es/integrations/privacy/overview", + "es/integrations/privacy/osano" + ] + } ] }, { - "group": "SDKs", - "icon": "folder-code", + "group": "Control de versiones y CI/CD", "pages": [ - "integrations/sdks/speakeasy", - "integrations/sdks/stainless" + "es/settings/github", + "es/settings/gitlab", + "es/settings/ci", + "es/settings/preview-deployments" + ] + } + ] + }, + { + "tab": "Referencia de la API", + "groups": [ + { + "group": "Referencia de API", + "pages": [ + "es/api-reference/introduction" ] }, { - "group": "Support", - "icon": "messages-square", + "group": "Administrador", "pages": [ - "integrations/support/overview", - "integrations/support/intercom", - "integrations/support/front" + "es/api-reference/update/trigger", + "es/api-reference/update/status" ] }, { - "group": "Privacy", - "icon": "folder-lock", + "group": "Asistente", "pages": [ - "integrations/privacy/overview", - "integrations/privacy/osano" + "es/api-reference/assistant/create-assistant-message", + "es/api-reference/assistant/search" ] } ] }, { - "group": "Version control and CI/CD", - "pages": [ - "settings/github", - "settings/gitlab", - "settings/ci", - "settings/preview-deployments" + "tab": "Registro de cambios", + "groups": [ + { + "group": "Registro de cambios", + "pages": [ + "es/changelog" + ] + } ] } - ] + ], + "language": "es" }, { - "tab": "API Reference", - "groups": [ + "tabs": [ { - "group": "API Reference", - "pages": [ - "api-reference/introduction" + "tab": "文档", + "groups": [ + { + "group": "快速入门", + "pages": [ + "zh/index", + "zh/quickstart", + "zh/installation", + { + "group": "网页编辑器", + "icon": "mouse-pointer-2", + "pages": [ + "zh/editor/getting-started", + "zh/editor/git-concepts", + "zh/editor/branches", + "zh/editor/content-management", + "zh/editor/publishing", + "zh/editor/keyboard-shortcuts", + "zh/editor/troubleshooting" + ] + } + ] + }, + { + "group": "核心配置", + "pages": [ + "zh/settings", + "zh/pages", + "zh/navigation", + "zh/themes", + "zh/settings/custom-domain" + ] + }, + { + "group": "AI优化", + "pages": [ + "zh/guides/assistant", + "zh/ai/llmstxt", + "zh/ai/contextual-menu", + "zh/ai/model-context-protocol", + "zh/ai/markdown-export", + "zh/guides/geo", + "zh/guides/claude-code", + "zh/guides/cursor", + "zh/guides/windsurf", + "zh/ai/slack-app" + ] + }, + { + "group": "组件", + "pages": [ + "zh/text", + "zh/image-embeds", + "zh/list-table", + "zh/code", + "zh/reusable-snippets", + "zh/components/accordions", + "zh/components/callouts", + "zh/components/cards", + "zh/components/columns", + "zh/components/code-groups", + "zh/components/examples", + "zh/components/expandables", + "zh/components/fields", + "zh/components/frames", + "zh/components/icons", + "zh/components/mermaid-diagrams", + "zh/components/panel", + "zh/components/steps", + "zh/components/tabs", + "zh/components/tooltips", + "zh/components/update", + "zh/components/banner" + ] + }, + { + "group": "API 页面", + "pages": [ + "zh/api-playground/overview", + "zh/api-playground/openapi-setup", + "zh/api-playground/migrating-from-mdx", + { + "group": "自定义", + "icon": "wrench", + "pages": [ + "zh/api-playground/customization/complex-data-types", + "zh/api-playground/customization/adding-sdk-examples", + "zh/api-playground/customization/managing-page-visibility", + "zh/api-playground/customization/multiple-responses" + ] + }, + { + "group": "AsyncAPI规范", + "icon": "webhook", + "pages": [ + "zh/api-playground/asyncapi/setup", + "zh/api-playground/asyncapi/playground" + ] + }, + { + "group": "MDX", + "icon": "markdown", + "pages": [ + "zh/api-playground/mdx/configuration", + "zh/api-playground/mdx/authentication" + ] + }, + "zh/api-playground/troubleshooting" + ] + }, + { + "group": "认证与个性化", + "pages": [ + "zh/authentication-personalization/authentication-setup", + "zh/authentication-personalization/personalization-setup" + ] + }, + { + "group": "指南", + "pages": [ + "zh/guides/migration", + { + "group": "分析仪表板", + "icon": "chart-line", + "pages": [ + "zh/analytics/overview", + "zh/analytics/feedback", + "zh/analytics/search", + "zh/analytics/improving-docs" + ] + }, + "zh/react-components", + "zh/settings/custom-scripts", + "zh/settings/seo", + "zh/guides/changelogs", + "zh/guides/hidden-pages", + "zh/settings/broken-links", + "zh/settings/custom-404-page", + "zh/guides/monorepo", + { + "group": "自定义子目录", + "icon": "folder", + "pages": [ + "zh/advanced/subpath/cloudflare", + "zh/advanced/subpath/route53-cloudfront", + "zh/advanced/subpath/vercel", + "zh/guides/csp-configuration" + ] + }, + { + "group": "仪表盘访问权限", + "icon": "gauge", + "pages": [ + "zh/advanced/dashboard/sso", + "zh/advanced/dashboard/permissions", + "zh/advanced/dashboard/roles" + ] + }, + "zh/guides/deployments", + "zh/contact-support" + ] + }, + { + "group": "集成", + "pages": [ + { + "group": "分析", + "icon": "chart-no-axes-combined", + "pages": [ + "zh/integrations/analytics/overview", + "zh/integrations/analytics/amplitude", + "zh/integrations/analytics/clearbit", + "zh/integrations/analytics/fathom", + "zh/integrations/analytics/google-analytics", + "zh/integrations/analytics/google-tag-manager", + "zh/integrations/analytics/heap", + "zh/integrations/analytics/hightouch", + "zh/integrations/analytics/hotjar", + "zh/integrations/analytics/koala", + "zh/integrations/analytics/logrocket", + "zh/integrations/analytics/mixpanel", + "zh/integrations/analytics/pirsch", + "zh/integrations/analytics/plausible", + "zh/integrations/analytics/posthog", + "zh/integrations/analytics/segment" + ] + }, + { + "group": "SDK", + "icon": "folder-code", + "pages": [ + "zh/integrations/sdks/speakeasy", + "zh/integrations/sdks/stainless" + ] + }, + { + "group": "支持", + "icon": "messages-square", + "pages": [ + "zh/integrations/support/overview", + "zh/integrations/support/intercom", + "zh/integrations/support/front" + ] + }, + { + "group": "隐私", + "icon": "folder-lock", + "pages": [ + "zh/integrations/privacy/overview", + "zh/integrations/privacy/osano" + ] + } + ] + }, + { + "group": "版本控制与CI/CD", + "pages": [ + "zh/settings/github", + "zh/settings/gitlab", + "zh/settings/ci", + "zh/settings/preview-deployments" + ] + } ] }, { - "group": "Admin", - "pages": [ - "api-reference/update/trigger", - "api-reference/update/status" + "tab": "API 参考", + "groups": [ + { + "group": "API 参考", + "pages": [ + "zh/api-reference/introduction" + ] + }, + { + "group": "管理员", + "pages": [ + "zh/api-reference/update/trigger", + "zh/api-reference/update/status" + ] + }, + { + "group": "文档助手", + "pages": [ + "zh/api-reference/assistant/create-assistant-message", + "zh/api-reference/assistant/search" + ] + } ] }, { - "group": "Assistant", - "pages": [ - "api-reference/assistant/create-assistant-message", - "api-reference/assistant/search" - ] - } - ] - }, - { - "tab": "Changelog", - "groups": [ - { - "group": "Changelog", - "pages": [ - "changelog" + "tab": "更新日志", + "groups": [ + { + "group": "变更日志", + "pages": [ + "zh/changelog" + ] + } ] } - ] + ], + "language": "zh" } ] }, diff --git a/es/advanced/dashboard/permissions.mdx b/es/advanced/dashboard/permissions.mdx new file mode 100644 index 000000000..2934b173f --- /dev/null +++ b/es/advanced/dashboard/permissions.mdx @@ -0,0 +1,21 @@ +--- +title: "Permisos de editor" +description: "Permite que más miembros de tu equipo actualicen tu documentación" +--- + +Un editor tiene acceso a tu panel y al editor web. + +Cualquiera puede contribuir a tu documentación trabajando localmente y enviando cambios a tu repositorio, pero hay diferencias clave en cómo se publican los cambios: + +* **Cambios de editor**: Cuando un editor publica a través del editor web o fusiona una pull request en tu repositorio de documentación, los cambios se despliegan automáticamente en tu sitio en vivo. +* **Cambios de no editor**: Cuando alguien que no es editor fusiona una pull request en tu repositorio, debes activar manualmente un despliegue desde tu panel para que esos cambios aparezcan en tu sitio en vivo. + + + +

+ ## Agregar editores +
+ +De forma predeterminada, el miembro del equipo que creó tu organización de Mintlify tiene acceso de editor. Agrega editores adicionales en la página [Members](https://dashboard.mintlify.com/settings/organization/members) de tu panel. + +Los puestos de editor se facturan según el uso y puedes tener tantos editores como necesites. Consulta nuestra [página de precios](https://mintlify.com/pricing) para más detalles. diff --git a/es/advanced/dashboard/roles.mdx b/es/advanced/dashboard/roles.mdx new file mode 100644 index 000000000..3443e2ac6 --- /dev/null +++ b/es/advanced/dashboard/roles.mdx @@ -0,0 +1,26 @@ +--- +title: "Roles" +description: "Controla el acceso a tu panel con roles." +--- + + + La funcionalidad RBAC está disponible en el [plan Enterprise](https://mintlify.com/pricing?ref=rbac). + + +Mintlify ofrece dos niveles de acceso al panel: Editor y Administrador. + +A continuación se detallan las acciones restringidas al rol de Administrador: + +| | Editor | Administrador | +| ----------------------- | :----: | :-----------: | +| Actualizar roles de usuario | ❌ | ✅ | +| Eliminar usuarios | ❌ | ✅ | +| Invitar usuarios administradores | ❌ | ✅ | +| Gestionar y actualizar la facturación | ❌ | ✅ | +| Actualizar el dominio personalizado | ❌ | ✅ | +| Actualizar la fuente de Git | ❌ | ✅ | +| Eliminar la organización | ❌ | ✅ | + +Las demás acciones del panel están disponibles para ambos roles. + +Puedes invitar a tantos administradores como quieras, pero recomendamos limitar el acceso de administrador a los usuarios que lo necesiten. diff --git a/es/advanced/dashboard/sso.mdx b/es/advanced/dashboard/sso.mdx new file mode 100644 index 000000000..41e315aae --- /dev/null +++ b/es/advanced/dashboard/sso.mdx @@ -0,0 +1,141 @@ +--- +title: "Inicio de sesión único (SSO)" +description: "Personaliza cómo tu equipo puede iniciar sesión en el panel de administración" +--- + + + La funcionalidad de SSO está disponible en el [plan Enterprise](https://mintlify.com/pricing?ref=sso). + + +Usa el inicio de sesión único en tu panel mediante SAML y OIDC. Si usas Okta, Google Workspace o Microsoft Entra, contamos con documentación específica del proveedor para configurar SSO. Si usas otro proveedor, [contáctanos](mailto:support@mintlify.com). + + + +
+ ## Okta +
+ + + + + + En `Applications`, haz clic para crear una nueva integración de aplicación usando SAML 2.0. + + + Ingresa lo siguiente: + * Single sign-on URL (proporcionada por Mintlify) + * Audience URI (proporcionada por Mintlify) + * Name ID Format: `EmailAddress` + * Attribute Statements: + | Name | Name format | Value + | ---- | ----------- | ----- + | `firstName` | Basic | `user.firstName` | + | `lastName` | Basic | `user.lastName` | + + + Una vez configurada la aplicación, ve a la pestaña de inicio de sesión y envíanos la URL de metadatos. + Habilitaremos la conexión por nuestra parte usando esta información. + + + + + + + En `Applications`, haz clic para crear una nueva integración de aplicación usando OIDC. + Debes elegir el tipo de aplicación `Web Application`. + + + Selecciona el tipo de concesión Authorization Code e ingresa la Redirect URI proporcionada por Mintlify. + + + Una vez configurada la aplicación, ve a la pestaña General y localiza el client ID y el client secret. + Por favor, proporciónanos ambos de forma segura, junto con la URL de tu instancia de Okta (p. ej., `.okta.com`). Puedes enviarlos mediante un servicio como 1Password o SendSafely. + + + + + + + +
+ ## Google Workspace +
+ + + + + + En `Web and mobile apps`, selecciona `Add custom SAML app` en el menú desplegable `Add app`. + + ![](/images/gsuite-add-custom-saml-app.png) + + + + Copia la SSO URL, el Entity ID y el certificado x509 proporcionados y envíalos al equipo de Mintlify. + + ![](/images/gsuite-saml-metadata.png) + + + + En la página Service provider details, introduce lo siguiente: + * ACS URL (proporcionado por Mintlify) + * Entity ID (proporcionado por Mintlify) + * Name ID format: `EMAIL` + * Name ID: `Basic Information > Primary email` + + + ![](/images/gsuite-sp-details.png) + + + En la siguiente página, introduce las siguientes declaraciones de atributos: + | Google Directory Attribute | App Attribute | + | -------------------------- | ------------- | + | `First name` | `firstName` | + | `Last name` | `lastName` | + + Cuando completes este paso y los usuarios estén asignados a la aplicación, avísanos y habilitaremos el SSO para tu cuenta. + + + + + + + +
+ ## Microsoft Entra +
+ + + + + + 1. En "Enterprise applications", selecciona **New application**. + 2. Selecciona **Create your own application** y elige "Integrate any other application you don't find in the gallery (Non-gallery)." + + + Ve a la página de configuración de Single Sign-On y selecciona **SAML**. En "Basic SAML Configuration", ingresa lo siguiente: + * Identifier (Entity ID): el Audience URI proporcionado por Mintlify. + * Reply URL (Assertion Consumer Service URL): la URL de ACS proporcionada por Mintlify. + + Deja los demás valores en blanco y selecciona **Save**. + + + Edita la sección Attributes & Claims: + 1. Selecciona **Unique User Identifier (Name ID)** en "Required Claim". + 2. Cambia el Source attribute para usar `user.primaryauthoritativeemail`. + 3. En Additional claims, crea los siguientes claims: + | Name | Value | + | ---- | ----- | + | `firstName` | `user.givenname` | + | `lastName` | `user.surname` | + + + Una vez que la aplicación esté configurada, ve a la sección "SAML Certificates" y envíanos el App Federation Metadata URL. + Habilitaremos la conexión de nuestro lado usando esta información. + + + Ve a "Users and groups" en tu aplicación de Entra y agrega a los usuarios que deban tener acceso a tu panel. + + + + diff --git a/es/advanced/subpath/cloudflare.mdx b/es/advanced/subpath/cloudflare.mdx new file mode 100644 index 000000000..45b9f0e72 --- /dev/null +++ b/es/advanced/subpath/cloudflare.mdx @@ -0,0 +1,208 @@ +--- +title: "Cloudflare" +description: "Aloja la documentación en una subruta personalizada con Cloudflare Workers" +--- + +import Propagating from "/snippets/es/custom-subpath-propagating.mdx"; + +Para alojar tu documentación en una subruta personalizada como `yoursite.com/docs` con Cloudflare, deberás crear y configurar un Cloudflare Worker. + + + Antes de empezar, necesitas una cuenta de Cloudflare y un nombre de dominio (puede administrarse dentro o fuera de Cloudflare). + + + +
+ ## Estructura del repositorio +
+ +Los archivos de documentación deben organizarse dentro del repositorio para que coincidan con la subruta elegida. Por ejemplo, si quieres que tu documentación esté en `yoursite.com/docs`, crea un directorio `docs/` con todos los archivos de documentación. + +
+ ## Configurar un Cloudflare Worker +
+ +Crea un Cloudflare Worker siguiendo la [guía de inicio de Cloudflare Workers](https://developers.cloudflare.com/workers/get-started/dashboard/) si aún no lo has hecho. + + + Si tu proveedor de DNS es Cloudflare, no habilites el proxy para el registro CNAME. + + +
+ ### Proxies con implementaciones de Vercel +
+ +Si usas Cloudflare como proxy con implementaciones de Vercel, asegúrate de configurarlo correctamente para evitar conflictos con la verificación de dominio de Vercel y el aprovisionamiento de certificados SSL. + +Una configuración de proxy incorrecta puede impedir que Vercel emita certificados SSL de Let's Encrypt y provocar errores en la verificación de dominio. + +
+ #### Lista de rutas permitidas obligatoria +
+ +Tu Cloudflare Worker debe permitir el tráfico a estas rutas específicas sin bloquear ni redirigir: + +- `/.well-known/acme-challenge/*` - Necesario para la verificación del certificado de Let's Encrypt +- `/.well-known/vercel/*` - Necesario para la verificación de dominios en Vercel + +Si bien Cloudflare gestiona automáticamente muchas reglas de verificación, crear reglas personalizadas adicionales podría bloquear inadvertidamente este tráfico crítico. + +
+ #### Requisitos para el reenvío de encabezados +
+ +Asegúrate de que el encabezado `HOST` se reenvíe correctamente en la configuración de tu Worker. Si los encabezados no se reenvían correctamente, las solicitudes de verificación fallarán. + +
+ ### Configurar el enrutamiento +
+ +En tu panel de Cloudflare, selecciona **Edit Code** y agrega el siguiente script en el código de tu Worker. Consulta la [documentación de Cloudflare](https://developers.cloudflare.com/workers-ai/get-started/dashboard/#development) para obtener más información sobre cómo editar un Worker. + + + Reemplaza `[SUBDOMAIN]` por tu subdominio único, `[YOUR_DOMAIN]` por la URL base de tu sitio web y `/docs` por la subruta que prefieras si fuera distinta. + + +```javascript +addEventListener("fetch", (event) => { + event.respondWith(handleRequest(event.request)); +}); + +async function handleRequest(request) { + try { + const urlObject = new URL(request.url); + + // Si la solicitud es a una ruta de verificación de Vercel, deja que pase + if (urlObject.pathname.startsWith('/.well-known/')) { + return await fetch(request); + } + + // Si la solicitud es al subdirectorio de docs + if (/^\/docs/.test(urlObject.pathname)) { + // Entonces, haz proxy a Mintlify + const DOCS_URL = "[SUBDOMAIN].mintlify.dev"; + const CUSTOM_URL = "[YOUR_DOMAIN]"; + + let url = new URL(request.url); + url.hostname = DOCS_URL; + + let proxyRequest = new Request(url, request); + + proxyRequest.headers.set("Host", DOCS_URL); + proxyRequest.headers.set("X-Forwarded-Host", CUSTOM_URL); + proxyRequest.headers.set("X-Forwarded-Proto", "https"); + // Si despliegas en Vercel, conserva la IP del cliente + proxyRequest.headers.set("CF-Connecting-IP", request.headers.get("CF-Connecting-IP")); + + return await fetch(proxyRequest); + } + } catch (error) { + // Si no se encuentra ninguna coincidencia, procesa la solicitud normal + return await fetch(request); + } +} +``` + +Selecciona **Deploy** y espera a que los cambios se propaguen. + + + + +
+ ### Prueba tu Worker +
+ +Después de desplegar tu código, prueba tu Worker para asegurarte de que redirige a tu documentación de Mintlify. + +1. Prueba usando la URL de vista previa del Worker: `your-worker.your-subdomain.workers.dev/docs` +2. Verifica que el Worker redirige a tu documentación de Mintlify y a tu sitio web. + +
+ ### Agregar dominio personalizado +
+ +1. En tu [panel de Cloudflare](https://dash.cloudflare.com/), ve a tu Worker. +2. Ve a **Settings > Domains & Routes > Add > Custom Domain**. +3. Agrega tu dominio. + + + Recomendamos agregar tu dominio tanto con `www.` como sin él. + + +Consulta [Add a custom domain](https://developers.cloudflare.com/workers/configuration/routing/custom-domains/#add-a-custom-domain) en la documentación de Cloudflare para más información. + +
+ ### Resolver conflictos de DNS +
+ +Si tu dominio ya apunta a otro servicio, debes eliminar el registro DNS existente. Tu Cloudflare Worker debe estar configurado para controlar todo el tráfico de tu dominio. + +1. Elimina el registro DNS existente de tu dominio. Consulta [Eliminar registros DNS](https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/#delete-dns-records) en la documentación de Cloudflare para obtener más información. +2. Regresa a tu Worker y añade tu dominio personalizado. + +
+ ## Enrutamiento personalizado en Webflow +
+ +Si usas Webflow para alojar tu sitio principal y quieres servir la documentación de Mintlify en `/docs` en el mismo dominio, tendrás que configurar un enrutamiento personalizado mediante Cloudflare Workers para enrutar todo el tráfico que no sea de docs a tu sitio principal. + + + Asegúrate de que tu sitio principal esté configurado en una página de aterrizaje antes de desplegar este Worker, o quienes visiten tu sitio principal verán errores. + + +1. En Webflow, configura una página de aterrizaje para tu sitio principal, por ejemplo `landing.yoursite.com`. Esta será la página que verán las personas al visitar tu sitio. +2. Despliega tu sitio principal en la página de aterrizaje. Esto garantiza que tu sitio principal siga siendo accesible mientras configuras el Worker. +3. Para evitar conflictos, actualiza cualquier URL absoluta en tu sitio principal para que sea relativa. +4. En Cloudflare, selecciona **Edit Code** y añade el siguiente script en el código de tu Worker. + + Reemplaza `[SUBDOMAIN]` por tu subdominio único, `[YOUR_DOMAIN]` por la URL base de tu sitio web, `[LANDING_DOMAIN]` por la URL de tu página de aterrizaje y `/docs` por la subruta deseada si fuera distinta. + +```javascript + addEventListener("fetch", (event) => { + event.respondWith(handleRequest(event.request)); + }); + async function handleRequest(request) { + try { + const urlObject = new URL(request.url); + + // Si la solicitud es a una ruta de verificación de Vercel, deja que pase + if (urlObject.pathname.startsWith('/.well-known/')) { + return await fetch(request); + } + + // Si la solicitud es al subdirectorio de docs + if (/^\/docs/.test(urlObject.pathname)) { + // Encamina a través de un proxy a Mintlify + const DOCS_URL = "[SUBDOMAIN].mintlify.dev"; + const CUSTOM_URL = "[YOUR_DOMAIN]"; + let url = new URL(request.url); + url.hostname = DOCS_URL; + let proxyRequest = new Request(url, request); + proxyRequest.headers.set("Host", DOCS_URL); + proxyRequest.headers.set("X-Forwarded-Host", CUSTOM_URL); + proxyRequest.headers.set("X-Forwarded-Proto", "https"); + // Si se despliega en Vercel, conserva la IP del cliente + proxyRequest.headers.set("CF-Connecting-IP", request.headers.get("CF-Connecting-IP")); + return await fetch(proxyRequest); + } + // Envía todo lo demás al sitio principal + const MAIN_SITE_URL = "[LANDING_DOMAIN]"; + if (MAIN_SITE_URL && MAIN_SITE_URL !== "[LANDING_DOMAIN]") { + let mainSiteUrl = new URL(request.url); + mainSiteUrl.hostname = MAIN_SITE_URL; + return await fetch(mainSiteUrl, { + method: request.method, + headers: request.headers, + body: request.body + }); + } + } catch (error) { + // Si no se encuentra ninguna coincidencia, atiende la solicitud normal + return await fetch(request); + } + } +``` + +5. Selecciona **Deploy** y espera a que los cambios se propaguen. + + diff --git a/es/advanced/subpath/route53-cloudfront.mdx b/es/advanced/subpath/route53-cloudfront.mdx new file mode 100644 index 000000000..1ae7d554b --- /dev/null +++ b/es/advanced/subpath/route53-cloudfront.mdx @@ -0,0 +1,237 @@ +--- +title: "AWS Route 53 y CloudFront" +sidebarTitle: "AWS" +description: "Hospeda la documentación en una subruta personalizada con servicios de AWS" +--- + +import Propagating from "/snippets/es/custom-subpath-propagating.mdx"; + +Para alojar tu documentación en una subruta personalizada como `yoursite.com/docs` con AWS Route 53 y CloudFront, debes configurar tu proveedor de DNS para que apunte a tu distribución de CloudFront. + + +
+ ## Estructura del repositorio +
+ +Debes organizar los archivos de documentación dentro de tu repositorio para que coincidan con la estructura de subruta que elijas. Por ejemplo, si quieres tu documentación en `yoursite.com/docs`, crea un directorio `docs/` con todos los archivos de documentación. + +
+ ## Descripción general de alto nivel +
+ +Enruta el tráfico a estas rutas con una política de caché **CachingDisabled**: + +- `/.well-known/acme-challenge/*` - Requerido para la verificación de certificados de Let's Encrypt +- `/.well-known/vercel/*` - Requerido para la verificación de dominio +- `/docs/*` - Requerido para el enrutamiento por subruta +- `/docs/` - Requerido para el enrutamiento por subruta + +Enruta el tráfico a esta ruta con una política de caché **CachingEnabled**: + +- `/mintlify-assets/_next/static/*` +- `Default (*)` - La página de inicio de tu sitio web + +Todos los comportamientos deben tener una **política de solicitud de origen** de `AllViewerExceptHostHeader`. + +![Página de "Behaviors" de CloudFront con 4 comportamientos: `/docs/*`, `/docs`, `Default` y `/.well-known/*`.](/images/cloudfront/all-behaviors.png) + +
+ ## Crear una distribución de CloudFront +
+ +1. Ve a [CloudFront](https://aws.amazon.com/cloudfront) desde la consola de AWS. +2. Selecciona **Create distribution**. + + + ![Página de distribuciones de CloudFront con el botón "Create distribution" resaltado.](/images/cloudfront/create-distribution.png) + + +3. En Origin domain, ingresa `[SUBDOMAIN].mintlify.dev`, donde `[SUBDOMAIN]` es el subdominio único de tu proyecto. + + + ![Página "Create distribution" de CloudFront mostrando "acme.mintlify.dev" como el dominio de origen.](/images/cloudfront/origin-name.png) + + +4. En "Web Application Firewall (WAF)", habilita las protecciones de seguridad. + + + ![Opciones de Web Application Firewall (WAF) con "Enable security protections" seleccionado.](/images/cloudfront/enable-security-protections.png) + + +5. Deja el resto de los ajustes con sus valores predeterminados. +6. Selecciona **Create distribution**. + +
+ ## Agregar origen predeterminado +
+ +1. Después de crear la distribución, ve a la pestaña "Origins". + + + ![Una distribución de CloudFront con la pestaña "Origins" resaltada.](/images/cloudfront/origins.png) + + +2. Busca la URL de staging que refleje el dominio principal. Esto varía mucho según cómo esté alojada tu landing page. Por ejemplo, la URL de staging de Mintlify es [mintlify-landing-page.vercel.app](https://mintlify-landing-page.vercel.app). + + + Si tu landing page está alojada en Webflow, usa la URL de staging de Webflow. Se verá como `.webflow.io`. + + Si usas Vercel, utiliza el dominio `.vercel.app` disponible para cada proyecto. + + +3. Crea un nuevo Origin y agrega tu URL de staging como el "Origin domain". + + + ![Página de CloudFront "Create origin" con el campo de entrada "Origin domain" resaltado.](/images/cloudfront/default-origin.png) + + +A este punto, deberías tener dos Origins: uno con `[SUBDOMAIN].mintlify.app` y otro con tu URL de staging. + + + ![Página de CloudFront "Origins" con dos orígenes: uno para `mintlify` y otro para `mintlify-landing-page`.](/images/cloudfront/final-origins.png) + + +
+ ## Configurar comportamientos +
+ +Los comportamientos en CloudFront permiten controlar la lógica de las subrutas. A alto nivel, buscamos crear la siguiente lógica: + +- **Si un usuario llega a tu subruta personalizada**, ir a `[SUBDOMAIN].mintlify.dev`. +- **Si un usuario llega a cualquier otra página**, ir a la página de destino actual. + +1. Navega a la pestaña "Behaviors" de tu distribución de CloudFront. + + + ![Pestaña "Behaviors" de CloudFront resaltada.](/images/cloudfront/behaviors.png) + + +2. Selecciona el botón **Create behavior** y crea los siguientes comportamientos. + +
+ ### `/.well-known/*` +
+ +Crea comportamientos para las rutas de verificación de dominio de Vercel con un **Patrón de ruta** de `/.well-known/*` y configura **Origen y grupos de orígenes** a la URL de tu documentación. + +Para "Política de caché", selecciona **CachingDisabled** para garantizar que estas solicitudes de verificación se transmitan sin almacenamiento en caché. + + + ![Página de CloudFront "Create behavior" con un "Path pattern" de "/.well-known/*" y "Origin and origin groups" apuntando a la URL de staging.](/images/cloudfront/well-known-policy.png) + + + +Si `.well-known/*` es demasiado genérico, se puede acotar a un mínimo de 2 comportamientos para Vercel: + - `/.well-known/vercel/*` - Requerido para la verificación de dominio de Vercel + - `/.well-known/acme-challenge/*` - Requerido para la verificación de certificados de Let's Encrypt + + +
+ ### Tu subruta personalizada +
+ +Crea un comportamiento con un **patrón de ruta** para la subruta que elijas, por ejemplo `/docs`, con **origen y grupos de origen** apuntando a la URL `.mintlify.dev` (en nuestro caso `acme.mintlify.dev`). + +- Configura "Cache policy" como **CachingOptimized**. +- Configura "Origin request policy" como **AllViewerExceptHostHeader**. +- Configura "Viewer Protocol Policy" como **Redirect HTTP to HTTPS**. + + + ![Página de CloudFront "Create behavior" con un "Path pattern" de "/docs/*" y "Origin and origin groups" apuntando a la URL `acme.mintlify.dev`.](/images/cloudfront/behavior-1.png) + + +
+ ### Tu subruta personalizada con comodín +
+ +Crea un comportamiento con un **Patrón de ruta** de la subruta elegida seguida de `/*`, por ejemplo `/docs/*`, y **Origen y grupos de origen** que apunten a la misma URL `.mintlify.dev`. + +Estos ajustes deben coincidir exactamente con el comportamiento de tu subruta base, con la excepción del **Patrón de ruta**. + +- Establece "Cache policy" en **CachingOptimized**. +- Establece "Origin request policy" en **AllViewerExceptHostHeader**. +- Establece "Viewer protocol policy" en **Redirect HTTP to HTTPS**. + +
+ ### `/mintlify-assets/_next/static/*` +
+ +- Establece "Cache policy" en **CachingOptimized** + - Establece "Origin request policy" en **AllViewerExceptHostHeader** + - Establece "Viewer protocol policy" en **Redirect HTTP to HTTPS** + +
+ ### `Default (*)` +
+ +Por último, vamos a editar el comportamiento `Default (*)`. + + + ![Una distribución de CloudFront con el comportamiento "Default (*)" seleccionado y el botón Edit destacado.](/images/cloudfront/default-behavior-1.png) + + +1. Cambia **Origin and origin groups** del comportamiento predeterminado a la URL de staging (en nuestro caso, `mintlify-landing-page.vercel.app`). + + + ![Página de CloudFront "Edit behavior" con el campo "Origin and origin groups" resaltado.](/images/cloudfront/default-behavior-2.png) + + +2. Selecciona **Save changes**. + +
+ ### Verifica que los comportamientos estén configurados correctamente +
+ +Si sigues los pasos anteriores, tus comportamientos deberían verse así: + + + ![Página de CloudFront "Behaviors" con 4 comportamientos: `/docs/*`, `/docs`, `Default` y `/.well-known/*`.](/images/cloudfront/all-behaviors.png) + + +
+ ## Vista previa de la distribución +
+ +Ahora puedes verificar si tu distribución está configurada correctamente yendo a la pestaña «General» y visitando la URL **Distribution domain name**. + + + ![Pestaña «General» de CloudFront con la URL «Distribution domain name» resaltada.](/images/cloudfront/preview-distribution.png) + + +Todas las páginas deberían dirigirte a tu página principal, pero si agregas la subruta que elegiste, por ejemplo `/docs`, a la URL, deberías ver que te lleva a tu instancia de documentación de Mintlify. + +
+ ## Conectar con Route53 +
+ +Ahora llevaremos la funcionalidad de la distribución de CloudFront a tu dominio principal. + + + Para esta sección, también puedes consultar la guía oficial de AWS: [Configuring + Amazon Route 53 to route traffic to a CloudFront + distribution](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html#routing-to-cloudfront-distribution-config) + + +1. Ve a [Route53](https://aws.amazon.com/route53) en la consola de AWS. +2. Entra en la “Hosted zone” de tu dominio principal. +3. Selecciona **Create record**. + + + ![Página “Records” de Route 53 con el botón “Create record” destacado.](/images/cloudfront/route53-create-record.png) + + +4. Activa `Alias` y luego, en **Route traffic to**, elige la opción `Alias to CloudFront distribution`. + + + ![Página “Create record” de Route 53 con el interruptor “Alias” y el menú “Route traffic to” resaltados.](/images/cloudfront/create-record-alias.png) + + +5. Selecciona **Create records**. + + + Es posible que debas eliminar el registro A existente si ya hay uno. + + +Tu documentación ya está disponible en la subruta que elegiste para tu dominio principal. + + \ No newline at end of file diff --git a/es/advanced/subpath/vercel.mdx b/es/advanced/subpath/vercel.mdx new file mode 100644 index 000000000..1215d8fbf --- /dev/null +++ b/es/advanced/subpath/vercel.mdx @@ -0,0 +1,99 @@ +--- +title: "Vercel" +description: "Aloja la documentación en una subruta personalizada con Vercel" +--- + +import { VercelJsonGenerator } from "/snippets/es/vercel-json-generator.mdx"; + + +
+ ## archivo vercel.json +
+ +El archivo `vercel.json` define cómo se compila y se implementa tu proyecto. Se ubica en el directorio raíz y controla varios aspectos de la implementación, incluido el enrutamiento, las redirecciones, los encabezados y la configuración de compilación. + +Usamos la opción `rewrites` para hacer de proxy y enrutar solicitudes desde tu dominio principal hacia tu documentación. + +Los rewrites mapean solicitudes entrantes a destinos distintos sin cambiar la URL en el navegador. Cuando alguien visita `yoursite.com/docs`, Vercel obtendrá internamente el contenido de `your-subdomain.mintlify.dev/docs`, pero el usuario seguirá viendo `yoursite.com/docs` en su navegador. Esto difiere de las redirecciones, que enviarían a los usuarios a una URL completamente diferente. + +Puedes personalizar la subruta con cualquier valor que prefieras, como `/docs`, `/help` o `/guides`. Además, puedes usar subrutas con varios niveles, como `/product/docs`. + +
+ ## Estructura del repositorio +
+ +Los archivos de documentación deben organizarse dentro del repositorio para que coincidan con la estructura de subruta que elijas. Por ejemplo, si quieres que tu documentación esté en `yoursite.com/docs`, crea un directorio `docs/` con todos los archivos de documentación. + +
+ ## Configuración +
+ +Para alojar tu documentación en una subruta personalizada con Vercel, añade la siguiente configuración a tu archivo `vercel.json`. Este ejemplo usa `/docs`, pero puedes sustituirlo por cualquier subruta: + +```json +{ + "rewrites": [ + { + "source": "/docs", + "destination": "https://[subdomain].mintlify.dev/docs" + }, + { + "source": "/docs/:match*", + "destination": "https://[subdomain].mintlify.dev/docs/:match*" + } + ] +} +``` + +* **`source`**: El patrón de ruta en tu dominio que activa la reescritura. +* **`destination`**: Adonde se debe enviar la solicitud mediante proxy. +* **`:match*`**: Un comodín que captura cualquier segmento de la ruta después de tu subruta. + +Para obtener más información, consulta [Configuring projects with vercel.json: Rewrites](https://vercel.com/docs/projects/project-configuration#rewrites) en la documentación de Vercel. + + +
+ ### Generar redirecciones +
+ +Ingresa tu subdominio y subdirectorio personalizado para generar las redirecciones para tu archivo `vercel.json`. + + + +
+ ## Uso de proxies externos con Vercel +
+ +Si utilizas un proxy externo (como Cloudflare o AWS CloudFront) delante de tu despliegue en Vercel, debes configurarlo correctamente para evitar conflictos con la verificación de dominios de Vercel y la emisión de certificados SSL. + +Una configuración incorrecta del proxy puede impedir que Vercel emita certificados SSL de Let's Encrypt y provocar errores en la verificación de dominio. + +Consulta los [proveedores admitidos](https://vercel.com/guides/how-to-setup-verified-proxy#supported-providers-verified-proxy-lite) en la documentación de Vercel. + +
+ ### Lista de rutas permitidas obligatoria +
+ +Tu proxy externo debe permitir el tráfico a estas rutas específicas sin bloquear, redirigir ni aplicar caché agresiva: + +- `/.well-known/acme-challenge/*` - Necesaria para la verificación de certificados de Let's Encrypt +- `/.well-known/vercel/*` - Necesaria para la verificación de dominios de Vercel +- `/mintlify-assets/_next/static/*` - Necesaria para los recursos estáticos + +Estas rutas deben pasar directamente a tu despliegue en Vercel sin modificaciones. + +
+ ### Requisitos para el reenvío de encabezados +
+ +Asegúrate de que tu proxy reenvíe correctamente el encabezado `HOST`. Sin un reenvío adecuado de este encabezado, las solicitudes de verificación fallarán. + +
+ ### Prueba de la configuración de tu proxy +
+ +Para verificar que tu proxy esté configurado correctamente: + +1. Comprueba que `https://[yourdomain].com/.well-known/vercel/` devuelva una respuesta. +2. Asegúrate de que los certificados SSL se estén aprovisionando correctamente en tu panel de Vercel. +3. Verifica que la verificación de dominio se complete correctamente. \ No newline at end of file diff --git a/es/ai/contextual-menu.mdx b/es/ai/contextual-menu.mdx new file mode 100644 index 000000000..2759bec4a --- /dev/null +++ b/es/ai/contextual-menu.mdx @@ -0,0 +1,162 @@ +--- +title: "Menú contextual" +description: "Añade integraciones de IA con un clic a tu documentación" +icon: "square-menu" +--- + +import { PreviewButton } from "/snippets/previewbutton.jsx" +import IconsRequired from "/snippets/es/icons-required.mdx"; + +El menú contextual ofrece acceso rápido a contenido optimizado para IA e integraciones directas con herramientas de IA populares. Cuando los usuarios abren el menú contextual en cualquier página, pueden copiar contenido para usarlo como contexto en herramientas de IA o iniciar conversaciones en ChatGPT, Claude, Perplexity o una herramienta personalizada de su elección, con su documentación ya cargada como contexto. + + + + +El menú contextual incluye varias opciones prediseñadas que puedes habilitar agregando su identificador a tu configuración. + +| Opción | Identificador | Descripción | +|:--------|:------------|:-------------| +| **Copiar página** | `copy` | Copia la página actual como Markdown para pegarla como contexto en herramientas de IA | +| **Ver como Markdown** | `view` | Abre la página actual como Markdown | +| **Abrir en ChatGPT** | `chatgpt` | Crea una conversación en ChatGPT con la página actual como contexto | +| **Abrir en Claude** | `claude` | Crea una conversación en Claude con la página actual como contexto | +| **Abrir en Perplexity** | `perplexity` | Crea una conversación en Perplexity con la página actual como contexto | +| **Copiar URL del servidor MCP** | `mcp` | Copia la URL de tu servidor MCP en el portapapeles | +| **Conectar con Cursor** | `cursor` | Instala tu servidor MCP alojado en Cursor | +| **Conectar con VS Code** | `vscode` | Instala tu servidor MCP alojado en VS Code | + + + El menú contextual expandido que muestra las opciones Copiar página, Ver como Markdown, Abrir en ChatGPT y Abrir en Claude. + + +
+ ## Habilitar el menú contextual +
+ +Agrega el campo `contextual` a tu archivo `docs.json` y especifica qué opciones quieres incluir. + +```json +{ + "contextual": { + "options": [ + "copiar", + "ver", + "chatgpt", + "claude", + "perplexity", + "mcp", + "cursor", + "vscode" + ] + } +} +``` + + +
+ ## Agregar opciones personalizadas +
+ +Crea opciones personalizadas en el menú contextual agregando un objeto al arreglo `options`. Cada opción personalizada requiere estas propiedades: + + + El título de la opción. + + + + La descripción de la opción. Se muestra debajo del título cuando se expande el menú contextual. + + + + + + El href de la opción. Usa una cadena para enlaces simples o un objeto para enlaces dinámicos con parámetros de consulta. + + + + La URL base de la opción. + + + + Los parámetros de consulta de la opción. + + + + La clave del parámetro de consulta. + + + + El valor del parámetro de consulta. Reemplazaremos los siguientes marcadores de posición por los valores correspondientes: + + * Usa `$page` para insertar el contenido de la página actual en Markdown. + * Usa `$path` para insertar la ruta de la página actual. + * Usa `$mcp` para insertar la URL del servidor MCP alojado. + + + + + + +Ejemplo de opción personalizada: + +```json {9-14} wrap +{ + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity", + { + "title": "Solicitar una función", + "description": "Únete a la conversación en GitHub para pedir una nueva función" + "icon": "plus", + "href": "https://github.com/orgs/mintlify/discussions/categories/feature-requests" + } + ] + } +} +``` + + +
+ ### Ejemplos de opciones personalizadas +
+ + + +```json +{ + "title": "Solicitar una función", + "description": "Únete a la discusión en GitHub", + "icon": "plus", + "href": "https://github.com/orgs/mintlify/discussions/categories/feature-requests" +} +``` + + + +```json +{ + "title": "Compartir en X", + "description": "Comparte esta página en X", + "icon": "x", + "href": { + "base": "https://x.com/intent/tweet", + "query": [ + { + "key": "text", + "value": "Consulta esta documentación: $page" + } + ] + } +} +``` + + \ No newline at end of file diff --git a/es/ai/llmstxt.mdx b/es/ai/llmstxt.mdx new file mode 100644 index 000000000..d37397938 --- /dev/null +++ b/es/ai/llmstxt.mdx @@ -0,0 +1,61 @@ +--- +title: "llms.txt" +description: "Facilita que los LLM lean e indexen tu contenido" +icon: "file-code" +--- + +import { PreviewButton } from "/snippets/previewbutton.jsx" + +El [archivo llms.txt](https://llmstxt.org) es un estándar del sector que ayuda a los LLM a indexar contenido de forma más eficiente, similar a cómo un sitemap ayuda a los motores de búsqueda. Las herramientas de IA pueden usar este archivo para comprender la estructura de tu documentación y encontrar contenido relevante para las consultas de los usuarios. + +Mintlify aloja automáticamente un archivo `llms.txt` en la raíz de tu proyecto que enumera todas las páginas disponibles de tu documentación. Este archivo siempre está actualizado y no requiere mantenimiento. De forma opcional, puedes añadir un archivo `llms.txt` personalizado en la raíz de tu proyecto. + +Consulta tu `llms.txt` añadiendo `/llms.txt` a la URL de tu sitio de documentación. + +Abrir el llms.txt de este sitio. + + + +
+ ## Estructura de llms.txt +
+ +Un archivo `llms.txt` es un archivo Markdown sin formato que contiene: + +- **Título del sitio** como encabezado H1. +- **Secciones de contenido estructuradas** con enlaces y una descripción de cada página de tu documentación. + +```mdx Example llms.txt +# Example product docs + +## Guides +- [Getting started](https://example.com/docs/start): Intro guide +- [Install](https://example.com/docs/install): Setup steps + +## Reference +- [API](https://example.com/docs/api): Endpoint list and usage +``` + +Este enfoque estructurado permite que los LLM procesen tu documentación de forma eficiente a alto nivel y localicen contenido relevante para las consultas de los usuarios, mejorando la precisión y la velocidad de las búsquedas de documentación asistidas por IA. + + + +
+ ## llms-full.txt +
+ +El archivo `llms-full.txt` combina todo tu sitio de documentación en un solo archivo como contexto para herramientas de IA y lo indexa el tráfico de los LLM. + +Mintlify aloja automáticamente un archivo `llms-full.txt` en la raíz de tu proyecto. Consulta tu `llms-full.txt` agregando `/llms-full.txt` a la URL de tu sitio de documentación. + +Abrir el llms-full.txt de este sitio. + + + +
+ ## Archivos personalizados +
+ +Para agregar un archivo personalizado `llms.txt` o `llms-full.txt`, crea un archivo `llms.txt` o `llms-full.txt` en la raíz de tu proyecto. Al agregar un archivo personalizado, se sobrescribirá el archivo generado automáticamente con el mismo nombre. Si eliminas el archivo personalizado, se volverá a usar el archivo predeterminado. + +Tu archivo personalizado `llms.txt` o `llms-full.txt` debe incluir el título del sitio como encabezado H1. El resto del contenido es opcional. Consulta [Format](https://llmstxt.org/#format) en la especificación de `llms.txt` para obtener más información sobre las secciones opcionales y las mejores prácticas. diff --git a/es/ai/markdown-export.mdx b/es/ai/markdown-export.mdx new file mode 100644 index 000000000..9017470c2 --- /dev/null +++ b/es/ai/markdown-export.mdx @@ -0,0 +1,29 @@ +--- +title: "Exportación a Markdown" +description: "Obtén rápidamente versiones en Markdown de las páginas" +icon: "file-text" +--- + +import { PreviewButton } from "/snippets/previewbutton.jsx" + +Markdown proporciona texto estructurado que las herramientas de IA pueden procesar con mayor eficiencia que HTML, lo que se traduce en respuestas más precisas, tiempos de procesamiento más rápidos y menor consumo de tokens. + +Mintlify genera automáticamente versiones en Markdown de las páginas, optimizadas para herramientas de IA e integraciones externas. + + + +
+ ## Extensión de URL .md +
+ +Añade `.md` a la URL de cualquier página para ver una versión en Markdown. + +Abrir esta página como Markdown + + + +
+ ## Atajo de teclado +
+ +Presiona Command + C (Ctrl + C en Windows) para copiar una página en formato Markdown al portapapeles. diff --git a/es/ai/model-context-protocol.mdx b/es/ai/model-context-protocol.mdx new file mode 100644 index 000000000..568288234 --- /dev/null +++ b/es/ai/model-context-protocol.mdx @@ -0,0 +1,398 @@ +--- +title: "Protocolo de Contexto de Modelo" +description: "Permite que los usuarios accedan a tu documentación y a tus API desde sus herramientas de IA favoritas" +icon: "audio-waveform" +keywords: ["mcp"] +--- + +import { PreviewButton } from "/snippets/previewbutton.jsx" + +
+ ## Acerca de los servidores MCP +
+ +El Protocolo de Contexto de Modelo (MCP) es un protocolo abierto que crea conexiones estandarizadas entre aplicaciones de IA y servicios externos, como la documentación. Mintlify genera un servidor MCP a partir de tu documentación y de las especificaciones OpenAPI, preparando tu contenido para el ecosistema de IA más amplio, donde cualquier cliente MCP (como Claude, Cursor, Goose y otros) puede conectarse a tu documentación y a tus API. + +Tu servidor MCP expone herramientas para que las aplicaciones de IA puedan buscar en tu documentación e interactuar con tus API. + +
+ ## Acceso a tu servidor MCP +
+ + + Los servidores MCP solo pueden generarse para documentación pública. No es posible acceder a documentación protegida por autenticación de usuario final para generar servidores. + + +Mintlify genera automáticamente un servidor MCP para tu documentación y lo aloja en la URL de tu sitio de documentación con la ruta `/mcp`. Por ejemplo, el servidor MCP de Mintlify está disponible en `https://mintlify.com/docs/mcp`. + +Puedes ver y copiar la URL de tu servidor MCP en tu [panel](https://dashboard.mintlify.com/products/mcp). + +La ruta `/mcp` está reservada para servidores MCP alojados y no puede usarse para otros elementos de navegación. + +
+ ## Configurar tu servidor MCP +
+ +Todos los servidores MCP incluyen la herramienta `search` de forma predeterminada, lo que permite a los usuarios consultar información de tu documentación desde otras herramientas. + +Si tienes un [plan Pro o Enterprise](https://mintlify.com/pricing?ref=mcp), puedes exponer endpoints de tu especificación OpenAPI como herramientas MCP. + +Para exponer endpoints como herramientas MCP, utiliza el objeto `mcp` dentro de la extensión `x-mint`, ya sea a nivel de archivo o de endpoint. Por ejemplo, el servidor MCP de Mintlify incluye herramientas para crear chats del Asistente, obtener actualizaciones de estado y activar actualizaciones. + +Los servidores MCP siguen un enfoque de seguridad primero en el que los endpoints de la API no se exponen de forma predeterminada. Debes habilitar explícitamente los endpoints para ponerlos a disposición como herramientas MCP. Expón únicamente endpoints que sean seguros para el acceso público a través de herramientas de IA. + + + La configuración de MCP para el endpoint. + + + + Indica si se debe exponer el endpoint como herramienta MCP. Tiene prioridad sobre la configuración a nivel de archivo. + + + + El nombre de la herramienta MCP. + + + + La descripción de la herramienta MCP. + + + + +
+ ### Configuración a nivel de archivo +
+ +Habilita MCP para todos los endpoints de forma predeterminada en un archivo de especificación de OpenAPI y excluye selectivamente algunos endpoints: + +```json +{ + "openapi": "3.1.0", + "x-mint": { + "mcp": { + "enabled": true + } + }, + // ... + "paths": { + "/api/v1/users": { + "get": { + "x-mint": { + "mcp": { + "enabled": false // Desactiva MCP en este endpoint + } + }, + // ... + } + } + } +} +``` + +
+ ### Configuración a nivel de endpoint +
+ +Habilita MCP para endpoints específicos: + +```json +{ + "paths": { + "/api/v1/users": { + "get": { + "x-mint": { + "mcp": { + "enabled": true, + "name": "get-users", + "description": "Obtener una lista de usuarios" + }, + // ... + } + } + }, + "/api/v1/delete": { + "delete": { + // No tiene `x-mint: mcp`, por lo que este endpoint no se expone como una herramienta de MCP + // ... + } + } + } +} +``` + +
+ ## Uso de tu servidor MCP +
+ +Tus usuarios deben conectar tu servidor MCP a sus herramientas de IA preferidas. + +1. Haz que la URL de tu servidor MCP sea de acceso público. +2. Los usuarios copian la URL de tu servidor MCP y la añaden a sus herramientas. +3. Los usuarios acceden a tu documentación y a los endpoints de tu API desde sus herramientas. + +Estas son algunas maneras en las que puedes ayudar a tus usuarios a conectarse a tu servidor MCP: + + + + Añade opciones en el [menú contextual](/es/ai/contextual-menu) para que tus usuarios se conecten a tu servidor MCP desde cualquier página de tu documentación. + + | Opción | Identificador | Descripción | + | :----- | :------------ | :---------- | + | **Copiar URL del servidor MCP** | `mcp` | Copia la URL de tu servidor MCP en el portapapeles del usuario. | + | **Conectar con Cursor** | `cursor` | Instala tu servidor MCP en Cursor. | + | **Conectar con VS Code** | `vscode` | Instala tu servidor MCP en VS Code. | + + + + + + Ve a tu [panel](https://dashboard.mintlify.com/products/mcp) y localiza la URL de tu servidor MCP. + + + + Crea una guía para tus usuarios que incluya la URL de tu servidor MCP y los pasos para conectarlo a Claude. + + 1. Ve a la página [Connectors](https://claude.ai/settings/connectors) en la configuración de Claude. + 2. Selecciona **Add custom connector**. + 3. Añade el nombre y la URL de tu servidor MCP. + 4. Selecciona **Add**. + 5. Al usar Claude, selecciona el botón de adjuntos (el ícono de “+”). + 6. Selecciona tu servidor MCP. + + + + Consulta la [documentación de Model Context Protocol](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server#connecting-to-a-remote-mcp-server) para más detalles. + + + + + + Ve a tu [panel](https://dashboard.mintlify.com/products/mcp) y localiza la URL de tu servidor MCP. + + + + Crea una guía para tus usuarios que incluya la URL de tu servidor MCP y el comando para conectarlo a Claude Code. + + ```bash + claude mcp add --transport http + ``` + + + + Consulta la [documentación de Claude Code](https://docs.anthropic.com/en/docs/claude-code/mcp#installing-mcp-servers) para más detalles. + + + + + + Ve a tu [panel](https://dashboard.mintlify.com/products/mcp) y localiza la URL de tu servidor MCP. + + + + Crea una guía para tus usuarios que incluya la URL de tu servidor MCP y los pasos para conectarlo a Cursor. + + 1. Usa Command + Shift + P (Ctrl + Shift + P en Windows) para abrir la paleta de comandos. + 2. Busca "Open MCP settings". + 3. Selecciona **Add custom MCP**. Esto abrirá el archivo `mcp.json`. + 4. En `mcp.json`, configura tu servidor: + + ```json + { + "mcpServers": { + "": { + "url": "" + } + } + } + ``` + + + + Consulta la [documentación de Cursor](https://docs.cursor.com/en/context/mcp#installing-mcp-servers) para más detalles. + + + + + + Ve a tu [panel](https://dashboard.mintlify.com/products/mcp) y localiza la URL de tu servidor MCP. + + + + Crea una guía para tus usuarios que incluya la URL de tu servidor MCP y los pasos para conectarlo a VS Code. + + 1. Crea un archivo `.vscode/mcp.json`. + 2. En `mcp.json`, configura tu servidor: + + ```json + { + "servers": { + "": { + "type": "http", + "url": "" + } + } + } + ``` + + + + Consulta la [documentación de VS Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) para más detalles. + + + +
+ ### Ejemplo: Conectarse al servidor MCP de Mintlify +
+ +Conéctate al servidor MCP de Mintlify para interactuar con la API de Mintlify y buscar en nuestra documentación. Esto te dará respuestas más precisas sobre cómo usar Mintlify en tu entorno local y muestra cómo puedes ayudar a tus usuarios a conectarse a tu servidor MCP. + + + + En la parte superior de esta página, abre el menú contextual y elige **Connect to Cursor** o **Connect to VS Code** para conectar el servidor MCP de Mintlify al IDE de tu preferencia. + + + + Para usar el servidor MCP de Mintlify con Claude: + + + + 1. Ve a la página de [Connectors](https://claude.ai/settings/connectors) en la configuración de Claude. + 2. Selecciona **Add custom connector**. + 3. Agrega el servidor MCP de Mintlify: + + * Name: `Mintlify` + * URL: `https://mintlify.com/docs/mcp` + + 4. Selecciona **Add**. + + + + 1. Al usar Claude, selecciona el botón de adjuntos (el ícono de más). + 2. Selecciona el servidor MCP de Mintlify. + 3. Hazle a Claude una pregunta sobre Mintlify. + + + + Consulta la [documentación de Model Context Protocol](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server#connecting-to-a-remote-mcp-server) para más detalles. + + + + Para usar el servidor MCP de Mintlify con Claude Code, ejecuta el siguiente comando: + + ```bash + claude mcp add --transport http Mintlify https://mintlify.com/docs/mcp + ``` + + Prueba la conexión ejecutando: + + ```bash + claude mcp list + ``` + + Consulta la [documentación de Claude Code](https://docs.anthropic.com/en/docs/claude-code/mcp#installing-mcp-servers) para más detalles. + + + + Install in Cursor + + Para conectar el servidor MCP de Mintlify a Cursor, haz clic en el botón **Install in Cursor**. O, para conectar el servidor MCP manualmente, sigue estos pasos: + + + + 1. Usa Command + Shift + P (Ctrl + Shift + P en Windows) para abrir la paleta de comandos. + 2. Busca "Open MCP settings". + 3. Selecciona **Add custom MCP**. Esto abrirá el archivo `mcp.json`. + + + + En `mcp.json`, agrega: + + ```json + { + "mcpServers": { + "Mintlify": { + "url": "https://mintlify.com/docs/mcp" + } + } + } + ``` + + + + En el chat de Cursor, pregunta "What tools do you have available?" Cursor debería mostrar el servidor MCP de Mintlify como una herramienta disponible. + + + + Consulta [Installing MCP servers](https://docs.cursor.com/en/context/mcp#installing-mcp-servers) en la documentación de Cursor para más detalles. + + + + Install in VS Code + + Para conectar el servidor MCP de Mintlify a VS Code, haz clic en el botón **Install in VS Code**. O, para conectarlo manualmente, crea un archivo `.vscode/mcp.json` y agrega: + + ```json + { + "servers": { + "Mintlify": { + "type": "http", + "url": "https://mintlify.com/docs/mcp" + } + } + } + ``` + + Consulta la [documentación de VS Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) para más detalles. + + + +
+ ## Autenticación +
+ +Cuando habilitas un endpoint de API para MCP, el servidor incluye los requisitos de autenticación definidos en los `securitySchemes` y `securityRequirement` de tu especificación OpenAPI. Cualquier clave la gestiona directamente la herramienta y no la almacena ni la procesa Mintlify. + +Si un usuario le pide a su herramienta de IA que invoque un endpoint protegido, la herramienta solicitará en ese momento al usuario las credenciales de autenticación necesarias. + +
+ ## Supervisión de tu servidor MCP +
+ +Puedes ver todas las herramientas de MCP disponibles en la sección **Available tools** de la [página MCP Server](https://dashboard.mintlify.com/products/mcp) de tu panel. + + + Panel de MCP con la sección Available tools resaltada + + + + +
+ ## Solución de problemas +
+ + + + Si tu servidor MCP solo expone la herramienta de búsqueda a pesar de tener una especificación de OpenAPI: + + 1. Verifica que tu especificación de OpenAPI sea válida y accesible. + 2. Asegúrate de haber habilitado explícitamente MCP para endpoints específicos usando `x-mint.mcp.enabled: true`. + 3. Revisa los registros de tu implementación para detectar errores en el procesamiento de OpenAPI. + + Si el procesamiento de OpenAPI falla, el servidor continúa solo con la herramienta de búsqueda para mantener la funcionalidad. + + + + Si los usuarios reportan problemas de autenticación: + + 1. Comprueba que tu especificación de OpenAPI incluya definiciones adecuadas de `securitySchemes`. + 2. Confirma que los endpoints habilitados funcionen con los métodos de autenticación especificados. + + + + Si las herramientas de IA no están usando tus endpoints de API de forma eficaz: + + 1. Agrega campos `summary` y `description` detallados a tus endpoints. + 2. Asegúrate de que los nombres y descripciones de parámetros sean autoexplicativos. + 3. Usa el panel de MCP para comprobar cómo se muestran tus endpoints como herramientas. + + \ No newline at end of file diff --git a/es/ai/slack-app.mdx b/es/ai/slack-app.mdx new file mode 100644 index 000000000..5ee3d4d27 --- /dev/null +++ b/es/ai/slack-app.mdx @@ -0,0 +1,31 @@ +--- +title: "Slack app" +description: "Agrega un bot que busca en tu documentación para responder preguntas en tu espacio de trabajo de Slack" +icon: "slack" +--- + + + La aplicación de Slack está disponible para los [planes Pro y Enterprise](https://mintlify.com/pricing?ref=slack-app). + + +La aplicación de Slack agrega un bot llamado `@mintlify` a tu espacio de trabajo de Slack que puede buscar en tu documentación y responder las preguntas de los usuarios. El bot responde a mensajes directos, menciones con @ y a cualquier pregunta en un canal llamado específicamente `#ask-ai`. + +La aplicación de Slack puede generar costos: ya sea usando tus créditos del Asistente de IA o incurriendo en cargos por excedente. + + + +
+ ## Configurar la aplicación de Slack +
+ + + Si el propietario del espacio de trabajo de Slack requiere aprobación de administración para instalar aplicaciones, pídele que apruebe la aplicación de Slack de Mintlify antes de añadirla. + + +1. Ve a la página de [Complementos](https://dashboard.mintlify.com/products/addons) de tu panel. +2. Selecciona **Conectar** en la tarjeta de Integración de Slack. +3. Sigue las indicaciones de Slack para añadir la aplicación a tu espacio de trabajo. +4. Verifica que el bot funciona y responde cuando: + - Envías un mensaje directo a la aplicación de Mintlify. + - Mencionas al bot con `@mintlify` en un canal. + - Creas un canal `#ask-ai`, añades el bot y haces una pregunta. diff --git a/es/analytics/feedback.mdx b/es/analytics/feedback.mdx new file mode 100644 index 000000000..6073f87f4 --- /dev/null +++ b/es/analytics/feedback.mdx @@ -0,0 +1,89 @@ +--- +title: "Comentarios" +description: "Supervisa la satisfacción de los usuarios con tu documentación" +--- + + + Para recopilar y ver comentarios, primero debes habilitar la función de comentarios en la página de [Complementos](https://dashboard.mintlify.com/products/addons) de tu panel. + + +La pestaña de comentarios muestra los votos cuantitativos de “pulgar arriba” y “pulgar abajo” que han recibido tus docs, así como cualquier comentario cualitativo que hayan proporcionado los usuarios. Usa esta información para evaluar la calidad de tus docs y realizar mejoras. + +Accede a la pestaña de comentarios desde la página de **Analytics** en tu [panel](https://dashboard.mintlify.com/products/analytics). + +
+ ## Tipos de comentarios +
+ + + Los comentarios contextuales y sobre fragmentos de código están en beta. Para habilitarlos en tu sitio de documentación, [contacta a nuestro equipo de ventas](mailto:gtm@mintlify.com). + + +La pestaña de comentarios muestra información según los complementos de comentarios que habilites. + +Habilita tus tipos de comentarios preferidos: + + + +Captura de pantalla de los toggles de comentarios en la página Add-ons. + +Captura de pantalla de los toggles de comentarios en la página Add-ons. + + + +* **Solo valoración con pulgares**: Votación simple de pulgar arriba/abajo para medir la satisfacción general con las páginas. +* **Solo comentarios sobre fragmentos de código**: Comentarios específicamente sobre los fragmentos de código. +* **Valoración con pulgares y comentarios contextuales**: Votación de la página más comentarios detallados y motivos de las valoraciones. +* **Valoración con pulgares y comentarios sobre fragmentos de código**: Votación de la página más comentarios sobre los ejemplos de código. +* **Valoración con pulgares, comentarios contextuales y comentarios sobre fragmentos de código**: Sistema de comentarios completo con votación de la página, comentarios detallados y comentarios sobre fragmentos de código. + +
+ ## Gestión de comentarios +
+ +Para los comentarios contextuales y sobre fragmentos de código, puedes establecer el estado de cada comentario y añadir notas internas para hacer seguimiento de tu trabajo al resolver el feedback de los usuarios. + +
+ ### Cambiar el estado del feedback +
+ +Selecciona el estado junto a un feedback para marcarlo como **Pendiente**, **En progreso**, **Resuelto** o **Descartado**. + +Mejores prácticas para establecer estados de feedback: + +* **Pendiente**: El feedback está en espera de revisión. +* **En progreso**: El feedback ha sido validado y se está trabajando en él. +* **Resuelto**: El feedback ha sido resuelto. +* **Descartado**: El feedback se ha descartado por no ser accionable, por irrelevante o por inexacto. + +
+ ### Filtrar por estado +
+ +Usa el filtro de estado para controlar qué comentarios se muestran. Desmarca un estado para ocultar todos los comentarios con ese estado. De forma predeterminada, se muestran todos los comentarios. + +
+ ### Agregar notas internas +
+ +Haz clic en un comentario para añadir una nota interna. Estas notas solo son visibles para quienes tengan acceso a tu panel. + +Usa las notas para añadir información para colaborar, vincular tickets relevantes de soporte o de ingeniería, o recordar cualquier otra información útil. + +
+ ## Uso de los datos de comentarios +
+ +Revisa tus datos de comentarios para: + +* **Identificar contenido eficaz**: Las páginas con más comentarios positivos muestran qué funciona bien en tu documentación. + * **Priorizar mejoras**: Las páginas con más comentarios negativos indican qué contenido podría requerir atención. + * **Tomar medidas**: Realiza actualizaciones en la documentación basadas en comentarios directos de los usuarios. \ No newline at end of file diff --git a/es/analytics/improving-docs.mdx b/es/analytics/improving-docs.mdx new file mode 100644 index 000000000..3d65155b6 --- /dev/null +++ b/es/analytics/improving-docs.mdx @@ -0,0 +1,40 @@ +--- +title: "Mejora tu documentación" +description: "Usa datos de analítica para mejorar tu documentación" +--- + +Mejora tu documentación con datos cuantitativos y cualitativos de tu panel de analítica. + +
+ ## Información de analítica cruzada +
+ +Combina datos de varias fuentes de analítica para obtener una visión integral de tu documentación. + +
+ ### Correlaciona tráfico y satisfacción +
+ +- **Alto tráfico y bajas calificaciones**: Páginas populares con una mala experiencia de usuario. Prioriza mejorar estas páginas. +- **Bajo tráfico y altas calificaciones**: Documentación que funciona bien, pero quizá no sea fácil de descubrir. Considera promocionar estas páginas. +- **Alto tráfico y altas calificaciones**: Los éxitos de tu documentación. Revisa estas páginas para obtener ideas que mejoren el resto de tu contenido. + +
+ ### Alinea la intención de búsqueda con el rendimiento del contenido +
+ +- **Alto volumen de búsqueda y pocas vistas de página**: Problemas de descubrimiento. Considera mover estas páginas o revisar su frontmatter. +- **Términos de búsqueda populares y resultados con baja confianza**: Oportunidad por brecha de contenido. Considera agregar más contenido o crear contenido nuevo sobre estos temas. +- **Búsquedas principales y comentarios negativos en las páginas correspondientes**: Problemas de experiencia de usuario. Revisa las páginas para ver si resuelven la necesidad del usuario que motiva la búsqueda. + +
+ ## Convierte los insights en acción +
+ +Utiliza estos patrones de analítica cruzada para priorizar las mejoras de tu documentación: + +- **Resuelve primero los problemas de alto impacto**: Las páginas populares con bajas valoraciones afectan a más usuarios. +- **Cubre las brechas de contenido verificadas**: Las búsquedas de alto volumen y baja confianza indican necesidades de usuario no satisfechas. +- **Responde al feedback de los usuarios**: El feedback contextual y sobre fragmentos de código puede señalar áreas específicas de mejora. +- **Alinea la búsqueda con el contenido**: Asegúrate de que tus temas más buscados tengan páginas completas y bien organizadas. +- **Supervisa las tendencias de búsqueda en ascenso sin páginas populares existentes**: Oportunidades para nuevo contenido. \ No newline at end of file diff --git a/es/analytics/overview.mdx b/es/analytics/overview.mdx new file mode 100644 index 000000000..82cd537b2 --- /dev/null +++ b/es/analytics/overview.mdx @@ -0,0 +1,29 @@ +--- +title: "Descripción general" +description: "Consulta el tráfico y las estadísticas de alto nivel sobre tu documentación" +--- + +La pestaña de descripción general muestra cuántas personas han visitado tu documentación, cuáles son las páginas más populares y de dónde provienen los usuarios. Usa esta información para identificar qué páginas aportan más valor a tus usuarios y seguir las tendencias a lo largo del tiempo. + +Accede a las métricas de la descripción general desde la página de **Analytics** en tu [panel](https://dashboard.mintlify.com/products/analytics). + +
+ ## Métricas +
+ +Usa el selector de rango para ajustar el período de tiempo de los datos mostrados. Selecciona visitantes, vistas o acciones para mostrar un gráfico de líneas con las tendencias durante el período seleccionado. + +- **Visitantes**: Visitantes únicos +- **Vistas**: Total de vistas de página +- **Acciones**: Conteo combinado de llamadas a la API, clics en enlaces de la barra de navegación y clics en botones de CTA +- **Páginas populares**: Rutas a las páginas más visitadas y sus conteos de vistas +- **Referencias**: Principales fuentes de tráfico que dirigen usuarios a tu documentación + +
+ ## Uso de los datos de la vista general +
+ +Revisa tus métricas de la vista general para: + +- **Identificar páginas populares**: Usa las páginas populares para comprender qué contenido es más importante para tus usuarios y asegurarte de que esté actualizado y sea completo. +- **Hacer seguimiento a las tendencias de tráfico**: Supervisa los cambios en el tráfico para entender el impacto de las actualizaciones o del contenido nuevo. \ No newline at end of file diff --git a/es/analytics/search.mdx b/es/analytics/search.mdx new file mode 100644 index 000000000..5a63efaa0 --- /dev/null +++ b/es/analytics/search.mdx @@ -0,0 +1,28 @@ +--- +title: "Búsqueda" +description: "Entiende cómo los usuarios buscan en tu documentación" +--- + +Utiliza los datos de la pestaña de Búsqueda para entender qué buscan los usuarios e identificar temas que deban actualizarse o ampliarse. + +Accede a tus métricas de búsqueda desde la página de **Analytics** en tu [panel](https://dashboard.mintlify.com/products/analytics). + +
+ ## Métricas de búsqueda +
+ +Utiliza el selector de rango para ajustar el período de tiempo de los datos mostrados. + +- **Consultas totales**: Volumen de búsqueda +- **Búsquedas principales**: Términos más buscados +- **Búsquedas con baja confianza**: Consultas que pueden no haber arrojado resultados relevantes + +
+ ## Uso de los datos de búsqueda +
+ +Revisa tus analíticas de búsqueda para: + +- **Identificar temas populares**: Usa las búsquedas principales para entender qué contenido buscan las personas. +- **Detectar vacíos de contenido**: Las búsquedas con baja confianza pueden indicar documentación faltante o temas que requieren mejor cobertura. +- **Mejorar la descubribilidad**: Asegúrate de que las páginas que coincidan con los términos de búsqueda populares sean fáciles de encontrar y estén bien organizadas. \ No newline at end of file diff --git a/es/api-playground/asyncapi/playground.mdx b/es/api-playground/asyncapi/playground.mdx new file mode 100644 index 000000000..f287bb9e5 --- /dev/null +++ b/es/api-playground/asyncapi/playground.mdx @@ -0,0 +1,5 @@ +--- +title: "Área de pruebas" +description: "Permite que los usuarios interactúen con tus websockets" +asyncapi: "/asyncapi.yaml channelOne" +--- diff --git a/es/api-playground/asyncapi/setup.mdx b/es/api-playground/asyncapi/setup.mdx new file mode 100644 index 000000000..6eab4379a --- /dev/null +++ b/es/api-playground/asyncapi/setup.mdx @@ -0,0 +1,95 @@ +--- +title: "Configuración de AsyncAPI" +description: "Crea páginas de referencia de WebSocket con AsyncAPI" +--- + + + +
+ ## Añadir un archivo de especificación de AsyncAPI +
+ +Para empezar a crear páginas para tus websockets, asegúrate de contar con un documento de esquema de AsyncAPI válido en formato JSON o YAML que cumpla con la [especificación de AsyncAPI](https://www.asyncapi.com/docs/reference/specification/v3.0.0). Tu esquema debe ajustarse a la especificación de AsyncAPI 3.0+. + + + Para comprobar que tu esquema de AsyncAPI sea válido, puedes pegarlo en + [AsyncAPI Studio](https://studio.asyncapi.com/) + + + + +
+ ## Autogenerar páginas de websockets +
+ +Puedes agregar un campo `asyncapi` a cualquier pestaña o grupo en la navegación de tu `docs.json`. Este campo puede contener la ruta a un documento de esquema de AsyncAPI en tu repositorio de documentación, la URL de un documento de esquema de AsyncAPI alojado o un arreglo de enlaces a documentos de esquema de AsyncAPI. Mintlify generará automáticamente una página para cada canal de websocket de AsyncAPI. + +**Ejemplos con pestañas:** + + + +```json Local File {5} +"navigation": { + "tabs": [ + { + "tab": "API Reference", + "asyncapi": "/path/to/asyncapi.json" + } + ] +} + +``` + +```json Remote URL {5} +"navigation": { + "tabs": [ + { + "tab": "API Reference", + "asyncapi": "https://github.com/asyncapi/spec/blob/master/examples/simple-asyncapi.yml" + } + ] +} +``` + + + +**Ejemplos con grupos:** + +```json {8-11} +"navigation": { + "tabs": [ + { + "tab": "AsyncAPI", + "groups": [ + { + "group": "Websockets", + "asyncapi": { + "source": "/path/to/asyncapi.json", + "directory": "api-reference" + } + } + ] + } + ] +} +``` + + + El campo directory es opcional. Si no se especifica, los archivos se colocarán en + la carpeta **api-reference** del repositorio de documentación. + + + + +
+ ## Página de canal +
+ +Si quieres tener más control sobre el orden de tus canales o simplemente hacer referencia a un canal específico, puedes crear un archivo MDX con el campo `asyncapi` en el frontmatter. + +```mdx +--- +title: "Canal WebSocket" +asyncapi: "/path/to/asyncapi.json channelName" +--- +``` diff --git a/es/api-playground/customization/adding-sdk-examples.mdx b/es/api-playground/customization/adding-sdk-examples.mdx new file mode 100644 index 000000000..c82b97333 --- /dev/null +++ b/es/api-playground/customization/adding-sdk-examples.mdx @@ -0,0 +1,49 @@ +--- +title: "Agregar ejemplos de SDK" +description: "Muestra fragmentos de código por lenguaje junto a tus endpoints de API para mostrar a los desarrolladores cómo usar tus SDK" +--- + +Si tus usuarios interactúan con tu API mediante un SDK en lugar de hacerlo directamente a través de una solicitud de red, puedes usar la extensión `x-codeSamples` para agregar fragmentos de código a tu documento de OpenAPI y mostrarlos en tus páginas de OpenAPI. + +Esta propiedad se puede agregar a cualquier método de solicitud y tiene el siguiente esquema. + + + El lenguaje del fragmento de código. + + + + La etiqueta del ejemplo. Es útil cuando se proporcionan varios ejemplos para un único endpoint. + + + + El código fuente del ejemplo. + + +Aquí tienes un ejemplo de fragmentos de código para una app de seguimiento de plantas, que cuenta tanto con una herramienta de línea de comandos en Bash como con un SDK de JavaScript. + +```yaml +paths: + /plants: + get: + # ... + x-codeSamples: + - lang: bash + label: List all unwatered plants + source: | + planter list -u + - lang: javascript + label: List all unwatered plants + source: | + const planter = require('planter'); + planter.list({ unwatered: true }); + - lang: bash + label: List all potted plants + source: | + planter list -p + - lang: javascript + label: List all potted plants + source: | + const planter = require('planter'); + planter.list({ potted: true }); +``` + diff --git a/es/api-playground/customization/complex-data-types.mdx b/es/api-playground/customization/complex-data-types.mdx new file mode 100644 index 000000000..03a9e5e23 --- /dev/null +++ b/es/api-playground/customization/complex-data-types.mdx @@ -0,0 +1,103 @@ +--- +title: "Tipos de datos complejos" +description: "Describe APIs con esquemas flexibles, propiedades opcionales y múltiples formatos de datos usando las palabras clave `oneOf`, `anyOf` y `allOf`" +--- + +Cuando tu API admite múltiples formatos de datos, tiene campos condicionales o utiliza patrones de herencia, las palabras clave de composición de esquemas de OpenAPI te ayudan a documentar estas estructuras flexibles. Con `oneOf`, `anyOf` y `allOf`, puedes describir APIs que manejan distintos tipos de entrada o combinan múltiples esquemas en modelos de datos completos. + + + +
+ ## Palabras clave `oneOf`, `anyOf`, `allOf` +
+ +Para tipos de datos complejos, OpenAPI proporciona palabras clave para combinar esquemas: + +- `allOf`: Combina varios esquemas (como fusionar objetos o extender un esquema base). Funciona como un operador lógico `and`. +- `anyOf`: Acepta datos que coincidan con cualquiera de los esquemas proporcionados. Funciona como un operador lógico `or`. +- `oneOf`: Acepta datos que coincidan exactamente con uno de los esquemas proporcionados. Funciona como un operador lógico `xor` (o exclusivo). + +Mintlify trata `oneOf` y `anyOf` de forma idéntica, ya que la diferencia práctica rara vez afecta el uso de la API. + +Para especificaciones detalladas de estas palabras clave, consulta la [documentación de OpenAPI](https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/). + +La palabra clave `not` no es compatible por el momento. + +
+ ### Combinación de esquemas con `allOf` +
+ +Cuando usas `allOf`, Mintlify realiza un preprocesamiento en tu documento de OpenAPI para mostrar combinaciones complejas de forma legible. Por ejemplo, cuando combinas dos esquemas de objeto con `allOf`, Mintlify fusiona las propiedades de ambos en un único objeto. Esto resulta especialmente útil al aprovechar los [componentes](https://swagger.io/docs/specification/components/) reutilizables de OpenAPI. + +```yaml +org_with_users: + allOf: + - $ref: '#/components/schemas/Org' + - type: object + properties: + users: + type: array + description: An array containing all users in the organization +# ... +components: + schemas: + Org: + type: object + properties: + id: + type: string + description: The ID of the organization +``` + + + + + El ID de la organización + + + Un arreglo que contiene a todos los usuarios de la organización + + + + +
+ ### Proporcionar opciones con `oneOf` y `anyOf` +
+ +Cuando usas `oneOf` o `anyOf`, las opciones se muestran en un contenedor con pestañas. Especifica un campo `title` en cada subesquema para dar nombre a tus opciones. Por ejemplo, así podrías mostrar dos tipos diferentes de direcciones de entrega: + +```yaml +delivery_address: + oneOf: + - title: StreetAddress + type: object + properties: + address_line_1: + type: string + description: The street address of the recipient + # ... + - title: POBox + type: object + properties: + box_number: + type: string + description: The number of the PO Box + # ... +``` + + +
+ + + + La dirección de la calle de la residencia + + + + + El número del apartado postal + + + +
+
diff --git a/es/api-playground/customization/managing-page-visibility.mdx b/es/api-playground/customization/managing-page-visibility.mdx new file mode 100644 index 000000000..f631e8383 --- /dev/null +++ b/es/api-playground/customization/managing-page-visibility.mdx @@ -0,0 +1,96 @@ +--- +title: "Gestionar la visibilidad de páginas" +description: "Controla qué endpoints de tu especificación OpenAPI aparecen en la navegación de tu documentación" +--- + +Puedes controlar qué operaciones de OpenAPI se publican como páginas de documentación y su visibilidad en la navegación. Esto es útil para endpoints internos, operaciones obsoletas, funciones beta o endpoints que deberían ser accesibles mediante URL directa pero no visibles en la navegación del sitio. + +Si tus páginas se generan automáticamente a partir de un documento de OpenAPI, puedes gestionar la visibilidad de las páginas con las extensiones `x-hidden` y `x-excluded`. + + + +
+ ## `x-hidden` +
+ +La extensión `x-hidden` crea una página para un endpoint, pero la oculta de la navegación. La página solo es accesible si se accede directamente a su URL. + +Los casos de uso comunes de `x-hidden` son: + +- Endpoints que quieres documentar, pero no destacar. +- Páginas a las que enlazarás desde otros contenidos. +- Endpoints para usuarios específicos. + + + +
+ ## `x-excluded` +
+ +La extensión `x-excluded` excluye por completo un endpoint de tu documentación. + +Los casos de uso habituales de `x-excluded` incluyen: + +- Endpoints internos. +- Endpoints obsoletos que no quieres documentar. +- Funcionalidades beta que aún no están listas para la documentación pública. + + + +
+ ## Implementación +
+ +Agrega la extensión `x-hidden` o `x-excluded` debajo del método HTTP en tu especificación de OpenAPI. + +A continuación se muestran ejemplos de cómo usar cada propiedad en un documento de esquema de OpenAPI para un endpoint y una ruta de webhook. + +```json {11, 19} +"paths": { + "/plants": { + "get": { + "description": "Devuelve todas las plantas de la tienda", + "parameters": { /*...*/ }, + "responses": { /*...*/ } + } + }, + "/hidden_plants": { + "get": { + "x-hidden": true, + "description": "Devuelve todas las plantas algo secretas de la tienda", + "parameters": { /*...*/ }, + "responses": { /*...*/ } + } + }, + "/secret_plants": { + "get": { + "x-excluded": true, + "description": "Devuelve todas las plantas altamente secretas de la tienda (¡no publiques este endpoint!)", + "parameters": { /*...*/ }, + "responses": { /*...*/ } + } + } +}, +``` + +```json {9, 15} +"webhooks": { + "/plants_hook": { + "post": { + "description": "Webhook con información sobre una nueva planta añadida a la tienda", + } + }, + "/hidden_plants_hook": { + "post": { + "x-hidden": true, + "description": "Webhook con información algo secreta sobre una nueva planta añadida a la tienda" + } + }, + "/secret_plants_hook": { + "post": { + "x-excluded": true, + "description": "Webhook con información altamente secreta sobre una nueva planta añadida a la tienda (¡no publiques este endpoint!)" + } + } +} +``` diff --git a/es/api-playground/customization/multiple-responses.mdx b/es/api-playground/customization/multiple-responses.mdx new file mode 100644 index 000000000..e0df2f62d --- /dev/null +++ b/es/api-playground/customization/multiple-responses.mdx @@ -0,0 +1,31 @@ +--- +title: "Respuestas múltiples" +description: "Mostrar variaciones de respuesta para el mismo endpoint" +--- + +Si tu API devuelve diferentes respuestas según los parámetros de entrada, el contexto del usuario u otras condiciones de la solicitud, puedes documentar varios ejemplos de respuesta con la propiedad `examples`. + +Esta propiedad se puede agregar a cualquier respuesta y tiene el siguiente esquema. + +```yaml +responses: + "200": + description: Respuesta correcta + content: + application/json: + schema: + $ref: "#/components/schemas/YourResponseSchema" + examples: + us: + summary: Respuesta para Estados Unidos + value: + countryCode: "US" + currencyCode: "USD" + taxRate: 0.0825 + gb: + summary: Respuesta para Reino Unido + value: + countryCode: "GB" + currencyCode: "GBP" + taxRate: 0.20 +``` diff --git a/es/api-playground/mdx/authentication.mdx b/es/api-playground/mdx/authentication.mdx new file mode 100644 index 000000000..ae2c85b00 --- /dev/null +++ b/es/api-playground/mdx/authentication.mdx @@ -0,0 +1,105 @@ +--- +title: "Autenticación" +description: "Puedes configurar parámetros de autenticación para permitir que los usuarios usen sus claves de API reales." +--- + + + +
+ ## Habilitar la autenticación +
+ +Puedes agregar un método de autenticación a tu `docs.json` para habilitarlo globalmente en todas las páginas, o configurarlo por página. + +El método de autenticación definido en una página anulará el método global si ambos están configurados. + +
+ ### Token Bearer +
+ + + +```json docs.json +"api": { + "mdx": { + "auth": { + "method": "bearer" + } + } +} +``` + +```mdx Page Metadata +--- +title: "Your page title" +authMethod: "bearer" +--- +``` + + + +
+ ### Autenticación básica +
+ + + +```json docs.json +"api": { + "mdx": { + "auth": { + "method": "basic" + } + } +} +``` + +```mdx Page Metadata +--- +title: "Your page title" +authMethod: "basic" +--- +``` + + + +
+ ### Clave de API +
+ + + +```json docs.json +"api": { + "mdx": { + "auth": { + "method": "key", + "name": "x-api-key" + } + } +} +``` + +```mdx Page Metadata +--- +title: "Your page title" +authMethod: "key" +--- +``` + + + +
+ ### Ninguno +
+ +El método de autenticación "none" es útil para desactivar la autenticación en un endpoint específico después de establecer un valor predeterminado en docs.json. + + +```mdx Page Metadata +--- +title: "Your page title" +authMethod: "none" +--- +``` + diff --git a/es/api-playground/mdx/configuration.mdx b/es/api-playground/mdx/configuration.mdx new file mode 100644 index 000000000..375caef75 --- /dev/null +++ b/es/api-playground/mdx/configuration.mdx @@ -0,0 +1,170 @@ +--- +title: "Configuración de MDX" +description: "Genera páginas de documentación para tus endpoints de API usando `MDX`" +--- + +Puedes definir manualmente endpoints de API en archivos `MDX` individuales en lugar de usar una especificación de OpenAPI. Este método brinda flexibilidad para contenido personalizado, pero recomendamos generar la documentación de la API a partir de un archivo de especificación de OpenAPI para la mayoría de los proyectos porque es más fácil de mantener y ofrece más funciones. Sin embargo, crear páginas `MDX` para una API puede ser útil para documentar APIs pequeñas o para crear prototipos. + +Para generar páginas para endpoints de API usando `MDX`, configura los ajustes de tu API en `docs.json`, crea archivos `MDX` individuales para cada endpoint y usa componentes como `` para definir parámetros. A partir de estas definiciones, Mintlify genera áreas de pruebas de API interactivas, ejemplos de solicitudes y ejemplos de respuestas. + + + + En tu archivo `docs.json`, define tu URL base y el método de autenticación: + + ```json + "api": { + "mdx": { + "server": "https://mintlify.com/api", // string array for multiple base URLs + "auth": { + "method": "key", + "name": "x-api-key" // options: bearer, basic, key. + } + } + } + ``` + + Si quieres ocultar el área de pruebas de la API, usa el campo `display`. No necesitas incluir un método de autenticación si ocultas el área de pruebas. + + ```json + "api": { + "playground": { + "display": "none" + } + } + ``` + + Encuentra la lista completa de configuraciones de API en [Settings](/es/settings#api-configurations). + + + + Cada página de endpoint de API debe tener un archivo `MDX` correspondiente. En la parte superior de cada archivo, define `title` y `api`: + + ```mdx + --- + title: 'Create new user' + api: 'POST https://api.mintlify.com/user' + --- + ``` + + Puedes especificar parámetros de ruta agregando el nombre del parámetro a la ruta, entre `{}`: + + ```bash + https://api.example.com/v1/endpoint/{userId} + ``` + + + Si tienes un campo `server` configurado en `docs.json`, puedes usar rutas relativas como `/v1/endpoint`. + + + Puedes anular el modo de visualización definido globalmente para el área de pruebas de la API en una página agregando `playground` al frontmatter: + + ```mdx + --- + title: 'Create new user' + api: 'POST https://api.mintlify.com/user' + playground: 'none' + --- + ``` + + * `playground: 'interactive'` - Muestra el área de pruebas interactiva. + * `playground: 'simple'` - Muestra un endpoint copiable sin área de pruebas. + * `playground: 'none'` - Oculta el área de pruebas. + + + + Agrega tus páginas de endpoints a la barra lateral añadiendo las rutas al campo `navigation` en tu `docs.json`. Obtén más información sobre cómo estructurar tu documentación en [Navigation](/es/navigation). + + + +
+ ## Habilitar la autenticación +
+ +Puedes añadir un método de autenticación en tu `docs.json` para habilitarlo globalmente en todas las páginas o configurarlo por página. + +El método de autenticación definido en una página anulará el método global si ambos están establecidos. + +
+ ### Token Bearer +
+ + + ```json docs.json + "api": { + "mdx": { + "auth": { + "method": "bearer" + } + } + } + ``` + + ```mdx Page Metadata + --- + title: "Your page title" + authMethod: "bearer" + --- + ``` + + +
+ ### Autenticación básica +
+ + + ```json docs.json + "api": { + "mdx": { + "auth": { + "method": "basic" + } + } + } + ``` + + ```mdx Page Metadata + --- + title: "Your page title" + authMethod: "basic" + --- + ``` + + +
+ ### Clave de API +
+ + + ```json docs.json + "api": { + "mdx": { + "auth": { + "method": "key", + "name": "x-api-key" + } + } + } + ``` + + ```mdx Page Metadata + --- + title: "Your page title" + authMethod: "key" + --- + ``` + + +
+ ### Ninguno +
+ +El método de autenticación `none` es útil para desactivar la autenticación en un endpoint específico después de establecer un valor predeterminado en `docs.json`. + + + ```mdx Page Metadata + --- + title: "Your page title" + authMethod: "none" + --- + ``` + diff --git a/es/api-playground/migrating-from-mdx.mdx b/es/api-playground/migrating-from-mdx.mdx new file mode 100644 index 000000000..21cb4cf2e --- /dev/null +++ b/es/api-playground/migrating-from-mdx.mdx @@ -0,0 +1,163 @@ +--- +title: "Migrar páginas de API en MDX a navegación con OpenAPI" +sidebarTitle: "Migrar desde MDX" +description: "Actualiza de páginas de endpoints individuales en MDX a generación automática con OpenAPI y navegación flexible" +icon: "arrow-big-right-dash" +--- + +Si actualmente usas páginas individuales en `MDX` para tus endpoints de API, puedes migrar a generar las páginas automáticamente desde tu especificación de OpenAPI, conservando la personalización de las páginas individuales. Esto puede ayudarte a reducir la cantidad de archivos que debes mantener y a mejorar la coherencia de tu documentación de API. + +Puedes definir metadatos y contenido para cada endpoint en tu especificación de OpenAPI y ubicar los endpoints donde desees en la navegación. + +
+ ## Migración con la CLI +
+ +El comando `mint migrate-mdx` es la forma recomendada de migrar de páginas de endpoints en MDX a páginas autogeneradas. + +Este comando: + +* Analiza la estructura de navegación de tu `docs.json`. +* Identifica las páginas MDX que generan páginas de endpoints de OpenAPI. +* Extrae el contenido de los archivos MDX y lo mueve a la extensión `x-mint` en tu especificación de OpenAPI. +* Actualiza tu `docs.json` para hacer referencia directamente a los endpoints de OpenAPI en lugar de a los archivos MDX. +* Elimina los archivos MDX originales de endpoints. + + + Si ya tienes `x-mint` definido para un endpoint y también tienes una página MDX con contenido para ese endpoint, el contenido de MDX sobrescribirá la configuración existente de `x-mint`. + + Si tienes varias páginas MDX para el mismo endpoint con contenido diferente, el script usará el contenido de la página que aparezca al final en tu `docs.json`. + + La herramienta de migración no admite la vista previa de los cambios antes de aplicarlos. + + + + + Asegúrate de que tu especificación de OpenAPI sea válida e incluya todos los endpoints que quieres documentar. + + Cualquier página MDX que quieras migrar debe tener el frontmatter `openapi:` con referencia a un endpoint. + + + Valida tu archivo de OpenAPI usando el [Swagger Editor](https://editor.swagger.io/) o la [CLI de Mint](https://www.npmjs.com/package/mint). + + + + + Si es necesario, instala o actualiza la [CLI de Mint](/es/installation). + + + + ```bash + mint migrate-mdx + ``` + + + +
+ ## Pasos de migración manual +
+ + + + Asegúrate de que tu especificación de OpenAPI sea válida e incluya todos los endpoints que deseas documentar. + + Para cualquier endpoint cuyo metadato o contenido quieras personalizar, agrega la extensión `x-mint` al endpoint. Consulta [extensión x-mint](/es/api-playground/openapi-setup#x-mint-extension) para más detalles. + + Para cualquier endpoint que quieras excluir de tu documentación, agrega la extensión `x-hidden` al endpoint. + + + Valida tu archivo de OpenAPI con el [Swagger Editor](https://editor.swagger.io/) o la [CLI de Mint](https://www.npmjs.com/package/mint). + + + + + Reemplaza las referencias a páginas `MDX` por endpoints de OpenAPI en tu `docs.json`. + + ```json + "navigation": { + "groups": [ + { + "group": "API Reference", + "openapi": "/path/to/openapi.json", + "pages": [ + "overview", + "authentication", + "introduction", + "GET /health", + "quickstart", + "POST /users", + "GET /users/{id}", + "advanced-features" + ] + } + ] + } + ``` + + + + Después de verificar que tu nueva navegación funciona correctamente, elimina los archivos de endpoint `MDX` que ya no necesitas. + + + + + +Puedes personalizar cómo se muestra la documentación de tu API en la navegación. + +
+ ### Navegación de contenido mixto +
+ +Combina páginas de API generadas automáticamente con otras páginas: + +```json +"navigation": { + "groups": [ + { + "group": "API Reference", + "openapi": "openapi.json", + "pages": [ + "api/overview", + "GET /users", + "POST /users", + "api/authentication" + ] + } + ] +} +``` + +
+ ### Varias versiones de la API +
+ +Organiza diferentes versiones de la API usando pestañas o grupos: + +```json +"navigation": { + "tabs": [ + { + "tab": "API v1", + "openapi": "specs/v1.json" + }, + { + "tab": "API v2", + "openapi": "specs/v2.json" + } + ] +} +``` + +
+ ## Cuándo usar páginas `MDX` individuales +
+ +Considera mantener páginas `MDX` individuales cuando necesites: + +* Contenido personalizado amplio por endpoint, como componentes de React o ejemplos extensos. +* Diseños de página exclusivos. +* Enfoques de documentación experimentales para endpoints específicos. + +Para la mayoría de los casos de uso, la navegación de OpenAPI ofrece mejor mantenibilidad y consistencia. diff --git a/es/api-playground/openapi-setup.mdx b/es/api-playground/openapi-setup.mdx new file mode 100644 index 000000000..441413387 --- /dev/null +++ b/es/api-playground/openapi-setup.mdx @@ -0,0 +1,576 @@ +--- +title: "Configuración de OpenAPI" +description: "Referencia endpoints de OpenAPI en tus páginas de documentación" +icon: "file-json" +--- + +OpenAPI es una especificación para describir APIs. Mintlify es compatible con documentos de OpenAPI 3.0+ para generar documentación de API interactiva y mantenerla actualizada. + +
+ ## Agrega un archivo de especificación OpenAPI +
+ +Para documentar tus endpoints con OpenAPI, necesitas un documento OpenAPI válido en formato JSON o YAML que cumpla con la [especificación OpenAPI 3.0+](https://swagger.io/specification/). + +Puedes crear páginas de API a partir de uno o varios documentos OpenAPI. + +
+ ### Descripción de tu API +
+ +Recomendamos los siguientes recursos para aprender y crear tus documentos OpenAPI. + +* [Guía de OpenAPI de Swagger](https://swagger.io/docs/specification/v3_0/basic-structure/) para aprender la sintaxis de OpenAPI. +* [Fuentes Markdown de la especificación OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/) para consultar los detalles de la especificación OpenAPI más reciente. +* [Swagger Editor](https://editor.swagger.io/) para editar, validar y depurar tu documento OpenAPI. +* [La CLI de Mint](https://www.npmjs.com/package/mint) para validar tu documento OpenAPI con el comando: `mint openapi-check `. + + + La Guía de OpenAPI de Swagger corresponde a OpenAPI v3.0, pero casi toda la información + es aplicable a v3.1. Para obtener más información sobre las diferencias entre v3.0 + y v3.1, consulta [Migrating from OpenAPI 3.0 to + 3.1.0](https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0) + en el blog de OpenAPI. + + +
+ ### Especificar la URL de tu API +
+ +Para habilitar funciones de Mintlify como el Área de pruebas de API, agrega un campo `servers` a tu documento OpenAPI con la URL base de tu API. + +```json +{ + "servers": [ + { + "url": "https://api.example.com/v1" + } + ] +} +``` + +En un documento OpenAPI, los diferentes endpoints de la API se especifican por sus rutas, como `/users/{id}` o simplemente `/`. La URL base define dónde se deben anexar estas rutas. Para obtener más información sobre cómo configurar el campo `servers`, consulta [API Server and Base Path](https://swagger.io/docs/specification/api-host-and-base-path/) en la documentación de OpenAPI. + +El Área de pruebas de API usa estas URL de servidor para determinar adónde enviar las solicitudes. Si especificas varios servidores, un menú desplegable permitirá a los usuarios alternar entre ellos. Si no especificas un servidor, el Área de pruebas de API usará el modo simple, ya que no puede enviar solicitudes sin una URL base. + +Si tu API tiene endpoints que existen en diferentes URL, puedes [sobrescribir el campo de servidores](https://swagger.io/docs/specification/v3_0/api-host-and-base-path/#overriding-servers) para una ruta u operación específica. + +
+ ### Especificar la autenticación +
+ +Para habilitar la autenticación en tu documentación y en el área de pruebas de la API, configura los campos `securitySchemes` y `security` en tu documento OpenAPI. Las descripciones de la API y el Área de pruebas de API agregarán campos de autenticación basados en las configuraciones de seguridad de tu documento OpenAPI. + + + + Agrega un campo `securitySchemes` para definir cómo se autentican los usuarios. + + Este ejemplo muestra una configuración para autenticación tipo bearer. + + ```json + { + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer" + } + } + } + } + ``` + + + + Agrega un campo `security` para requerir autenticación. + + ```json + { + "security": [ + { + "bearerAuth": [] + } + ] + } + ``` + + + +Los tipos comunes de autenticación incluyen: + +* [API Keys](https://swagger.io/docs/specification/authentication/api-keys/): Para claves en encabezado, query o cookie. +* [Bearer](https://swagger.io/docs/specification/authentication/bearer-authentication/): Para tokens JWT u OAuth. +* [Basic](https://swagger.io/docs/specification/authentication/basic-authentication/): Para usuario y contraseña. + +Si distintos endpoints de tu API requieren diferentes métodos de autenticación, puedes [sobrescribir el campo de seguridad](https://swagger.io/docs/specification/authentication/#:~:text=you%20can%20apply%20them%20to%20the%20whole%20API%20or%20individual%20operations%20by%20adding%20the%20security%20section%20on%20the%20root%20level%20or%20operation%20level%2C%20respectively.) para una operación específica. + +Para obtener más información sobre cómo definir y aplicar la autenticación, consulta [Authentication](https://swagger.io/docs/specification/authentication/) en la documentación de OpenAPI. + +
+ ## `x-mint` extension +
+ +La extensión `x-mint` es una extensión personalizada de OpenAPI que ofrece control adicional sobre cómo se genera y se muestra la documentación de tu API. + +
+ ### Metadata +
+ +Sobrescribe los metadatos predeterminados de las páginas de API generadas añadiendo `x-mint: metadata` a cualquier operación. Puedes usar cualquier campo de metadatos válido en el frontmatter de `MDX`, excepto `openapi`: + +```json {7-13} +{ + "paths": { + "/users": { + "get": { + "summary": "Get users", + "description": "Retrieve a list of users", + "x-mint": { + "metadata": { + "title": "List all users", + "description": "Fetch paginated user data with filtering options", + "og:title": "Display a list of users" + } + }, + "parameters": [ + { + // Parameter configuration + } + ] + } + } + } +} +``` + +
+ ### Content +
+ +Añade contenido antes de la documentación de API autogenerada usando `x-mint: content`: + +```json {6-8} +{ + "paths": { + "/users": { + "post": { + "summary": "Create user", + "x-mint": { + "content": "## Requisitos previos\n\nEste endpoint requiere privilegios de administrador y tiene limitación de tasa.\n\nLos correos electrónicos de usuario deben ser únicos en todo el sistema." + }, + "parameters": [ + { + // Parameter configuration + } + ] + } + } + } +} +``` + +La extensión `content` es compatible con todos los componentes y el formato MDX de Mintlify. + +
+ ### Href +
+ +Cambia la URL de la página del endpoint en tu documentación usando `x-mint: href`: + +```json {6-8, 14-16} +{ + "paths": { + "/legacy-endpoint": { + "get": { + "summary": "Legacy endpoint", + "x-mint": { + "href": "/deprecated-endpoints/legacy-endpoint" + } + } + }, + "/documented-elsewhere": { + "post": { + "summary": "Special endpoint", + "x-mint": { + "href": "/guides/special-endpoint-guide" + } + } + } + } +} +``` + +Cuando `x-mint: href` está presente, la entrada de navegación enlaza directamente a la URL especificada en lugar de generar una página de API. + +
+ ### MCP +
+ +Expón selectivamente endpoints como herramientas del Model Context Protocol (MCP) usando `x-mint: mcp`. Habilita solo los endpoints que sean seguros para el acceso público mediante herramientas de IA. + + + La configuración de MCP para el endpoint. + + + + Indica si se expone el endpoint como una herramienta MCP. Tiene prioridad sobre la configuración a nivel de archivo. + + + + El nombre de la herramienta MCP. + + + + La descripción de la herramienta MCP. + + + + + + ```json Selective enablement {6-9} wrap + { + "paths": { + "/users": { + "post": { + "summary": "Create user", + "x-mint": { + "mcp": { + "enabled": true + }, + // ... + } + } + }, + "/users": { + "delete": { + "summary": "Delete user (admin only)", + // No `x-mint: mcp` so this endpoint is not exposed as an MCP tool + // ... + } + } + } + } + ``` + + ```json Global enablement {3-5, 9-13} wrap + { + "openapi": "3.1.0", + "x-mcp": { + "enabled": true // All endpoints are exposed as MCP tools by default + }, + "paths": { + "/api/admin/delete": { + "delete": { + "x-mint": { + "mcp": { + "enabled": false // Disable MCP for this endpoint + } + }, + "summary": "Delete resources" + } + } + } + } + ``` + + +Para obtener más información, consulta [Model Context Protocol](/es/ai/model-context-protocol). + +
+ ## Autogenerar páginas de API +
+ +Agrega un campo `openapi` a cualquier elemento de navegación en tu `docs.json` para generar automáticamente páginas para endpoints de OpenAPI. Puedes controlar dónde aparecen estas páginas en tu estructura de navegación, ya sea como secciones de API dedicadas o junto con otras páginas. + +El campo `openapi` acepta una ruta de archivo en tu repositorio de documentación o una URL a un documento de OpenAPI alojado. + +Las páginas de endpoints generadas tienen estos metadatos predeterminados: + +* `title`: El campo `summary` de la operación, si está presente. Si no hay `summary`, el título se genera a partir del método HTTP y el endpoint. +* `description`: El campo `description` de la operación, si está presente. +* `version`: El valor `version` del ancla o pestaña superior, si está presente. +* `deprecated`: El campo `deprecated` de la operación. Si es `true`, aparecerá una etiqueta de “obsoleta” junto al título del endpoint en la navegación lateral y en la página del endpoint. + + + Para excluir endpoints específicos de tus páginas de API autogeneradas, agrega la propiedad + [x-hidden](/es/api-playground/customization/managing-page-visibility#x-hidden) + a la operación en tu especificación de OpenAPI. + + +Hay dos enfoques para agregar páginas de endpoints a tu documentación: + +1. **Secciones de API dedicadas**: Hace referencia a especificaciones de OpenAPI en elementos de navegación para secciones de API dedicadas. +2. **Endpoints selectivos**: Hace referencia a endpoints específicos en tu navegación junto con otras páginas. + +
+ ### Secciones de API dedicadas +
+ +Genera secciones de API dedicadas agregando un campo `openapi` a un elemento de navegación y sin otras páginas. Se incluirán todos los endpoints de la especificación: + +```json {5} +"navigation": { + "tabs": [ + { + "tab": "API Reference", + "openapi": "https://petstore3.swagger.io/api/v3/openapi.json" + } + ] +} +``` + +Puedes usar varias especificaciones de OpenAPI en diferentes secciones de navegación: + +```json {8-11, 15-18} +"navigation": { + "tabs": [ + { + "tab": "API Reference", + "groups": [ + { + "group": "Users", + "openapi": { + "source": "/path/to/openapi-1.json", + "directory": "api-reference" + } + }, + { + "group": "Admin", + "openapi": { + "source": "/path/to/openapi-2.json", + "directory": "api-reference" + } + } + ] + } + ] +} +``` + + + El campo `directory` es opcional y especifica dónde se almacenan las páginas de API generadas + en tu repositorio de documentación. Si no se especifica, el valor predeterminado es el directorio + `api-reference` de tu repositorio. + + +
+ ### Endpoints selectivos +
+ +Cuando quieras más control sobre dónde aparecen los endpoints en tu documentación, puedes hacer referencia a endpoints específicos en tu navegación. Este enfoque te permite generar páginas de endpoints de API junto con otros contenidos. + +
+ #### Establecer una especificación de OpenAPI predeterminada +
+ +Configura una especificación de OpenAPI predeterminada para un elemento de navegación. Luego, hace referencia a endpoints específicos en el campo `pages`: + +```json {12, 15-16} +"navigation": { + "tabs": [ + { + "tab": "Getting started", + "pages": [ + "quickstart", + "installation" + ] + }, + { + "tab": "API reference", + "openapi": "/path/to/openapi.json", + "pages": [ + "api-overview", + "GET /users", + "POST /users", + "guides/authentication" + ] + } + ] +} +``` + +Cualquier entrada de página que coincida con el formato `METHOD /path` generará una página de API para ese endpoint usando la especificación de OpenAPI predeterminada. + +
+ #### Herencia de la especificación de OpenAPI +
+ +Las especificaciones de OpenAPI se heredan a lo largo de la jerarquía de navegación. Los elementos de navegación secundarios heredan la especificación de OpenAPI de su elemento padre, a menos que definan la suya propia: + +```json {3, 7-8, 11, 13-14} +{ + "group": "API reference", + "openapi": "/path/to/openapi-v1.json", + "pages": [ + "overview", + "authentication", + "GET /users", + "POST /users", + { + "group": "Orders", + "openapi": "/path/to/openapi-v2.json", + "pages": [ + "GET /orders", + "POST /orders" + ] + } + ] +} +``` + +
+ #### Endpoints individuales +
+ +Hace referencia a endpoints específicos sin establecer una especificación de OpenAPI predeterminada, incluyendo la ruta del archivo: + +```json {5-6} +"navigation": { + "pages": [ + "introduction", + "user-guides", + "/path/to/openapi-v1.json POST /users", + "/path/to/openapi-v2.json GET /orders" + ] +} +``` + +Este enfoque es útil cuando necesitas endpoints individuales de diferentes especificaciones o solo quieres incluir endpoints seleccionados. + +
+ ## Crear archivos `MDX` para páginas de API +
+ +Para tener control sobre páginas de endpoints individuales, crea páginas `MDX` para cada operación. Esto te permite personalizar los metadatos de la página, agregar contenido, omitir ciertas operaciones o reordenar páginas en la navegación a nivel de página. + +Consulta un [ejemplo de página MDX de OpenAPI de MindsDB](https://github.com/mindsdb/mindsdb/blob/main/docs/rest/databases/create-databases.mdx?plain=1) y cómo aparece en su [documentación publicada](https://docs.mindsdb.com/rest/databases/create-databases). + +
+ ### Especificar archivos manualmente +
+ +Crea una página `MDX` para cada endpoint y especifica qué operación de OpenAPI mostrar usando el campo `openapi` en el frontmatter. + +Cuando haces referencia a una operación de OpenAPI de esta forma, el nombre, la descripción, los parámetros, las respuestas y el Área de pruebas de API se generan automáticamente a partir de tu documento de OpenAPI. + +Si tienes varios archivos de OpenAPI, incluye la ruta del archivo en tu referencia para asegurarte de que Mintlify encuentre el documento de OpenAPI correcto. Si solo tienes un archivo de OpenAPI, Mintlify lo detectará automáticamente. + + + Este enfoque funciona independientemente de si has configurado una especificación de OpenAPI predeterminada + en tu navegación. Puedes hacer referencia a cualquier endpoint de cualquier especificación de OpenAPI + incluyendo la ruta del archivo en el frontmatter. + + +Si quieres hacer referencia a un archivo externo de OpenAPI, agrega la URL del archivo a tu `docs.json`. + + + ```mdx Example + --- + title: "Get users" + description: "Returns all plants from the system that the user has access to" + openapi: "/path/to/openapi-1.json GET /users" + deprecated: true + version: "1.0" + --- + ``` + + ```mdx Format + --- + title: "title of the page" + description: "description of the page" + openapi: openapi-file-path method path + deprecated: boolean (not required) + version: "version-string" (not required) + --- + ``` + + + + El método y la ruta deben coincidir exactamente con la definición en tu especificación de OpenAPI. + Si el endpoint no existe en el archivo de OpenAPI, la página estará vacía. + + +
+ ### Generar archivos `MDX` automáticamente +
+ +Usa nuestro [scraper](https://www.npmjs.com/package/@mintlify/scraping) de Mintlify para generar automáticamente páginas `MDX` para documentos de OpenAPI grandes. + + + Tu documento de OpenAPI debe ser válido o no se generarán los archivos. + + +El scraper genera: + +* Una página `MDX` por cada operación en el campo `paths` de tu documento de OpenAPI. +* Si tu documento de OpenAPI es versión 3.1+, una página `MDX` por cada operación en el campo `webhooks` de tu documento de OpenAPI. +* Un arreglo de entradas de navegación que puedes agregar a tu `docs.json`. + + + + ```bash + npx @mintlify/scraping@latest openapi-file + ``` + + + + ```bash + npx @mintlify/scraping@latest openapi-file -o api-reference + ``` + + Agrega la opción `-o` para especificar una carpeta donde colocar los archivos. Si no se especifica una carpeta, los archivos se crearán en el directorio de trabajo. + + + +
+ ### Crear archivos `MDX` para esquemas de OpenAPI +
+ +Puedes crear páginas individuales para cualquier esquema de OpenAPI definido en el campo `components.schema` de un documento de OpenAPI: + + + ```mdx Example + --- + openapi-schema: OrderItem + --- + ``` + + ```mdx Format + --- + openapi-schema: "schema-key" + --- + ``` + + +
+ ## Webhooks +
+ +Los webhooks son devoluciones de llamada HTTP que tu API envía para notificar a sistemas externos cuando se producen eventos. Los webhooks son compatibles en documentos de OpenAPI 3.1+. + +
+ ### Define webhooks en tu especificación de OpenAPI +
+ +Añade un campo `webhooks` a tu documento de OpenAPI junto al campo `paths`. + +Para obtener más información sobre cómo definir webhooks, consulta [Webhooks](https://spec.openapis.org/oas/v3.1.0#oasWebhooks) en la documentación de OpenAPI. + +
+ ### Referencia webhooks en archivos MDX +
+ +Al crear páginas MDX para webhooks, usa `webhook` en lugar de métodos HTTP como `GET` o `POST`: + +```mdx +--- +title: "Example webhook" +description: "Triggered when an event occurs" +openapi: "path/to/openapi-file webhook example-webhook-name" +--- +``` + + + El nombre del webhook debe coincidir exactamente con la clave definida en el campo `webhooks` de tu + especificación de OpenAPI. + diff --git a/es/api-playground/overview.mdx b/es/api-playground/overview.mdx new file mode 100644 index 000000000..2e6477cff --- /dev/null +++ b/es/api-playground/overview.mdx @@ -0,0 +1,161 @@ +--- +title: "Área de pruebas" +description: "Permite a los usuarios interactuar con tu API" +icon: "play" +--- + +
+ ## Descripción general +
+ +El área de pruebas de API es un entorno interactivo que permite a los usuarios probar y explorar tus endpoints de API. Los desarrolladores pueden crear solicitudes de API, enviarlas y ver las respuestas sin salir de tu documentación. + + + Área de pruebas de API para el endpoint que activa una actualización. + + Área de pruebas de API para el endpoint que activa una actualización. + + +El área de pruebas se genera automáticamente a partir de tu especificación de OpenAPI o del esquema de AsyncAPI, por lo que cualquier actualización de tu API se refleja automáticamente en ella. También puedes crear manualmente páginas de referencia de API después de definir una URL base y un método de autenticación en tu `docs.json`. + +Recomendamos generar tu área de pruebas de API a partir de una especificación de OpenAPI. Consulta [OpenAPI Setup](/es/api-playground/openapi-setup) para obtener más información sobre cómo crear tu documento de OpenAPI. + +
+ ## Primeros pasos +
+ + + + + Asegúrate de que tu archivo de especificación de OpenAPI sea válido usando el [Swagger Editor](https://editor.swagger.io/) o la [CLI de Mint](https://www.npmjs.com/package/mint). + + + ```bash {2} + /your-project + |- docs.json + |- openapi.json + ``` + + + + Actualiza tu `docs.json` para hacer referencia a tu especificación de OpenAPI. Agrega una propiedad `openapi` a cualquier elemento de navegación para completar automáticamente tu documentación con páginas para cada endpoint especificado en tu documento de OpenAPI. + + Este ejemplo genera una página para cada endpoint especificado en `openapi.json` y las organiza en el grupo "API reference" de tu navegación. + + ```json + "navigation": { + "groups": [ + { + "group": "API reference", + "openapi": "openapi.json" + } + ] + } + ``` + + Para generar páginas solo para endpoints específicos, enumera los endpoints en la propiedad `pages` del elemento de navegación. + + Este ejemplo genera páginas solo para los endpoints `GET /users` y `POST /users`. Para generar otras páginas de endpoints, agrega más endpoints al arreglo `pages`. + + ```json + "navigation": { + "groups": [ + { + "group": "API reference", + "openapi": "openapi.json", + "pages": [ + "GET /users", + "POST /users" + ] + } + ] + } + ``` + + + +
+ ## Personalizar tu área de pruebas +
+ +Puedes personalizar tu área de pruebas de API definiendo las siguientes propiedades en tu `docs.json`. + + + Configuraciones del área de pruebas de API. + + + + El modo de visualización del área de pruebas de API. + + * `"interactive"`: Muestra el área de pruebas interactiva. + * `"simple"`: Muestra un endpoint copiable sin área de pruebas. + * `"none"`: No muestra nada. + + De forma predeterminada es `interactive`. + + + + Indica si las solicitudes de API deben pasar por un servidor proxy. De forma predeterminada es `true`. + + + + + + Configuraciones para los ejemplos de API autogenerados. + + + + Lenguajes de ejemplo para los Fragmentos de API autogenerados. + + Los lenguajes se muestran en el orden especificado. + + + + Indica si se deben mostrar los parámetros opcionales en los ejemplos de API. De forma predeterminada es `all`. + + + + +
+ ### Configuración de ejemplo +
+ +```json +{ + "api": { + "playground": { + "display": "interactive" + }, + "examples": { + "languages": ["curl", "python", "javascript"], + "defaults": "required" + } + } +} +``` + +Este ejemplo configura el área de pruebas de API para que sea interactiva, con Fragmentos de código de ejemplo para cURL, Python y JavaScript. Solo se muestran los parámetros obligatorios en los Fragmentos de código. + +
+ ### Páginas de endpoints personalizadas +
+ +Cuando necesites más control sobre tu documentación de API, usa la extensión `x-mint` en tu especificación de OpenAPI o crea páginas `MDX` individuales para tus endpoints. + +Ambas opciones te permiten: + +* Personalizar los metadatos de la página +* Agregar contenido adicional como ejemplos +* Controlar el comportamiento del área de pruebas por página + +Se recomienda la extensión `x-mint` para que toda tu documentación de API se genere automáticamente a partir de tu especificación de OpenAPI y se mantenga en un solo archivo. + +Se recomiendan las páginas `MDX` individuales para API pequeñas o cuando quieras experimentar con cambios por página. + +Para obtener más información, consulta [x-mint extension](/es/api-playground/openapi-setup#x-mint-extension) y [MDX Setup](/es/api-playground/mdx/configuration). + +
+ ## Lecturas recomendadas +
+ +* [Configuración de AsyncAPI](/es/api-playground/asyncapi/setup) para obtener más información sobre cómo crear tu esquema de AsyncAPI y generar páginas de referencia de WebSocket. diff --git a/es/api-playground/troubleshooting.mdx b/es/api-playground/troubleshooting.mdx new file mode 100644 index 000000000..2a03d3433 --- /dev/null +++ b/es/api-playground/troubleshooting.mdx @@ -0,0 +1,106 @@ +--- +title: "Solución de problemas" +description: "Problemas comunes en las referencias de API" +icon: "message-square-warning" +--- + +Si tus páginas de API no se muestran correctamente, revisa estos problemas de configuración comunes: + + + + En este escenario, es probable que Mintlify no pueda encontrar tu documento de OpenAPI o que tu documento de OpenAPI no sea válido. + + Ejecutar `mint dev` localmente debería revelar algunos de estos problemas. + + Para verificar que tu documento de OpenAPI pasará la validación: + + 1. Visita [este validador](https://editor.swagger.io/) + 2. Cambia a la pestaña "Validate text" + 3. Pega tu documento de OpenAPI + 4. Haz clic en "Validate it!" + + Si el cuadro de texto que aparece abajo tiene un borde verde, tu documento ha pasado la validación. + Este es exactamente el mismo paquete de validación que usa Mintlify para validar documentos de OpenAPI, así que si tu documento + pasa la validación aquí, hay muchas probabilidades de que el problema esté en otro lugar. + + Además, Mintlify no es compatible con OpenAPI 2.0. Si tu documento usa esta versión de la especificación, + podrías encontrarte con este problema. Puedes convertir tu documento en [editor.swagger.io](https://editor.swagger.io/) (en Edit > Convert to OpenAPI 3): + + + ![](/images/convert-oas-3.png) + + + + + Esto suele deberse a un error ortográfico en el campo `openapi` de los metadatos de la página. Asegúrate de que el método HTTP y la ruta coincidan exactamente con el método HTTP y la ruta del documento de OpenAPI. + + Aquí tienes un ejemplo de cómo podría salir mal: + + ```mdx get-user.mdx + --- + openapi: "GET /users/{id}/" + --- + ``` + + ```yaml openapi.yaml + paths: + "/users/{id}": + get: ... + ``` + + Observa que la ruta en el campo `openapi` tiene una barra al final, mientras que la ruta en el documento de OpenAPI no. + + Otro problema común es un nombre de archivo mal escrito. Si especificas un documento de OpenAPI en particular en el campo `openapi`, asegúrate de que el nombre del archivo sea correcto. Por ejemplo, si tienes dos documentos de OpenAPI, `openapi/v1.json` y `openapi/v2.json`, tus metadatos podrían verse así: + + ```mdx referencia-api/v1/usuarios/obtener-usuario.mdx + --- + openapi: "v1 GET /users/{id}" + --- + ``` + + + + Si tienes un dominio personalizado configurado, esto podría deberse a tu proxy inverso. De forma predeterminada, las solicitudes realizadas desde el Área de pruebas de API comienzan con una solicitud `POST` a la ruta `/_mintlify/api/request` en el sitio de documentación. Si tu proxy inverso está configurado para permitir únicamente solicitudes `GET`, todas estas solicitudes fallarán. Para solucionarlo, configura tu proxy inverso para permitir solicitudes `POST` a la ruta `/_mintlify/api/request`. + + Como alternativa, si tu proxy inverso impide aceptar solicitudes `POST`, puedes configurar Mintlify para enviar solicitudes directamente a tu backend con el ajuste `api.playground.proxy` en el `docs.json`, como se describe en la [documentación de configuración](/es/settings#param-proxy). Al usar esta configuración, deberás configurar CORS en tu servidor, ya que las solicitudes vendrán directamente desde los navegadores de los usuarios en lugar de pasar por tu proxy. + + + + Si usas una configuración de navegación de OpenAPI pero las páginas no se generan, revisa estos problemas comunes: + + 1. **Falta la especificación predeterminada de OpenAPI**: Asegúrate de tener un campo `openapi` definido para el elemento de navegación: + + ```json {5} + "navigation": { + "groups": [ + { + "group": "Referencia de la API", + "openapi": "/path/to/openapi.json", + "pages": [ + "GET /users", + "POST /users" + ] + } + ] + } + ``` + + 2. **Herencia de la especificación OpenAPI**: Si usas navegación anidada, asegúrate de que los grupos secundarios hereden la especificación de OpenAPI correcta o definan la suya propia. + + 3. **Problemas de validación**: Usa `mint openapi-check ` para verificar que tu documento de OpenAPI sea válido. + + + + 1. **Operaciones ocultas**: Las operaciones marcadas con `x-hidden: true` en tu especificación de OpenAPI no aparecerán en la navegación generada automáticamente. + 2. **Operaciones no válidas**: Las operaciones con errores de validación en la especificación de OpenAPI pueden omitirse. Revisa tu documento de OpenAPI para detectar errores de sintaxis. + 3. **Inclusión manual vs. automática**: Si haces referencia a endpoints de una especificación de OpenAPI, solo las operaciones referenciadas explícitamente aparecerán en la navegación. No se agregarán otras páginas automáticamente. Esto incluye operaciones referenciadas en elementos de navegación secundarios. + + + + Al combinar operaciones de OpenAPI con páginas de documentación en la navegación: + + 1. **Conflictos de archivos**: No puedes tener a la vez un archivo `MDX` y una entrada de navegación para la misma operación. Por ejemplo, si tienes `get-users.mdx`, no incluyas también `"GET /users"` en la navegación. Si necesitas un archivo que comparta nombre con una operación, usa la extensión `x-mint` en el endpoint para que el href apunte a otra ubicación. + 2. **Resolución de rutas**: Las entradas de navegación que no coincidan con operaciones de OpenAPI se tratarán como rutas de archivo. Asegúrate de que tus archivos `MDX` existan en las ubicaciones esperadas. + 3. **Sensibilidad a mayúsculas y minúsculas**: La coincidencia de operaciones de OpenAPI distingue mayúsculas y minúsculas. Asegúrate de que los métodos HTTP estén en mayúsculas en las entradas de navegación. + + \ No newline at end of file diff --git a/es/api-reference/assistant/create-assistant-message.mdx b/es/api-reference/assistant/create-assistant-message.mdx new file mode 100644 index 000000000..517bc582f --- /dev/null +++ b/es/api-reference/assistant/create-assistant-message.mdx @@ -0,0 +1,25 @@ +--- +openapi: POST /assistant/{domain}/message +--- + + + +
+ ## Límites de uso +
+ +La API del Asistente tiene los siguientes límites: + +- 10.000 usos por clave al mes +- 10.000 solicitudes por organización de Mintlify por hora +- 10.000 solicitudes por IP al día + + + +
+ ## Uso recomendado +
+ +Para obtener mejores resultados, usa el [hook useChat de ai-sdk](https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat#usechat) para enviar solicitudes y gestionar respuestas. + +Puedes configurar `fp`, `threadId` y `filter` en el campo `body` del parámetro de opciones que se pasa al hook. \ No newline at end of file diff --git a/es/api-reference/assistant/create-topic.mdx b/es/api-reference/assistant/create-topic.mdx new file mode 100644 index 000000000..dc00663e3 --- /dev/null +++ b/es/api-reference/assistant/create-topic.mdx @@ -0,0 +1,3 @@ +--- +openapi: POST /chat/topic +--- diff --git a/es/api-reference/assistant/generate-message.mdx b/es/api-reference/assistant/generate-message.mdx new file mode 100644 index 000000000..b1cdbbb37 --- /dev/null +++ b/es/api-reference/assistant/generate-message.mdx @@ -0,0 +1,3 @@ +--- +openapi: POST /chat/message +--- diff --git a/es/api-reference/assistant/search.mdx b/es/api-reference/assistant/search.mdx new file mode 100644 index 000000000..aad5f0e85 --- /dev/null +++ b/es/api-reference/assistant/search.mdx @@ -0,0 +1,3 @@ +--- +openapi: "POST /search/{domain}" +--- diff --git a/es/api-reference/introduction.mdx b/es/api-reference/introduction.mdx new file mode 100644 index 000000000..5de4e747b --- /dev/null +++ b/es/api-reference/introduction.mdx @@ -0,0 +1,46 @@ +--- +title: "Introducción" +description: "Lanza actualizaciones, integra el Asistente de IA y más" +icon: "book-open" +--- + +La API REST de Mintlify te permite interactuar de forma programática con tu documentación, lanzar actualizaciones e integrar experiencias de chat con IA. + +
+ ## Endpoints +
+ +* [Trigger update](/es/api-reference/update/trigger): Activa una actualización de tu sitio cuando lo necesites. +* [Get update status](/es/api-reference/update/status): Obtén el estado de una actualización y otros detalles de tu documentación. +* [Generate assistant message](/es/api-reference/assistant/create-assistant-message): Inserta el Asistente, entrenado con tu documentación, en cualquier aplicación que elijas. +* [Search documentation](/es/api-reference/assistant/search): Busca en tu documentación. + +
+ ## Autenticación +
+ +Puedes generar una clave de API desde el [panel](https://dashboard.mintlify.com/settings/organization/api-keys). Las claves de API están asociadas a toda la organización y pueden usarse en múltiples implementaciones. + +
+ ### Clave de API de administrador +
+ +La clave de API de administrador se utiliza en los endpoints [Trigger update](/es/api-reference/update/trigger) y [Get update status](/es/api-reference/update/status). + +Las claves de API de administrador comienzan con el prefijo `mint_`. Mantén en secreto tus claves de API de administrador. + +
+ ### Clave de API del Asistente +
+ +La clave de API del Asistente se utiliza en los endpoints [Generate assistant message](/es/api-reference/assistant/create-assistant-message) y [Search documentation](/es/api-reference/assistant/search). + +Las claves de API del Asistente comienzan con el prefijo `mint_dsc_`. + +La **clave** de la API del Asistente es un token del lado del servidor que debe mantenerse en secreto. + +El **token** de la API del Asistente es público y puede referenciarse en tu código frontend. + + + Las llamadas que usan el token de la API del Asistente pueden generar costos: ya sea consumiendo tus créditos del Asistente de IA o incurriendo en sobrecargos. + diff --git a/es/api-reference/update/status.mdx b/es/api-reference/update/status.mdx new file mode 100644 index 000000000..9e2e93b66 --- /dev/null +++ b/es/api-reference/update/status.mdx @@ -0,0 +1,3 @@ +--- +openapi: "GET /project/update-status/{statusId}" +--- diff --git a/es/api-reference/update/trigger.mdx b/es/api-reference/update/trigger.mdx new file mode 100644 index 000000000..26b0968f3 --- /dev/null +++ b/es/api-reference/update/trigger.mdx @@ -0,0 +1,3 @@ +--- +openapi: "POST /project/update/{projectId}" +--- diff --git a/es/assistant-context.mdx b/es/assistant-context.mdx new file mode 100644 index 000000000..855cbde39 --- /dev/null +++ b/es/assistant-context.mdx @@ -0,0 +1,9 @@ +--- +title: "Contexto del Asistente" +description: "Esta página contiene contexto para ayudar al asistente a responder consultas" +--- + +Para el asistente, consulta esta información cuando respondas a consultas. + +- Si alguien pregunta por el registro de cambios, las actualizaciones recientes o las novedades, remítelos al registro de cambios de Mintlify en https://mintlify.com/docs/changelog +- Si alguien pregunta por las traducciones, proporciona la información que consideres relevante para su pregunta según tu búsqueda y el contexto, y diles que las traducciones automáticas están disponibles como un complemento. Pueden contactar al equipo de ventas (gtm@mintlify.com) para obtener traducciones automáticas. diff --git a/es/authentication-personalization/authentication-setup.mdx b/es/authentication-personalization/authentication-setup.mdx new file mode 100644 index 000000000..4b511bfea --- /dev/null +++ b/es/authentication-personalization/authentication-setup.mdx @@ -0,0 +1,322 @@ +--- +title: "Configuración de la autenticación" +description: "Controla la privacidad de tu documentación autenticando a los usuarios" +icon: "file-lock" +keywords: ['auth'] +--- + + + Los [planes Pro](https://mintlify.com/pricing?ref=authentication) incluyen autenticación con contraseña. + + Los [planes Enterprise](https://mintlify.com/pricing?ref=authentication) incluyen todos los métodos de autenticación. + + +La autenticación requiere que los usuarios inicien sesión antes de acceder a tu documentación. + +
+ ## Modos de autenticación +
+ +Elige entre autenticación completa o parcial según tus necesidades de control de acceso. + +**Autenticación completa**: Todas las páginas están protegidas. Los usuarios deben iniciar sesión antes de acceder a cualquier contenido. + +**Autenticación parcial**: Algunas páginas son públicas mientras que otras requieren autenticación. Los usuarios pueden explorar libremente el contenido público y autenticarse solo al acceder a páginas protegidas. + +Al configurar cualquiera de los métodos de handshake a continuación, selecciona **Autenticación completa** o **Autenticación parcial** en la configuración del panel. + +
+ ## Configuración de la autenticación +
+ +Selecciona el método de autenticación que quieres configurar. + + + + + La autenticación mediante contraseña solo ofrece control de acceso y **no** admite la personalización de contenido. + + + ### Requisitos previos + + * Sus requisitos de seguridad permiten compartir contraseñas entre usuarios. + + ### Implementación + + + + 1. En su panel, vaya a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Seleccione **Full Authentication** o **Partial Authentication**. + 3. Seleccione **Password**. + 4. Ingrese una contraseña segura. + 5. Seleccione **Save changes**. + + + + Comparta de forma segura la contraseña y la URL de la documentación con los usuarios autorizados. + + + + ## Ejemplo + + Tu documentación está alojada en `docs.foo.com` y necesitas un control de acceso básico sin tener que rastrear a usuarios individuales. Quieres impedir el acceso público y mantener una configuración sencilla. + + **Crea una contraseña robusta** en tu panel. **Comparte las credenciales** con los usuarios autorizados. ¡Listo! + + + + ### Requisitos previos + + * Los usuarios de tu documentación también son quienes la editan. + + ### Implementación + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Full Authentication** o **Partial Authentication**. + 3. Selecciona **Mintlify Auth**. + 4. Selecciona **Enable Mintlify Auth**. + + + + 1. En tu panel, ve a [Members](https://dashboard.mintlify.com/settings/organization/members). + 2. Agrega a cada persona que deba tener acceso a tu documentación. + 3. Asigna los roles correspondientes según sus permisos de edición. + + + + ### Ejemplo + + Tu documentación está alojada en `docs.foo.com` y tu equipo usa el panel para editarla. Quieres restringir el acceso solo a los miembros del equipo. + + **Habilita la autenticación de Mintlify** en la configuración del panel. + + **Verifica el acceso del equipo** comprobando que todos los miembros estén agregados a tu organización. + + + + ### Requisitos previos + + * Un servidor OAuth u OIDC que admita el Authorization Code Flow. + * Capacidad para crear un endpoint de API accesible mediante tokens de acceso de OAuth (opcional, para habilitar funciones de personalización). + + ### Implementación + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Full Authentication** o **Partial Authentication**. + 3. Selecciona **OAuth** y configura estos campos: + + * **Authorization URL**: Tu endpoint de OAuth. + * **Client ID**: Tu identificador de cliente de OAuth 2.0. + * **Client Secret**: Tu secreto de cliente de OAuth 2.0. + * **Scopes**: Permisos a solicitar. Copia la cadena de scope **completa** (por ejemplo, para un scope como `provider.users.docs`, copia `provider.users.docs` completo). Usa varios scopes si necesitas diferentes niveles de acceso. + * **Token URL**: Tu endpoint de intercambio de tokens de OAuth. + * **Info API URL** (opcional): Endpoint para obtener la información del usuario para la personalización. Si se omite, el flujo de OAuth solo se usará para verificar la identidad y la información del usuario estará vacía. + * **Logout URL**: La URL de cierre de sesión nativa de tu proveedor de OAuth. Si tu proveedor tiene un parámetro `returnTo` o similar, haz que apunte de vuelta a la URL de tu documentación. + + 4. Selecciona **Save changes**. + + + + 1. Copia la **Redirect URL** desde tu [authentication settings](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Agrega la URL de redirección como una URL de redirección autorizada en tu servidor OAuth. + + + + Para habilitar las funciones de personalización, crea un endpoint de API que: + + * Acepte tokens de acceso de OAuth para la autenticación. + * Devuelva los datos del usuario en el formato `User`. Consulta [User data format](/es/authentication-personalization/personalization-setup#user-data-format) para más información. + + Agrega la URL de este endpoint al campo **Info API URL** en tu [authentication settings](https://dashboard.mintlify.com/settings/deployment/authentication). + + + + ### Ejemplo + + Tu documentación está alojada en `foo.com/docs` y tienes un servidor OAuth existente en `auth.foo.com` que admite el Authorization Code Flow. + + **Configura los detalles de tu servidor OAuth** en tu panel: + + * **Authorization URL**: `https://auth.foo.com/authorization` + * **Client ID**: `ydybo4SD8PR73vzWWd6S0ObH` + * **Scopes**: `['provider.users.docs']` + * **Token URL**: `https://auth.foo.com/exchange` + * **Info API URL**: `https://api.foo.com/docs/user-info` + * **Logout URL**: `https://auth.foo.com/logout?returnTo=https%3A%2F%2Ffoo.com%2Fdocs` + + **Crea un endpoint de información de usuario** en `api.foo.com/docs/user-info`, que requiera un token de acceso de OAuth con el scope `provider.users.docs`, y que devuelva: + + ```json + { + "content": { + "firstName": "Jane", + "lastName": "Doe" + }, + "groups": ["engineering", "admin"] + } + ``` + + **Configura tu servidor OAuth para permitir redirecciones** a tu URL de callback. + + + + ### Requisitos previos + + * Un sistema de autenticación que pueda generar y firmar JWT. + * Un servicio de backend que pueda crear URL de redirección. + + ### Implementación + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Full Authentication** o **Partial Authentication**. + 3. Selecciona **JWT**. + 4. Ingresa la URL de tu flujo de inicio de sesión existente y selecciona **Save changes**. + 5. Selecciona **Generate new key**. + 6. Guarda tu clave de forma segura donde tu backend pueda acceder a ella. + + + + Modifica tu flujo de inicio de sesión existente para incluir estos pasos después de autenticar al usuario: + + * Crea un JWT que contenga la información del usuario autenticado en el formato `User`. Consulta [User data format](/es/authentication-personalization/personalization-setup#user-data-format) para obtener más información. + * Firma el JWT con tu clave secreta usando el algoritmo EdDSA. + * Crea una URL de redirección de vuelta a la ruta `/login/jwt-callback` de tu documentación, incluyendo el JWT como hash. + + + + ### Ejemplo + + Tu documentación está alojada en `docs.foo.com` con un sistema de autenticación existente en `foo.com`. Quieres ampliar tu flujo de inicio de sesión para otorgar acceso a la documentación mientras mantienes la documentación separada de tu panel (o no tienes un panel). + + Crea un endpoint de inicio de sesión en `https://foo.com/docs-login` que extienda tu autenticación existente. + + Después de verificar las credenciales del usuario: + + * Genera un JWT con los datos del usuario en el formato de Mintlify. + * Firma el JWT y redirige a `https://docs.foo.com/login/jwt-callback#{SIGNED_JWT}`. + + + ```ts TypeScript + import * as jose from 'jose'; + import { Request, Response } from 'express'; + + const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2; + + const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'EdDSA'); + + export async function handleRequest(req: Request, res: Response) { + const user = { + expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000), // 2 week session expiration + groups: res.locals.user.groups, + content: { + firstName: res.locals.user.firstName, + lastName: res.locals.user.lastName, + }, + }; + + const jwt = await new jose.SignJWT(user) + .setProtectedHeader({ alg: 'EdDSA' }) + .setExpirationTime('10 s') // 10 second JWT expiration + .sign(signingKey); + + return res.redirect(`https://docs.foo.com/login/jwt-callback#${jwt}`); + } + ``` + + ```python Python + import jwt # pyjwt + import os + + from datetime import datetime, timedelta + from fastapi.responses import RedirectResponse + + private_key = os.getenv(MINTLIFY_JWT_PEM_SECRET_NAME, '') + + @router.get('/auth') + async def return_mintlify_auth_status(current_user): + jwt_token = jwt.encode( + payload={ + 'exp': int((datetime.now() + timedelta(seconds=10)).timestamp()), # 10 second JWT expiration + 'expiresAt': int((datetime.now() + timedelta(weeks=2)).timestamp()), # 1 week session expiration + 'groups': ['admin'] if current_user.is_admin else [], + 'content': { + 'firstName': current_user.first_name, + 'lastName': current_user.last_name, + }, + }, + key=private_key, + algorithm='EdDSA' + ) + + return RedirectResponse(url=f'https://docs.foo.com/login/jwt-callback#{jwt_token}', status_code=302) + ``` + + + ### Redirigir a usuarios no autenticados + + Cuando un usuario no autenticado intenta acceder a una página protegida, su destino previsto se conserva en la redirección a tu URL de inicio de sesión: + + 1. El usuario intenta visitar una página protegida: `https://docs.foo.com/quickstart`. + 2. Se redirige a tu URL de inicio de sesión con un parámetro de consulta redirect: `https://foo.com/docs-login?redirect=%2Fquickstart`. + 3. Después de la autenticación, redirige a `https://docs.foo.com/login/jwt-callback?redirect=%2Fquickstart#{SIGNED_JWT}`. + 4. El usuario llega a su destino original. + + + +
+ ## Hacer públicas las páginas +
+ +Cuando uses autenticación parcial, todas las páginas están protegidas de forma predeterminada. Puedes hacer que páginas específicas sean visibles sin autenticación, ya sea a nivel de página o de grupo, con la propiedad `public`. + +
+ ### Nivel de página +
+ +Para hacer una página pública, agrega `public: true` al frontmatter de la página. + +```mdx Public page example +--- +title: "Public page" +public: true +--- +``` + +
+ ### Nivel de grupo +
+ +Para hacer públicas todas las páginas de un grupo, agrega `"public": true` debajo del nombre del grupo en el objeto `navigation` de tu `docs.json`. + +```json Public group example +{ + "navigation": { + "groups": [ + { + "group": "Public group", + "public": true, + "icon": "play", + "pages": [ + "quickstart", + "installation", + "settings" + ] + }, + { + "group": "Private group", + "icon": "pause", + "pages": [ + "private-information", + "secret-settings" + ] + } + ] + } +} +``` \ No newline at end of file diff --git a/es/authentication-personalization/overview.mdx b/es/authentication-personalization/overview.mdx new file mode 100644 index 000000000..ffb624f1c --- /dev/null +++ b/es/authentication-personalization/overview.mdx @@ -0,0 +1,74 @@ +--- +title: "Descripción general" +description: "Controla quién ve tu documentación y personaliza su experiencia" +icon: "badge-info" +keywords: ["auth"] +--- + + + [Los planes Pro](https://mintlify.com/pricing?ref=authentication) incluyen autenticación con contraseña. + + [Los planes Enterprise](https://mintlify.com/pricing?ref=authentication) incluyen todos los métodos de autenticación. + + +Elige entre tres enfoques para gestionar el acceso y personalizar tu documentación según la información del usuario y tus necesidades de seguridad: + +* **Autenticación completa**: Protección total de la privacidad de todo el contenido con personalización completa. +* **Autenticación parcial**: Control de acceso página por página con personalización completa. +* **Personalización**: Personalización del contenido sin garantías de seguridad. Todo el contenido permanece públicamente accesible. + +
+ ### Ejemplos de casos de uso +
+ +**Elige autenticación completa cuando:** + +* Crees documentación interna de la empresa que contenga información sensible +* Documentes APIs propietarias que requieran verificación del usuario +* Crees guías de implementación específicas para clientes + +**Elige autenticación parcial cuando:** + +* Ofrezcas guías públicas de introducción con funciones avanzadas privadas +* Administres un producto freemium donde los usuarios premium obtengan documentación adicional +* Publiques documentación de código abierto con secciones empresariales privadas + +**Elige personalización cuando:** + +* Crees documentación pública de API que muestre ejemplos específicos para el usuario +* Crees sitios de marketing que personalicen el contenido según los perfiles de usuario +* Ofrezcas tutoriales públicos que se adapten a las preferencias o niveles de habilidad del usuario + +
+ ## Métodos de autenticación +
+ +Elige el método que mejor se adapte a tu infraestructura existente y a tus requisitos de seguridad. + +| Método | Disponible para | Complejidad de configuración | Ideal para | +|:-------|:--------------|:-----------------|:----------| +| **JWT** | Todos los enfoques | Media | Flujos de inicio de sesión personalizados, máximo control de seguridad | +| **OAuth 2.0** | Todos los enfoques | Alta | Proveedores de autenticación de terceros, seguridad empresarial | +| **Mintlify Dashboard** | Solo autenticación | Baja | Equipos que ya usan el panel de Mintlify | +| **Password** | Solo autenticación | Baja | Acceso compartido simple sin personalización | +| **Shared Session** | Solo personalización | Baja | Apps con autenticación basada en sesiones existente | + +
+ ### Cuándo usar cada método +
+ +**JWT**: Úsalo cuando ya tengas un sistema de autenticación y quieras control total sobre el flujo de inicio de sesión. Ideal para la gestión de usuarios personalizada o cuando necesitas desacoplar el acceso a la documentación de tu aplicación principal. + +**OAuth 2.0**: Úsalo cuando quieras aprovechar proveedores de autenticación de terceros (Google, GitHub, etc.) o necesites estándares de seguridad de nivel empresarial. Ideal para organizaciones que ya utilizan infraestructura OAuth. + +**Mintlify Dashboard**: Úsalo cuando tus editores de documentación también sean tus lectores. Perfecto para equipos internos que ya gestionan el contenido mediante el panel de Mintlify. + +**Password**: Úsalo para un control de acceso sencillo cuando no necesitas rastrear usuarios individuales ni personalizar contenido. Útil para contratistas, usuarios beta o accesos temporales. + +**Shared Session**: Úsalo cuando quieras un inicio de sesión transparente entre tu aplicación y la documentación. Ideal cuando los usuarios ya están autenticados en tu aplicación principal y quieres personalizar su experiencia en la documentación. + +
+ ## Personalización de contenido +
+ +Los tres enfoques admiten funciones de personalización, como contenido MDX dinámico, prerelleno de claves de API y controles de visibilidad de páginas. Para obtener instrucciones de implementación detalladas, consulta la [configuración de Personalización](/es/authentication-personalization/personalization-setup). diff --git a/es/authentication-personalization/personalization-setup.mdx b/es/authentication-personalization/personalization-setup.mdx new file mode 100644 index 000000000..c612e3eb9 --- /dev/null +++ b/es/authentication-personalization/personalization-setup.mdx @@ -0,0 +1,397 @@ +--- +title: "Configuración de personalización" +description: "Permite que los usuarios inicien sesión para una experiencia de documentación personalizada" +icon: "user-cog" +--- + +La personalización adapta tu documentación para cada usuario cuando inicia sesión. Por ejemplo, puedes autocompletar sus claves de API, mostrar contenido específico para su plan o rol, u ocultar secciones a las que no necesitan acceder. + + + +
+ ## Funciones de personalización +
+ +Personaliza el contenido con estas capacidades de personalización. + +
+ ### Autorrelleno de claves de API +
+ +Completa automáticamente los campos del área de pruebas de API con valores específicos del usuario devolviendo nombres de campo que coincidan en tus datos de usuario. Para que el autorrelleno funcione, los nombres de los campos en tus datos de usuario deben coincidir exactamente con los nombres del área de pruebas de API. + +
+ ### Contenido MDX dinámico +
+ +Muestra contenido dinámico según información del usuario, como el nombre, el plan o la organización, usando la variable `user`. + +```jsx +Welcome back, {user.firstName}! Your {user.org?.plan} plan includes... +``` + +Consulta la sección [Formato de datos del usuario](#user-data-format) a continuación para ver ejemplos detallados y orientación de implementación. + +
+ ### Visibilidad de páginas +
+ +Restringe qué páginas son visibles para tus usuarios agregando campos `groups` al frontmatter de tus páginas. De forma predeterminada, todas las páginas son visibles para todos los usuarios. + +Los usuarios solo verán las páginas de los `groups` a los que pertenecen. + +```mdx +--- +title: "Managing your users" +description: "Adding and removing users from your organization" +groups: ["admin"] +--- +``` + + + +
+ ## Formato de datos del usuario +
+ +Al implementar la Personalización, tu sistema devuelve datos del usuario en un formato específico que habilita la personalización del contenido. Estos datos pueden enviarse como un objeto JSON en bruto o dentro de un JWT firmado, según tu método de intercambio (handshake). La estructura de los datos es la misma en ambos casos. + +```tsx +type User = { + expiresAt?: number; + groups?: string[]; + content?: Record; + apiPlaygroundInputs?: { + header?: Record; + query?: Record; + cookie?: Record; + server?: Record; + }; +}; +``` + + + Tiempo de expiración de la sesión en **segundos desde la época (epoch)**. Si el usuario carga una página después de este tiempo, sus datos almacenados se eliminan automáticamente y debe volver a autenticarse. + Para intercambios con JWT: Esto difiere del claim `exp` del JWT, que determina cuándo un JWT se considera inválido. Configura el claim `exp` del JWT con una duración corta (10 segundos o menos) por seguridad. Usa `expiresAt` para la duración real de la sesión (de horas a semanas). + + + Lista de grupos a los que pertenece el usuario. Las páginas con `groups` coincidentes en su frontmatter son visibles para este usuario. + + **Ejemplo**: Un usuario con `groups: ["admin", "engineering"]` puede acceder a páginas etiquetadas con los grupos `admin` o `engineering`. + + + Datos personalizados accesibles en tu contenido `MDX` mediante la variable `user`. Úsalos para personalización dinámica en toda tu documentación. + + **Ejemplo básico**: + ```json + { "firstName": "Ronan", "company": "Acme Corp", "plan": "Enterprise" } + ``` + + **Uso en `MDX`**: + ```mdx + Welcome back, {user.firstName}! Your {user.plan} plan includes... + ``` + Con los datos de `user` del ejemplo, se renderizaría como: Welcome back, Ronan! Your Enterprise plan includes... + + **Renderizado condicional avanzado**: + ```jsx + Authentication is an enterprise feature. { + user.org === undefined + ? <>To access this feature, first create an account at the
Mintlify dashboard. + : user.org.plan !== 'enterprise' + ? <>You are currently on the ${user.org.plan ?? 'free'} plan. See our pricing page for information about upgrading. + : <>To request this feature for your enterprise org, contact your admin. + } + ``` + + + La información en `user` solo está disponible para usuarios con sesión iniciada. Para usuarios cerrados, el valor de `user` será `{}`. Para evitar que la página falle para usuarios sin sesión, usa siempre encadenamiento opcional en los campos de `user`. Por ejemplo, `{user.org?.plan}`. + + + + Valores específicos del usuario que rellenan previamente los campos del Área de pruebas de API. Ahorra tiempo a los usuarios al autocompletar sus datos cuando prueban APIs. + + **Ejemplo**: + ```json + { + "header": { "X-API-Key": "user_api_key_123" }, + "server": { "subdomain": "foo" }, + "query": { "org_id": "12345" } + } + ``` + Si un usuario realiza solicitudes en un subdominio específico, puedes enviar `{ server: { subdomain: 'foo' } }` como un campo `apiPlaygroundInputs`. Este valor se rellenará previamente en cualquier página de API con el valor de `subdomain`. + + Los campos `header`, `query` y `cookie` solo se rellenarán previamente si forman parte de tu [esquema de seguridad de OpenAPI](https://swagger.io/docs/specification/authentication/). Si un campo está en las secciones `Authorization` o `Server`, se rellenará previamente. Crear un parámetro de encabezado estándar llamado `Authorization` no habilitará esta función. + + +
+ ### Ejemplo de datos de usuario +
+ +```json +{ + "expiresAt": 1735689600, + "groups": ["admin", "beta-users"], + "content": { + "firstName": "Jane", + "lastName": "Smith", + "company": "TechCorp", + "plan": "Enterprise", + "region": "us-west" + }, + "apiPlaygroundInputs": { + "header": { + "Authorization": "Bearer abc123", + "X-Org-ID": "techcorp" + }, + "server": { + "environment": "production", + "region": "us-west" + } + } +} +``` + + + +
+ ## Configuración de la personalización +
+ +Selecciona el método de handshake que deseas configurar. + + + + + + ### Requisitos previos + + * Un sistema de inicio de sesión que pueda generar y firmar JWT + * Un servicio de backend que pueda crear URL de redirección + + ### Implementación + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Personalization**. + 3. Selecciona **JWT**. + 4. Ingresa la URL de tu flujo de inicio de sesión existente y selecciona **Save changes**. + 5. Selecciona **Generate new key**. + 6. Guarda tu clave de forma segura donde pueda accederla tu backend. + + + + Modifica tu flujo de inicio de sesión existente para incluir estos pasos después de que el usuario inicie sesión: + + * Crea un JWT que contenga la información del usuario autenticado en el formato `User`. Consulta la sección [User data format](#user-data-format) más arriba para obtener más información. + * Firma el JWT con la clave secreta usando el algoritmo ES256. + * Crea una URL de redirección de vuelta a tu documentación, incluyendo el JWT como hash. + + + + ### Ejemplo + + Tu documentación está alojada en `docs.foo.com`. Quieres que tu documentación esté separada de tu panel (o no tienes un panel) y habilitar la Personalización. + + Genera un secreto de JWT. Luego crea un endpoint de inicio de sesión en `https://foo.com/docs-login` que inicie un flujo de inicio de sesión hacia tu documentación. + + Después de verificar las credenciales del usuario: + + * Genera un JWT con los datos del usuario en el formato de Mintlify. + * Firma el JWT y redirige a `https://docs.foo.com#{SIGNED_JWT}`. + + ```ts + import * as jose from 'jose'; + import { Request, Response } from 'express'; + + const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2; + + const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'ES256'); + + export async function handleRequest(req: Request, res: Response) { + const user = { + expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000), + groups: res.locals.user.groups, + content: { + firstName: res.locals.user.firstName, + lastName: res.locals.user.lastName, + }, + }; + + const jwt = await new jose.SignJWT(user) + .setProtectedHeader({ alg: 'ES256' }) + .setExpirationTime('10 s') + .sign(signingKey); + + return res.redirect(`https://docs.foo.com#${jwt}`); + } + ``` + + ### Conservar anclas de página + + Para redirigir a los usuarios a secciones específicas después del inicio de sesión, usa este formato de URL: `https://docs.foo.com/page#jwt={SIGNED_JWT}&anchor={ANCHOR}`. + + **Ejemplo**: + + * URL original: `https://docs.foo.com/quickstart#step-one` + * URL de redirección: `https://docs.foo.com/quickstart#jwt={SIGNED_JWT}&anchor=step-one` + + + + ### Requisitos previos + + * Un servidor OAuth que admita el flujo de código de autorización (Auth Code) con PKCE + * Capacidad para crear un endpoint de API accesible mediante tokens de acceso de OAuth + + ### Implementación + + + + Crea un endpoint de API que: + + * Acepte tokens de acceso de OAuth para la autenticación. + * Devuelva datos del usuario en el formato `User`. Consulta la sección [Formato de datos de usuario](#user-data-format) más arriba para obtener más información. + * Defina los scopes de acceso. + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Personalization**. + 3. Selecciona **OAuth** y configura estos campos: + + * **Authorization URL**: Tu endpoint de autorización de OAuth. + * **Client ID**: Tu identificador de cliente de OAuth 2.0. + * **Scopes**: Permisos a solicitar. Copia la cadena de scope **completa** (por ejemplo, para un scope como `provider.users.docs`, copia el `provider.users.docs` completo). Debe coincidir con los scopes del endpoint que configuraste en el primer paso. + * **Token URL**: Tu endpoint de intercambio de tokens de OAuth. + * **Info API URL**: Endpoint para obtener datos del usuario para la personalización. Creado en el primer paso. + + 4. Selecciona **Save changes** + + + + 1. Copia la **Redirect URL** desde tu [authentication settings](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Agrega esta URL como una URL de redirección autorizada en la configuración de tu servidor OAuth. + + + + ### Ejemplo + + Tu documentación está alojada en `foo.com/docs` y tienes un servidor OAuth existente que admite el flujo PKCE. Quieres personalizar tu documentación según los datos del usuario. + + **Crea un endpoint de información de usuario** en `api.foo.com/docs/user-info`, que requiera un token de acceso de OAuth con el scope `provider.users.docs` y responda con los datos personalizados del usuario: + + ```json + { + "content": { + "firstName": "Jane", + "lastName": "Doe" + }, + "groups": ["engineering", "admin"] + } + ``` + + **Configura los detalles de tu servidor OAuth** en tu panel: + + * **Authorization URL**: `https://auth.foo.com/authorization` + * **Client ID**: `ydybo4SD8PR73vzWWd6S0ObH` + * **Scopes**: `['docs-user-info']` + * **Token URL**: `https://auth.foo.com/exchange` + * **Info API URL**: `https://api.foo.com/docs/user-info` + + **Configura tu servidor OAuth** para permitir redirecciones a tu URL de callback. + + + + ### Requisitos previos + + * Un panel o portal de usuario con autenticación de sesión basada en cookies. + * Capacidad para crear un endpoint de API en el mismo origen o subdominio que tu panel. + * Si tu panel está en `foo.com`, la **URL de la API** debe comenzar con `foo.com` o `*.foo.com`. + * Si tu panel está en `dash.foo.com`, la **URL de la API** debe comenzar con `dash.foo.com` o `*.dash.foo.com`. + * Tu documentación está alojada en el mismo dominio o subdominio que tu panel. + * Si tu panel está en `foo.com`, tu **documentación** debe estar alojada en `foo.com` o `*.foo.com`. + * Si tu panel está en `*.foo.com`, tu **documentación** debe estar alojada en `foo.com` o `*.foo.com`. + + ### Implementación + + + + Crea un endpoint de API que: + + * Use tu autenticación de sesión existente para identificar a los usuarios + * Devuelva datos de usuario en el formato `User` (consulta la sección [Formato de datos de usuario](#user-data-format) anterior) + * Si el dominio de la API y el dominio de la documentación **no coinciden exactamente**: + + * Agrega el dominio de la documentación al encabezado `Access-Control-Allow-Origin` de tu API (no debe ser `*`). + * Establece el encabezado `Access-Control-Allow-Credentials` de tu API en `true`. + + + Habilita los encabezados CORS solo en este endpoint específico, no en toda tu API del panel. + + + + + 1. En tu panel, ve a [Authentication](https://dashboard.mintlify.com/settings/deployment/authentication). + 2. Selecciona **Personalization**. + 3. Selecciona **Shared Session**. + 4. Ingresa tu **Info API URL**, que es el endpoint del primer paso. + 5. Ingresa tu **Login URL**, donde los usuarios inician sesión en tu panel. + 6. Selecciona **Save changes**. + + + + ### Ejemplos + + #### Panel en subdominio, documentación en subdominio + + Tienes un panel en `dash.foo.com`, que utiliza autenticación de sesión basada en cookies. Las rutas de la API de tu panel están alojadas en `dash.foo.com/api`. Quieres configurar la personalización para tu documentación alojada en `docs.foo.com`. + + Proceso de configuración: + + 1. Crea el endpoint `dash.foo.com/api/docs/user-info` que identifique a los usuarios mediante autenticación de sesión y responda con sus datos de usuario. + 2. Agrega encabezados CORS solo para esta ruta: + * `Access-Control-Allow-Origin`: `https://docs.foo.com` + * `Access-Control-Allow-Credentials`: `true` + 3. Configura la URL de la API en la configuración de autenticación: `https://dash.foo.com/api/docs/user-info`. + + #### Panel en subdominio, documentación en raíz + + Tienes un panel en `dash.foo.com`, que utiliza autenticación de sesión basada en cookies. Las rutas de la API de tu panel están alojadas en `dash.foo.com/api`. Quieres configurar la personalización para tu documentación alojada en `foo.com/docs`. + + Proceso de configuración: + + 1. Crea el endpoint `dash.foo.com/api/docs/user-info` que identifique a los usuarios mediante autenticación de sesión y responda con sus datos de usuario. + 2. Agrega encabezados CORS solo para esta ruta: + * `Access-Control-Allow-Origin`: `https://foo.com` + * `Access-Control-Allow-Credentials`: `true` + 3. Configura la URL de la API en la configuración de autenticación: `https://dash.foo.com/api/docs/user-info`. + + #### Panel en raíz, documentación en raíz + + Tienes un panel en `foo.com/dashboard`, que utiliza autenticación de sesión basada en cookies. Las rutas de la API de tu panel están alojadas en `foo.com/api`. Quieres configurar la personalización para tu documentación alojada en `foo.com/docs`. + + Proceso de configuración: + + 1. Crea el endpoint `foo.com/api/docs/user-info` que identifique a los usuarios mediante autenticación de sesión y responda con sus datos de usuario. + 2. Configura la URL de la API en la configuración de autenticación: `https://foo.com/api/docs/user-info` + + + No se necesita configuración de CORS, ya que el panel y la documentación comparten el mismo dominio. + + + + + diff --git a/es/changelog.mdx b/es/changelog.mdx new file mode 100644 index 000000000..17bf5c513 --- /dev/null +++ b/es/changelog.mdx @@ -0,0 +1,755 @@ +--- +title: "Actualizaciones del producto" +description: "Nuevos lanzamientos y mejoras" +rss: true +noindex: true +--- + + + ## Lanzamientos principales + + * **Mejora importante**: páginas sugeridas por IA en 404, [cuando alguien llega a un enlace roto → el agente de IA lee la ruta → sugiere páginas semánticamente similares](https://x.com/mintlify/status/1966625627773059495) + * **Lanzamiento importante**: la búsqueda web del asistente ahora puede incluir fuentes externas\ + *Nota: Contáctanos para habilitar esta función en tu sitio.* + + ## Asistente y MCP + + * Se corrigió un error en el que el asistente era limitado por tasa de forma incorrecta porque la ventana de tiempo no se deslizaba correctamente + * Se corrigió un error en las llamadas a herramientas del asistente para manejar correctamente bloques `text` vacíos + * Se corrigió un error en el que los nombres del servidor MCP concatenados con llamadas a herramientas a veces excedían la longitud de 60 caracteres que imponen los clientes MCP + * Se corrigió un error en el que el menú del asistente tenía una altura varias veces mayor que el viewport y se desplazaba indefinidamente + * Se corrigió un error en el que los valores de gasto del asistente podían mostrarse con más de dos decimales en el panel + + ## Editor web y despliegues + + * Mejora de seguridad en el editor para que solo los usuarios con `write permissions` en el repositorio de alojamiento Git conectado puedan hacer cambios + * Se corrigió un error por el que los despliegues de vista previa no funcionaban para ramas con `=` en el nombre + * Se corrigió un error por el que los nombres de rama largos se desbordaban en los modales al crear despliegues de vista previa + * Mejora de usabilidad: el parámetro de consulta email rellenará previamente el campo en invitaciones de registro + * Se corrigió un error por el que copiar una página desde el menú contextual no funcionaba en Safari + + ## Área de pruebas de API y navegación + + * Múltiples códigos de respuesta del área de pruebas de API ahora se muestran en un menú select con estilo controlado en lugar del select predeterminado del sistema cuando tiene el foco + * Ahora puedes usar el [campo `expanded` en los grupos de navegación de tu `docs.json` para que se abran por defecto](https://mintlify.com/docs/navigation#default-expanded-state) + + ## SEO y UI + + * Se corrigió un error por el que los favicons no aparecían en los motores de búsqueda sirviéndolos desde la misma URL que el propio sitio de documentación para cada sitio + * Se corrigió un error por el que las incrustaciones de YouTube parpadeaban al cargar + * Se corrigió un error por el que expandir el menú de comentarios para incluir respuestas escritas causaba un cambio de diseño en la tabla de contenido + * Se corrigió un error por el que el texto se desbordaba por encima de la barra superior en el tema Maple al descartar la barra de notificaciones + * Se mejoraron los temas Maple y Willow añadiendo botones de inicio/cierre de sesión en la barra lateral para facilitar el acceso + + ## Analítica y exportaciones + + * Se corrigieron problemas de confiabilidad en la vista y las exportaciones de la analítica del asistente + * Las exportaciones de la analítica del asistente ahora se ejecutan en segundo plano y se envían por correo electrónico para una experiencia más confiable + + + + ## Lanzamiento principal: recopilación de comentarios mejorada + + * **Mejora importante**: Los lectores ahora pueden dar comentarios más detallados después de seleccionar *pulgar arriba/abajo*, incluyendo opciones y comentarios escritos. También puedes recopilar comentarios en bloques de código y ver todas las respuestas en las analíticas de tu panel.\ + *Nota: Contáctanos para habilitar esta función en tu sitio.* + + ## Mejoras de navegación y de experiencia + + * Mejora de experiencia para ignorar barras finales y dobles barras, de modo que no tengas que preocuparte por colocarlas exactamente en tu docs.json + * Ahora puedes agregar el atributo `noAnchor` a tus etiquetas HTML `h1-6` para evitar que tengan un enlace de ancla + * El tema Palm ahora incluye un selector de idioma flotante en la esquina inferior izquierda, similar al enfoque de Stripe + * Se agregó un nuevo campo al docs.json llamado [`drilldown`](https://mintlify.com/docs/navigation#enable-auto-navigation-for-groups) que te permite controlar si los usuarios son dirigidos o no a la primera página de un grupo de navegación cuando el grupo se expande + * Mejora de experiencia para hacer que las listas ordenadas anidadas alternen estilos de decimal/romano a alfabético + + ## Correcciones de errores y confiabilidad + + * Se corrigió un error en el que los enlaces de ancla de posición de desplazamiento no funcionaban correctamente cuando había componentes JS en una página + * Se corrigió un error por el que Google estaba indexando archivos `*.md` sin procesar porque faltaba el encabezado `x-robots-tag: noindex` + * Se corrigió un error con OAuth en documentos protegidos que impedía redirigirte a tu página inicial una vez completado correctamente el flujo + * Se corrigió un error en las vistas previas de documentos protegidos por autenticación que impedía ver toda la barra de navegación + * Correcciones en el manejo de SVG con nuestra nueva CDN de imágenes + + ## Mejoras de componentes y estilo + + * Se agregó un nuevo selector CSS para estilos personalizados en `SidebarNavGroupDivider` + * Nuevas pruebas de regresión para páginas de API definidas en MDX con seguridad definida garantizarán un mayor grado de estabilidad + + ## Mejoras de rendimiento + + * Mejora de rendimiento al mover el CSS de KaTeX de cdnjs a nuestra propia CDN en CloudFront para reducir la latencia + + + + ## Mejoras en el manejo de imágenes + + * **Mejora importante**: Las imágenes ya no causan desplazamientos de diseño por defecto, incluso cuando no se especifican los atributos de ancho y alto; el dimensionamiento automático evita saltos de contenido durante la carga de la página + * Todos los archivos estáticos de tu repositorio (PDF, TXT, XML, etc.) ahora se cargan y sirven automáticamente al publicar, proporcionando cobertura completa de recursos + + ## Mejoras del editor web y del despliegue + + * Se corrigió el flujo de creación de ramas en el Editor web para navegar correctamente a las nuevas ramas creadas y permanecer en ellas + * Se mejoró el diálogo de conflictos de fusión con una función de escape adecuada; ya no se requieren recargas de página para descartarlos + * Se optimizó el rendimiento del flujo de actualización invalidando la caché solo de las páginas modificadas durante actualizaciones parciales, reduciendo los tiempos de despliegue + + ## Mejoras de autenticación y navegación + + * Nuevo soporte para autenticación en subdirectorios personalizados; si sirves la documentación en `https://yourdomain.com/docs`, la autenticación ahora funciona sin problemas + * Se corrigió un error de visualización en la barra lateral que aparecía cuando solo había un enlace configurado + * Renovación integral de la navegación móvil: botones centrados con margen y relleno adecuados, mejor espaciado en menús desplegables, se eliminaron divisores y márgenes innecesarios en secciones vacías, y se corrigieron problemas de separación/espaciado en el tema Maple + + ## Correcciones de componentes y estilo + + * Se resolvió un problema de conversión de etiquetas `` que las transformaba incorrectamente en componentes Heading y afectaba el estilo personalizado + * Se agregó un interruptor de configuración de un clic para el Asistente en el panel para facilitar la gestión + + ## Mejoras técnicas y confiabilidad + + * Sistema de registro mejorado para los flujos de actualización, permitiendo una depuración más rápida y una resolución de problemas más eficiente + * Se solucionó la limitación de velocidad de GitHub para clientes con más de 10 especificaciones OpenAPI/AsyncAPI al pasar de la obtención de archivos individuales al clonado del repositorio + * Se mejoró la confiabilidad del Asistente con soporte de LLM de respaldo, mejor manejo de errores por límites de velocidad y una herramienta de búsqueda más robusta + + + + ## Optimizaciones de rendimiento y compilación + + * La transpilación de MDX ahora ocurre en el momento del despliegue en lugar de en cada carga de página en entornos serverless de NextJS sin caché, mejorando el tiempo hasta el primer byte en páginas no cacheadas. + * El hashing basado en contenido evita la retranspilación cuando el MDX no ha cambiado, reduciendo los tiempos del flujo de actualización en ~50% para clientes con un gran número de páginas (los despliegues de más de 5 minutos deberían reducirse aproximadamente a la mitad). + * La visualización de despliegues de vista previa en el panel ahora es más rápida gracias a índices adicionales en la base de datos y paralelización de consultas en nuestro backend. + * Se redujo el tamaño de página eliminando datos `navigation` duplicados en la carga útil `rsc` de cada página; las mejoras de rendimiento son más notorias con un alto número de páginas o estructuras de navegación complejas. + * Un prefetching más agresivo permite cargas instantáneas de página con mayor frecuencia. + + ## Mejoras al área de pruebas de API y OpenAPI + + * La conversión de OpenAPI a MCP se movió al backend, lo que permite que los servidores MCP alojados incluyan herramientas (pronto habrá documentación y opciones de configuración más claras). + * Se añadió compatibilidad con Ruby al área de pruebas de API. + * Agregamos una función con la que ahora puedes [especificar páginas de API usando solo tu docs.json](/es/api-playground/openapi-setup#auto-populate-api-pages) sin crear nuevos archivos MDX. + * Compatibilidad con páginas de [`webhook`](/es/api-playground/openapi-setup#webhooks) en la navegación de la documentación a partir de especificaciones OpenAPI. + * Se optimizó el contexto del modelo de IA eliminando los anclajes de los enlaces de Markdown al navegar a Anthropic, OpenAI u otros proveedores. + + ## Mejoras del editor web + + * La creación y el cambio de nombre de archivos ahora guardan los cambios al hacer clic fuera, en lugar de requerir presionar la tecla Enter. + * Se corrigió la navegación entre ramas donde cambiar la URL a una rama específica redirigía a la última rama activa en lugar del destino previsto. + * Se codifican correctamente en la URL los títulos de ramas que contienen `/` para evitar fallos de navegación. + * Se corrigió el atajo de enlace `Ctrl+K` en el Editor del panel de monorepo, que estaba anteponiendo la ruta del repositorio de docs y creando enlaces rotos. + + ## Analítica e integraciones con LLM + + * Compatibilidad con `llms.txt` y `llms-full.txt` personalizados: añádelos a la raíz del repositorio de docs para servirlos en los endpoints `/llms.txt` y `/llms-full.txt` para personalización de LLM. + * Se añadió la [integración de analítica de Hightouch](/es/integrations/analytics/hightouch#hightouch). + * Seguimiento de analítica del menú contextual mejorado (la visualización en el panel llegará pronto). + * Se añadieron pruebas de extremo a extremo (e2e) para `llms.txt` y `llms-full.txt` para garantizar una entrega correcta. + + ## Mejoras de componentes y estilos + + * Compatibilidad con nombres de clase personalizados en etiquetas `h{1-4}` para aplicar estilos de encabezado personalizados. + * Se corrigió el renderizado de etiquetas `h{1-4}` como componentes `Heading` con chips en modo de página personalizada. + * Se añadieron selectores CSS a las [migas de pan](/es/navigation#breadcrumbs) para aplicar CSS personalizado. + * Se corrigieron imágenes de Open Graph estiradas analizando dimensiones para mantener las proporciones a 56 px de altura. + * Se corrigió `VSCode` a `VS Code` en el menú contextual cuando está habilitado. + * Se corrigió que los encabezados dentro de componentes personalizados aparecieran en la tabla de contenidos junto con encabezados semánticos. + + ## Correcciones de errores y confiabilidad + + * Se corrigieron problemas de renderizado de PDF con ciertos títulos de página saneando caracteres que causaban problemas de generación. + * Se resolvió el error de la CLI `Cannot convert undefined or null to object` al encontrar archivos JSON de OpenAPI vacíos. + * Se corrigió que las metatags de Open Graph personalizadas en `docs.json` fueran sobrescritas por las generadas. + * Se corrigieron los clics del botón de RSS al aterrizar en enlaces de anclaje usando origin + pathname para los enlaces RSS. + * Se mejoró la velocidad de descarga de la CLI eliminando sourcemaps. + + ## Mejoras técnicas + + * Se añadieron pruebas visuales al pipeline de CI para detectar regresiones más temprano. + * Capacidades mejoradas de manejo de errores y depuración. + * Cobertura de pruebas integral para nuevas funciones y casos límite. + + + + ## Mejoras de autenticación + + * Acceso público a nivel de grupo: haz públicos grupos de páginas completos mediante `docs.json` para no tener que añadir `public: true` en cada página ([más información](https://mintlify.com/docs/authentication-personalization/authentication-setup#group-level)) + * Compatibilidad con [`logoutURL` en la configuración de OAuth](https://mintlify.com/docs/authentication-personalization/authentication-setup#implementation-3) para eliminar cookies de origen y completar el cierre de sesión + * En caso de errores de OAuth, los usuarios se redirigen a la `logoutURL` especificada para reiniciar el flujo de autenticación + * Corregido un parpadeo de error 500 durante los flujos de OAuth/JWT antes del callback + * Eliminación automática de `https://` de las URL en la configuración de autenticación OAuth/JWT para prevenir configuraciones incorrectas + + ## Mejoras del Área de pruebas de API + + * Nuevo [endpoint de la Search API](https://mintlify.com/docs/api-reference/assistant/search) para que puedas crear agentes y servidores MCP sobre tu documentación + * Los archivos `openapi` y `asyncapi` ahora se sirven en sus rutas especificadas (p. ej., `https://mydocsurl.extension/{openapi-or-file-name}.json`) + * Ahora puedes usar el [campo `x-mint` en tus archivos OpenAPI](https://mintlify.com/docs/api-playground/openapi-setup#x-mint-extension) para anular campos generados, personalizar el contenido del prefacio o cambiar las URL de endpoints en ejemplos de código + * [`x-mcp` ahora es `x-mint.mcp`](https://mintlify.com/docs/api-playground/openapi-setup#mcp) en configuraciones de OpenAPI para controlar qué rutas se exponen como herramientas MCP + + ## Actualizaciones del Asistente + + * Se corrigió un problema por el que el menú de acciones (con opciones como copiar y pulgar arriba) de mensajes antiguos desaparecía cuando llegaban nuevos por streaming + * Se corrigió la accesibilidad de las páginas anidadas `/mcp/...` tras el [lanzamiento de los servidores MCP alojados](https://mintlify.com/docs/ai/model-context-protocol#accessing-your-mcp-server) de la semana pasada + + ## Rendimiento y confiabilidad + + * Todos los recursos de imagen y video presentes en tu repositorio de documentación ahora se sirven en la ruta correspondiente de tu dominio. Por ejemplo, si tienes `/assets/marketing/my-logo.png` en tu repo, estará disponible en `https://mydocsurl.extension/assets/marketing/my-logo.png`. + * El campo de correo electrónico en el inicio de sesión del panel de Mintlify ahora tiene enfoque automático para que puedas empezar a escribir de inmediato (mejora de usabilidad) + * Tanto dominios personalizados como subdominios en Redis para mejorar el rendimiento en los tiempos de carga de la navegación (~50 ms menos de latencia) + * Se agregó lógica de reintento para las exportaciones a PDF y mejorar la confiabilidad + * Se corrigió que el aviso de consentimiento de cookies reapareciera después de aceptar o descartar: ahora se respeta la primera selección + * Se corrigió la copia de una página al portapapeles en Safari especificando un tipo MIME en `navigator.write` + + ## Mejoras técnicas + + * Correcciones de errores del CLI para Windows y pnpm, además de pruebas de CI para prevenir regresiones + * Salida de registro de errores mejorada: una mejora de usabilidad para nuestro equipo de ingeniería al depurar + * Correcciones menores en la acción de CI de enlaces rotos cuando faltan archivos de `contentDirectory` + * Se corrigió una regresión causada por las correcciones de la vista previa protegida por autenticación de la semana pasada, donde la pestaña activa no se establecía correctamente en la UI de navegación + * Se corrigió que el color de fondo del tema claro no se aplicara a los íconos de la pestaña activa + * Se corrigió un problema por el que cambiar el tipo de autenticación en el panel se actualizaba y luego volvía al tipo guardado previamente: ahora la nueva selección persiste tras guardar + * Mejoras internas de DX para clientes enterprise con bibliotecas de UI personalizadas: ahora nos resulta más fácil incluir tus componentes y atender solicitudes en plazos más cortos + + + + ## Mejoras en la autenticación + + * Mejoras en el desarrollo local de la autenticación, permitiendo desarrollar funciones y corregir errores más rápido en esta área del producto + * Despliegues de vista previa ahora disponibles para sitios protegidos por autenticación + * Se corrigió el comportamiento de redirección para devolver correctamente a los usuarios a su página original después de autenticarse + * Se corrigió la visualización del botón de cerrar sesión para la autenticación completa (antes solo funcionaba con autenticación parcial) + + ## Mejoras del área de pruebas de API + + * Se corrigió la carga de archivos `multipart/form-data` en el área de pruebas de API + * Se corrigió el comportamiento de los enlaces de anclaje para que, al hacer clic, actualicen la URL sin desplazarse al inicio de la página + * Se corrigieron problemas de enlaces de anclaje en pestañas anidadas + + ## Actualizaciones del Asistente + + * Nueva API del Asistente para integrarlo en tus propios productos, compatible con AI SDK + * Se añadió un botón para copiar en las respuestas del chat + * Se corrigió un problema al reintentar mensajes en el asistente + * Mejoras al prompt predeterminado del asistente para que sea menos verboso por defecto + + ## Rendimiento y confiabilidad + + * La búsqueda se siente más ágil y precisa al abortar solicitudes con debounce mientras escribes + * Aprovisionamiento de recursos para una nueva CDN: se espera que mejoren pronto los tiempos de carga de imágenes y páginas + * Se corrigieron errores al renderizar diagramas Mermaid complejos como gráficos de Gantt + * Se corrigieron errores de la CLI en Windows para mejorar la estabilidad y se añadieron pruebas para prevenir regresiones + + ## Mejoras técnicas + + * Se añadió OpenTelemetry para trazas en la aplicación Next.js y así mejorar el time to first byte para los clientes + * Migración de Octokit a GitHub API Client para mejorar la latencia en la experiencia del editor web + * Se corrigieron metaetiquetas duplicadas para OpenGraph + * Actualización de MongoDB de la versión 6 a la 7 para mejorar el rendimiento y sumar nuevas funciones + + + + ## Aplicación de Slack + + * Acceso sin fricción: el bot responde a MD, @menciones y cualquier pregunta en tu canal `#ask-ai` + * Configuración con un clic: instálala directamente desde tu panel de Mintlify en segundos + * Respuestas contextuales: busca en toda tu documentación para ofrecer respuestas relevantes y precisas + * Reduce interrupciones de soporte: convierte preguntas diarias en respuestas instantáneas de autoservicio + + Obtén más información en nuestra [guía de la aplicación de Slack](/es/ai/slack-app). + + ## Servidores MCP alojados + + Implementa servidores alojados del Model Context Protocol (MCP) directamente a través de Mintlify para integrarte con herramientas de IA como Claude, Cursor y otras. Obtén más información en nuestra [guía de MCP](/es/ai/model-context-protocol). + + Ayuda a los usuarios a conectar rápidamente tu servidor MCP con Cursor o VS Code desde cualquier página de tu documentación mediante el menú contextual. Consulta [Menú contextual](/es/ai/contextual-menu) para más información. + + ## Mejoras en los bloques de código + + * Mejor resaltado de sintaxis + * Se añadieron más opciones de personalización, como modo de enfoque, bloques de código expandibles, adaptación a modo oscuro y claro, menú desplegable de lenguaje, numeración de líneas e iconos + + + + ## Actualizaciones del asistente de IA + + * Mayor precisión mediante RAG agentivo con llamadas a herramientas + * Proporciona enlaces navegables a las páginas referenciadas para que los usuarios vayan directamente a la fuente de las respuestas + * Atajo para copiar ejemplos de código generados por el asistente + * Atajo “Ask AI” en bloques de código de la documentación para generar explicaciones con el asistente + + Obtén más información en la [documentación del asistente](/es/guides/assistant). + + ## Registros de cambios suscribibles + + * Genera automáticamente un feed RSS a partir de las páginas del registro de cambios + * Integra actualizaciones habilitadas por RSS con Slack, correo electrónico y otras herramientas + + Obtén más información en nuestra nueva [guía de registros de cambios](/es/guides/changelogs) + + + + ## Actualizaciones de estabilidad del área de pruebas de API + + * Busca para encontrar un endpoint + * Indica un endpoint en desuso con una etiqueta + * Oculta de la navegación las páginas de API autogeneradas + * Sube archivos multipart o de datos de formulario + + Obtén más información en la [documentación del área de pruebas de API](/es/api-playground/) + + ## `mint update` + + Ahora puedes usar `mint update` para actualizar tu CLI. + + + + ## Editor web 3.0 + + + ![Webeditor3 Jpe](/images/webeditor3.jpeg) + + + Rediseño de la usabilidad en el editor WYSIWYG. + + **Mejoras principales** + + * Busca nombres de archivos con el atajo ⌘ + P + * Las páginas cargan 10 veces más rápido + * Cargas más rápidas al buscar una rama + * Pestaña de opciones de página para configurar el diseño, el título y los metadatos para SEO + * Barra de herramientas flotante al resaltar texto + + **Correcciones adicionales** + + * Se corrigió el margen superior de los componentes del registro de cambios + * Se mejoró la fiabilidad del clic derecho + * Tras publicar, permanecerás en la misma página en lugar de ver un estado vacío + * Colores estandarizados en los iconos de archivos + * Mayor fiabilidad tras seleccionar nuevas ramas varias veces seguidas + * Se eliminó el modo Diff + * Más consistencia al crear una carpeta nueva desde el menú desplegable + * Se corrigió que las citas en bloque crearan más citas en bloque al intentar deseleccionarlas + + ## Traducciones con IA en beta + + + ![AI Translations graphic](/images/changelog/translations.png) + + + Traduce toda tu documentación con IA. [Más información.](es/navigation#localization) + + ## Exportar documentación a PDF en beta + + Exporta toda tu documentación, un subdirectorio o una sola página como PDF. + + ## Compatibilidad con hooks de React + + Añade interactividad a tu documentación. Todos los hooks estándar de React están disponibles automáticamente en tus archivos MDX. [Más información.](es/react-components) + + + + ## Generador de servidores MCP + + + ![screenshot of MCP server generator](/images/changelog/mcpgenerator.png) + + + Genera servidores MCP para que las aplicaciones de IA puedan interactuar con tu documentación o API. El contenido escrito se genera automáticamente como un servidor MCP y puedes generar uno a partir de tu especificación de OpenAPI con un solo clic. + Consulta la [documentación para comenzar con MCP.](/es/ai/model-context-protocol) + + ## Mejoras + + * Etiqueta las actualizaciones del registro de cambios para que los usuarios finales puedan filtrarlas + * Sonnet-3.7 compatible con el chat de IA. Configura tu modelo preferido desde el panel + * Cambia el nombre de tu despliegue directamente en la configuración del panel + + ## Correcciones de errores + + * Imágenes OG corregidas + * Se corrigió la inconsistencia de estilo de icono en anclas sin contenedor + * Ajustes de estilo mejorados en el borde del panel para responsividad en móvil-tablet-escritorio + * Mostrar ejemplos de código incluso en modo simple en el Área de pruebas de API + * Compatibilidad con el atajo "command + k" para buscar en el editor web + * Los bloques de código dentro de avisos se expanden para ocupar todo el ancho del área del aviso + + + + ## Nuevo esquema de configuración `docs.json` + + + ![docs.json screenshot](/images/changelog/docsjson.png) + + + Hemos introducido un nuevo esquema `docs.json` como reemplazo de `mint.json`, para admitir un mejor versionado multinivel, una comprensión visual más sencilla y una terminología más consistente. Para obtener más información sobre lo que ha cambiado, [consulta nuestro blog](https://mintlify.com/blog/refactoring-mint-json-into-docs-json). + + Actualiza de `mint.json` a `docs.json` con los siguientes pasos: + + 1. Asegúrate de que tu CLI esté en la última versión + + ```bash + npm i mint@latest -g + ``` + + 1. En tu repositorio de documentación, ejecuta + + ```bash + mint upgrade + ``` + + 1. Elimina tu archivo `mint.json` antiguo y sube tus cambios + + ## Comprobaciones de CI + + Ejecuta lint automáticamente sobre tu documentación para encontrar enlaces rotos, detectar problemas de ortografía y gramática o aplicar estilos de escritura con tu propia configuración de Vale. Obtén más información en nuestra [documentación](es/settings/ci). + + ## Compatibilidad .md para LLM + + Todas las páginas de documentación ahora están disponibles automáticamente como archivos Markdown sin formato: solo agrega `.md` a la URL. Esto facilita que los LLM procesen páginas individuales de tu documentación. + + ## Más temas + + + ![graphic with text "Themes v2"](/images/changelog/themes.png) + + + Nuevos [temas prediseñados](es/themes) para modificar el look & feel de tu documentación. Configúralos desde tu [archivo docs.json](es/settings). + + Ahora disponible: + + * Maple + * Palm + * Willow + + ## Otras mejoras + + * [Guía de redacción técnica:](https://mintlify.com/guides/introduction) Mejores prácticas para escribir documentación técnica, incluida la investigación de audiencia, los tipos de contenido y consejos de escritura. + * [Componente Dropdown](es/navigation#dropdowns): Organiza la navegación con un menú desplegable, además de pestañas y anclas. + * [Corrector de sintaxis con IA](https://x.com/ricardonunez_io/status/1892334887644123192): El editor web detectará si hay un error de parsing y usará IA para sugerir correcciones. + + + + ## Mejoras del Asistente de IA + + * Nueva interfaz con página de chat dedicada y prompts predefinidos + * Mejoras de estabilidad, p. ej., corrección de errores al editar el archivo equivocado o ningún archivo en absoluto + * Conocimiento más robusto para agregar y editar componentes + * Edición mejorada del archivo `docs.json` + + ## Autenticación parcial + + Personaliza el acceso a cualquier página o sección de contenido según los permisos del usuario. Admite la conexión con tu propio sistema de autenticación. + + ## Área de pruebas de API renovada + + Hemos renovado el diseño y el rendimiento del [Área de pruebas de API](/es/api-playground/). Las actualizaciones incluyen: + + * Expansión de detalles más sencilla para obtener una vista general de un campo + * Diseño anidado más intuitivo, p. ej., agregar o eliminar elementos + * Tiempos de respuesta más rápidos + + ## Mejoras de calidad + + * Compatibilidad para requerir autenticación para acceder a despliegues de vista previa + + + + ## Autenticación + + + ![Authentication screenshot](/images/changelog/authentication.png) + + + Vuelve privada la documentación configurando autenticación mediante JWT, OAuth o una contraseña universal. Con esta privacidad, puedes crear una base de conocimiento interna o evitar que los competidores vean tu documentación. + + + + ## Redactor de IA + + + ![AI Assistant](/images/changelog/ai-assistant.jpg) + + + Ahora puedes pedirle a la IA que haga cambios en tu documentación, con el contexto de toda la documentación existente. Escribe una indicación y el redactor propondrá cambios generando una pull request. + + ## Mejora de la integración con GitLab + + Hemos mejorado nuestra compatibilidad con la sincronización con GitLab, habilitando actualizaciones automatizadas y despliegues de vista previa. Consulta nuestra [documentación sobre GitLab](/es/settings/gitlab) para comenzar. + + ## Editor web + + + ![Web Editor](/images/changelog/webeditor.jpg) + + + Hemos renovado nuestro Editor web para que ahora puedas actualizar la documentación con una experiencia WYSIWYG completa, mientras se sincroniza con Markdown. + + Consulta nuestra [documentación para comenzar con el Editor web](/es/editor). + + ## Compatibilidad con /llms.txt + + + ![llms.txt support](/images/changelog/llms.jpg) + + + Todas las instancias de documentación ahora se alojan automáticamente en /llms.txt y /llms-full.txt para que los LLM puedan incorporar tu documentación fácilmente. Para obtener más información, lee la [documentación sobre el nuevo estándar llms.txt.](https://llmstxt.org) + + ## Localización + + Ahora puedes localizar tu documentación, lo cual funciona de manera similar al versionado. Agrega un `locale` a una versión y el contenido fijo en Mintlify, como “Was this page helpful?”, también coincidirá con el locale. + + ### Mejoras de calidad + + * Devolver resultados de chat y búsqueda según la versión actual que el usuario esté leyendo + * Autenticar a los usuarios con OAuth, además de JWT o tokens de sesión compartida. + + + + ## Registro de cambios + + Lanzamos un nuevo [Componente de actualización](/es/components/update) para facilitar la visualización y comunicación de actualizaciones (como esta) a tus usuarios. + + + ![Changelog](/images/changelog/changelog.jpg) + + + ## Resaltado de líneas de código + + Ahora puedes resaltar líneas de código en tu documentación para enfatizar y llamar la atención sobre partes importantes añadiendo un comentario especial después del identificador del lenguaje. Usa llaves `{}` y especifica números de línea o rangos separados por comas. + + ```javascript Ejemplo de resaltado de líneas {1,3-5} + const greeting = "Hello, World!"; + function sayHello() { + console.log(greeting); + } + sayHello(); + ``` + + ````mdx + ```javascript Ejemplo de resaltado de líneas {1,3-5} + const greeting = "Hello, World!"; + function sayHello() { + console.log(greeting); + } + sayHello(); + ``` + ```` + + ## Bloques de código en modo claro + + Los bloques de código ahora tienen una variante en modo claro que puede habilitarse añadiendo lo siguiente a tu `docs.json`: + + ```json + "codeBlock": { + "mode": "auto" + } + ``` + + ## Pie de página avanzado + + + ![Advanced Footer](/images/changelog/advanced-footer.gif) + + + Ahora puedes añadir más enlaces al pie de página estándar. Esta mejora + aporta más consistencia entre las landing pages y la documentación, o mayor personalización + si quieres destacar páginas específicas como redes sociales o registros de estado. + + ## Filtrar la búsqueda según el usuario actual + + Cuando la personalización está habilitada, los resultados de búsqueda se filtran según el usuario que haya iniciado sesión para que solo vea el contenido relevante. + + ## Prompts personalizados para el chat de IA + + Ahora puedes personalizar los prompts del chat de IA. Comunícate con [support](mailto:support@mintlify.com) si quieres personalizarlos. + + ## Mejoras del panel + + * Se añadió la opción de cambiar el dominio personalizado para que sea /docs directamente desde la configuración del panel. + * Se unificaron las páginas de inicio de sesión y registro para reducir la fricción y la confusión. + * Se implementó el flujo de inicio de sesión por descubrimiento para que los usuarios que pertenecen a varias organizaciones puedan cambiar entre ellas. + * Se añadió inicio de sesión con Google OAuth. + * Se añadió la opción de crear un nuevo despliegue desde la configuración del panel. + + ## Correcciones de errores + + * Ya se pueden usar barras iniciales en la navegación. + * Ya se pueden editar archivos CSS y JS en el editor web. + * Se corrigió que `suggestEdit` no apareciera incluso cuando estaba habilitado. + * Se corrigió la navegación por teclado para Search y Chat, de modo que ahora puedes usar las teclas de flecha arriba y abajo para recorrer los resultados. + * No permitir que los motores de búsqueda rastreen páginas protegidas por autenticación de usuario. + * Revalidar la caché cuando se elimina una organización. + * Ahora usamos el analizador OpenAPI de Scalar para procesar definiciones de OpenAPI, lo que mejora el rendimiento, corrige problemas de análisis y muestra mensajes de error más claros. + * Ya se admiten descripciones de nivel superior en las páginas de referencia de API autogeneradas a partir de definiciones de OpenAPI. + * Se agregó compatibilidad con estilos en línea para iconos. + * Se corrigió la aparición repentina del CSS personalizado en la documentación. + * Mostrar correctamente el estilo de código en línea junto con enlaces. + * Mantener la posición de desplazamiento al hacer clic en el botón Atrás del navegador. + + + + ## Fuentes personalizadas + + + ![Fuentes personalizadas](/images/changelog/custom-fonts.jpeg) + + + Personaliza la tipografía de tu documentación con tu propia fuente alojada en un CDN o eligiendo entre Google Fonts para alinear tus docs con tu marca. + + ## Imágenes en componentes Card + + Agrega la propiedad `img` a una tarjeta para mostrar una imagen en la parte superior. Obtén más información [aquí](/es/components/cards#image-card). + + ## Mejoras en la velocidad de actualización + + + ![Mejoras de rendimiento](/images/changelog/performance-improvements.png) + + + Para proyectos grandes (~3,000 archivos), el paso de descarga para las actualizaciones de docs ahora es + ~440x más rápido: una reducción del 99.8% en el tiempo. En general, las descargas de archivos durante + las actualizaciones ahora son ~5.5x más rápidas: una reducción del 81.8% en el tiempo. + + ## Mejoras de SEO + + + ![Mejoras de SEO](/images/changelog/seo-improvements.jpeg) + + + Hemos corregido tanto el diseño móvil como el de escritorio de nuestras docs para que sean más compatibles con SEO, incluyendo la incorporación de etiquetas aria adecuadas en la barra de navegación y en los elementos de alternancia. + + ## Mejoras del panel + + * Migración al App Router en el panel. + * Las analíticas de búsqueda ahora están disponibles en el panel. + * Se agregó la funcionalidad para eliminar una organización en el panel. + * Se lanzó la UI de conexión con GitLab. + * Corrección de datos de analíticas incorrectos. + * Ahora los complementos pueden comprarse directamente a través del panel. + + ## Correcciones de errores + + * Se corrigió un error por el que la barra superior no se ajustaba al ancho de la pantalla cuando estaba en modo personalizado y el diseño de la barra lateral era `sidenav`. + * Corrección del posicionamiento relativo del widget de IA. + + ## Más + + * **Solución de problemas para páginas de API**: Las páginas de API pueden ser complicadas, así que enumeramos + problemas comunes para ayudarte a resolverlos rápidamente — + [Lee la documentación](/es/api-playground/troubleshooting) + + + + ## Páginas de referencia de OpenAPI + + * Los endpoints definidos por OpenAPI que son complejos y recursivos ahora son un 98% + más pequeños. + * Ahora mostramos + [additionalProperties](https://swagger.io/docs/specification/data-models/dictionaries/) + en las páginas de OpenAPI. + + ## Carga de archivos en el Área de pruebas de API + + De forma predeterminada, las solicitudes del Área de pruebas de API pasan por un proxy de Mintlify. Ahora puedes usar + `disableProxy` para desactivar este comportamiento y admitir tipos de solicitudes como + la carga de archivos. + + * [Más información sobre configuraciones de API](es/settings#api-configurations) + + ## Mejoras de SEO en móviles + + Hemos corregido el diseño móvil de nuestras docs para que sea más compatible con SEO, + incluyendo la incorporación de etiquetas aria adecuadas en los elementos. + + ## Formulario de soporte + + Agregamos un formulario de soporte más detallado al panel de Mintlify. Ahora puedes + enviar un formulario para ponerte en contacto con nosotros. + + ## Correcciones de errores + + * Se corrigió un error en la funcionalidad de la integración con Segment. + * Ahora mostramos mensajes de error más granulares para los permisos de GitHub al + interactuar con el editor. + * Se corrigieron errores por los que la navegación no se expandía correctamente cuando se usaba un enlace directo. + + + + ## Widget de IA + + + ![Widget de IA](/images/changelog/widget.png) + + + Para usuarios `Pro`, presentamos Mintlify Widget, una extensión de tus docs para + responder las preguntas de tus usuarios cuando y donde las hagan. Puedes agregar este + chatbot con IA a cualquier página web: tu landing page, dentro de tu producto o + en tus páginas de documentación existentes. + + * [Lee el anuncio en el blog](https://mintlify.com/blog/widget) + + ## Plan Pro + + También actualizamos nuestros planes de precios para una mejor personalización y escalabilidad. + + * [Lee el anuncio en el blog](https://mintlify.com/blog/pro-plan) + + ## Sincronización de ejemplos de código en el Área de pruebas de API + + Cuando navegas por la documentación de API, el ejemplo de código seleccionado ahora se sincroniza entre tus páginas. + + ## Insights + + Actualmente en beta, esta función resume preguntas comunes de los usuarios y patrones + en informes fáciles de digerir, con sugerencias impulsadas por IA sobre cómo mejorar tu producto. + + + + ## Lo más destacado de la Launch Week + + * Temas: Personaliza el estilo con temas preconfigurados. Solo agrega el tema Quill, Prism o Venus a tu archivo `docs.json` y se actualizará el estilo de tu documentación. + * Search V2: consulta directamente las descripciones y títulos de endpoints de OpenAPI para llegar a las páginas de Referencia de API, excluye páginas ocultas de la búsqueda y aprovecha nuestra barra de búsqueda renovada. + * Ramificación en el Editor web: crea ramas en nuestro editor web sin un IDE. + * Personalización de usuario: autentica a los usuarios con Shared Session o JWT para mostrarles contenido personalizado, como el prerellenado de claves de API o contenido específico para clientes. + * Mejoras de automatización de OpenAPI: para autocompletar las páginas del Área de pruebas de API, puedes agregar un campo `openapi` a un objeto en los arreglos tabs o anchors en el `docs.json`. + + + + ## Okta SSO + + Ahora admitimos inicio de sesión mediante Okta SAML y OIDC. + + ## Mintlify REST API + + Activa actualizaciones de tu documentación de forma programática. + + + + ## Modo personalizado + + Agrega una configuración a los metadatos para eliminar todos los elementos excepto la barra superior. + Casos de uso: + + * Crea una página de inicio global personalizada con componentes personalizados + * Agrega videos a pantalla completa o galerías de imágenes + * Inserta elementos de demostración iFrame personalizados para añadir interactividad a tu documentación + + Consulta nuestra [documentación de Modo personalizado](es/pages#custom-mode). + + + + ## MDX de Mintlify para VSCode + + Inserta fragmentos de nuestros componentes y avisos preconstruidos sin salir de VSCode. [Instala la extensión aquí](https://marketplace.visualstudio.com/items?itemName=mintlify.mintlify-snippets). + + + + ## Mejoras de calidad + + * Mejoras del panel: visualiza los registros de actualizaciones para ver qué cambió y el estado de cada actualización; alterna entre proyectos de Mintlify para gestionar despliegues + * Versionado con pestañas totalmente compatible + * Redirecciones con comodín ahora compatibles + * Detección de errores en la CLI: ahora mostramos la posición del frontmatter no válido cuando hay problemas de parsing durante el desarrollo local + + + + ## Lo más destacado de la Launch Week + + * Despliegues de vista previa: cuando creas una pull request, generaremos un enlace único que muestra una vista previa en vivo de cómo se ve tu documentación en producción. Puedes compartir este enlace con tu equipo. + * Fragmentos V2: ahora admitimos componentes y variables completamente reutilizables para los Fragmentos. + * Motor MDX de código abierto: hemos expuesto dos API—getCompiledMdx y MDXComponent—para que puedas acceder al Markdown de Mintlify y al resaltado de sintaxis de código. [Las contribuciones al proyecto](https://github.com/mintlify/mdx) son bienvenidas. + * Insights de chat de IA: segmenta el historial de chat por fecha, aumenta la cuota del Chat de IA desde el panel y ve con qué frecuencia aparece una consulta específica. + \ No newline at end of file diff --git a/es/code.mdx b/es/code.mdx new file mode 100644 index 000000000..109054c1e --- /dev/null +++ b/es/code.mdx @@ -0,0 +1,365 @@ +--- +title: "Código" +description: "Mostrar código en línea y bloques de código" +icon: "code" +--- + +
+ ## Agregar ejemplos de código +
+ +Puedes agregar fragmentos de código en línea o bloques de código. Los bloques de código admiten opciones meta para el resaltado de sintaxis, títulos, resaltado de líneas, iconos y más. + +
+ ### Código en línea +
+ +Para marcar una `palabra` o `frase` como código, enciérrala entre comillas invertidas (`). + +```mdx +Para marcar una `palabra` o `frase` como código, enciérrala entre comillas invertidas (`). +``` + +
+ ### Bloques de código +
+ +Usa [bloques de código delimitados](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) encerrando el código entre tres comillas invertidas. Los bloques de código se pueden copiar y, si tienes el Asistente habilitado, los usuarios pueden pedir a la IA que explique el código. + +Especifica el lenguaje de programación para el resaltado de sintaxis y para habilitar opciones meta. Agrega cualquier opción meta, como un título o un icono, después del lenguaje. + +```java HelloWorld.java lines icon="java" +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +````mdx +```java HelloWorld.java lines icon="java" +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` +```` + +
+ ## Opciones de bloques de código +
+ +Puedes agregar opciones meta a tus bloques de código para personalizar su apariencia. + + + Debes especificar un lenguaje de programación para un bloque de código antes de agregar cualquier otra opción meta. + + +
+ ### Sintaxis de las opciones +
+ +* **Opciones de cadena y booleanas**: Envuelve con `""`, `''` o sin comillas. +* **Opciones de expresión**: Envuelve con `{}`, `""` o `''`. + +
+ ### Resaltado de sintaxis +
+ +Habilita el resaltado de sintaxis especificando el lenguaje de programación después de las comillas invertidas de apertura de un bloque de código. + +Usamos [Shiki](https://shiki.style/) para el resaltado de sintaxis y admitimos todos los lenguajes disponibles. Consulta la lista completa de [lenguajes](https://shiki.style/languages) en la documentación de Shiki. + +```java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +````mdx +```java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` +```` + +
+ ### Título +
+ +Agrega un título para tu ejemplo de código. Usa `title="Your title"` o una cadena en una sola línea. + +```javascript Code Block Example +const hello = "world"; +``` + +````mdx +```javascript Code Block Example +const hello = "world"; +``` +```` + +
+ ### Icono +
+ +Agrega un icono a tu bloque de código usando la propiedad `icon`. Consulta [Icons](/es/components/icons) para ver todas las opciones disponibles. + +```javascript icon="square-js" +const hello = "world"; +``` + +````mdx +```javascript icon="square-js" +const hello = "world"; +``` +```` + +
+ ### Resaltado de líneas +
+ +Resalta líneas específicas en tus bloques de código usando `highlight` con los números o rangos de líneas que deseas resaltar. + +```javascript Line Highlighting Example highlight= {1-2,5} +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` + +````mdx +```javascript Line Highlighting Example highlight={1-2,5} +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` +```` + +
+ ### Enfoque de líneas +
+ +Enfoca líneas específicas en tus bloques de código usando `focus` con números o rangos de líneas. + +```javascript Line Focus Example focus= {2,4-5} +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` + +````mdx +```javascript Line Focus Example focus={2,4-5} +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` +```` + +
+ ### Mostrar números de línea +
+ +Muestra los números de línea en el lado izquierdo de tu bloque de código usando `lines`. + +```javascript Show Line Numbers Example lines +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` + +````mdx +```javascript Show Line Numbers Example lines +const greeting = "Hello, World!"; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` +```` + +
+ ### Expandible +
+ +Permite que los usuarios expandan y contraigan bloques de código largos usando `expandable`. + +```python Expandable Example expandable +from datetime import datetime, timedelta +from typing import Dict, List, Optional +from dataclasses import dataclass + +@dataclass +class Book: + title: str + author: str + isbn: str + checked_out: bool = False + due_date: Optional[datetime] = None + +class Library: + def __init__(self): + self.books: Dict[str, Book] = {} + self.checkouts: Dict[str, List[str]] = {} # usuario -> lista de ISBN + + def add_book(self, book: Book) -> None: + if book.isbn in self.books: + raise ValueError(f"Ya existe un libro con el ISBN {book.isbn}") + self.books[book.isbn] = book + + def checkout_book(self, isbn: str, patron: str, days: int = 14) -> None: + if patron not in self.checkouts: + self.checkouts[patron] = [] + + book = self.books.get(isbn) + if not book: + raise ValueError("Libro no encontrado") + + if book.checked_out: + raise ValueError("El libro ya está retirado") + + if len(self.checkouts[patron]) >= 3: + raise ValueError("El usuario alcanzó el límite de préstamos") + + book.checked_out = True + book.due_date = datetime.now() + timedelta(days=days) + self.checkouts[patron].append(isbn) + + def return_book(self, isbn: str) -> float: + book = self.books.get(isbn) + if not book or not book.checked_out: + raise ValueError("Libro no encontrado o no retirado") + + late_fee = 0.0 + if datetime.now() > book.due_date: + days_late = (datetime.now() - book.due_date).days + late_fee = days_late * 0.50 + + book.checked_out = False + book.due_date = None + + # Quitar de los préstamos del usuario + for patron, books in self.checkouts.items(): + if isbn in books: + books.remove(isbn) + break + + return late_fee + + def search(self, query: str) -> List[Book]: + query = query.lower() + return [ + book for book in self.books.values() + if query in book.title.lower() or query in book.author.lower() + ] + +def main(): + library = Library() + + # Agregar algunos libros + books = [ + Book("The Hobbit", "J.R.R. Tolkien", "978-0-261-10295-4"), + Book("1984", "George Orwell", "978-0-452-28423-4"), + ] + + for book in books: + library.add_book(book) + + # Ejemplo de préstamo y devolución + library.checkout_book("978-0-261-10295-4", "patron123") + late_fee = library.return_book("978-0-261-10295-4") + print(f"Recargo por demora: ${late_fee:.2f}") + +if __name__ == "__main__": + main() +``` + +````mdx +```python Expandable Example expandable +from datetime import datetime, timedelta +from typing import Dict, List, Optional +from dataclasses import dataclass + +# ... + +if __name__ == "__main__": + main() +``` +```` + +
+ ### Ajuste +
+ +Activa el ajuste de texto para líneas largas usando `wrap`. Esto evita el desplazamiento horizontal y facilita la lectura de líneas extensas. + +```javascript Wrap Example wrap +const greeting = "Hello, World! I am a long line of text that will wrap to the next line."; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` + +````mdx +```javascript Wrap Example wrap +const greeting = "Hello, World! I am a long line of text that will wrap to the next line."; +function sayHello() { + console.log(greeting); +} +sayHello(); +``` +```` + +
+ ### Diff +
+ +Muestra un diff visual de líneas agregadas o eliminadas en tus bloques de código. Las líneas agregadas se resaltan en verde y las eliminadas en rojo. + +Para crear diffs, añade estos comentarios especiales al final de las líneas en tu bloque de código: + +* `// [!code ++]`: marca una línea como agregada (resaltado en verde). +* `// [!code --]`: marca una línea como eliminada (resaltado en rojo). + +Para varias líneas consecutivas, especifica el número de líneas después de dos puntos: + +* `// [!code ++:3]`: marca la línea actual más las dos siguientes como agregadas. +* `// [!code --:5]`: marca la línea actual más las cuatro siguientes como eliminadas. + +La sintaxis de comentarios debe coincidir con tu lenguaje de programación (por ejemplo, `//` para JavaScript o `#` para Python). + +```js Diff Example icon="code" lines +const greeting = "Hello, World!"; // [!code ++] +function sayHello() { + console.log("Hello, World!"); // [!code --] + console.log(greeting); // [!code ++] +} +sayHello(); +``` + +````text +```js Diff Example icon="code" lines +const greeting = "Hello, World!"; // [!code ++] +function sayHello() { + console.log("Hello, World!"); // [!code --] + console.log(greeting); // [!code ++] +} +sayHello(); +``` +```` \ No newline at end of file diff --git a/es/components/accordions.mdx b/es/components/accordions.mdx new file mode 100644 index 000000000..f7ae43ea6 --- /dev/null +++ b/es/components/accordions.mdx @@ -0,0 +1,114 @@ +--- +title: "Acordeones" +description: "Componentes desplegables para mostrar y ocultar contenido" +icon: "chevron-down" +--- + +import IconsOptional from "/snippets/es/icons-optional.mdx"; + +Los acordeones permiten a los usuarios desplegar y contraer secciones de contenido. Usa acordeones para la divulgación progresiva y para organizar la información. + + + +
+ ## Acordeón individual +
+ + + Puedes incluir cualquier contenido aquí, incluidos otros componentes, como código: + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + + +````mdx Accordion example + + Puedes incluir cualquier contenido aquí, incluidos otros componentes, como código: + + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + +```` + + + +
+ ## Grupos de acordeones +
+ +Agrupa acordeones relacionados con ``. Esto crea una sección coherente de acordeones que se pueden expandir o contraer individualmente. + + + + Puedes incluir otros componentes dentro de los acordeones. + + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + + + + Añade iconos para que los acordeones sean más distintivos y fáciles de explorar visualmente. + + + + Mantén el contenido relacionado organizado en grupos. + + + +````mdx Accordion Group Example + + + You can put other components inside Accordions. + + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + + + + Add icons to make accordions more visually distinct and scannable. + + + + Keep related content organized into groups. + + +```` + + + +
+ ## Propiedades +
+ + + Título en la vista previa del Accordion. + + + + Detalle debajo del título en la vista previa del Accordion. + + + + Indica si el Accordion está abierto de forma predeterminada. + + + diff --git a/es/components/banner.mdx b/es/components/banner.mdx new file mode 100644 index 000000000..2d65d29e0 --- /dev/null +++ b/es/components/banner.mdx @@ -0,0 +1,44 @@ +--- +title: "Banner" +description: "Añade un banner para mostrar anuncios y notificaciones importantes en todo el sitio" +icon: "layout-panel-top" +--- + +Usa banners para mostrar anuncios, actualizaciones o notificaciones importantes en todo tu sitio de documentación. Los banners aparecen en la parte superior de cada página, admiten formato Markdown y pueden hacerse descartables. + +Para añadir un banner, usa la propiedad `banner` en tu `docs.json`: + + + ```json Product announcements wrap + "banner": { + "content": "🚀 ¡La versión 2.0 ya está disponible! Consulta nuestro [registro de cambios](/changelog) para más detalles.", + "dismissible": true + } + ``` + + ```json Maintenance notices wrap + "banner": { + "content": "⚠️ Mantenimiento programado: la API no estará disponible el 15 de diciembre, de 2 a 4 a. m. UTC", + "dismissible": false + } + ``` + + ```json Required actions wrap + "banner": { + "content": "**Acción requerida:** Migra a nuestra nueva versión antes del 1 de enero. [Guía de migración](/migration)", + "dismissible": true + } + ``` + + +
+ ## Propiedades +
+ + + El mensaje del banner. Admite texto sin formato y Markdown. + + + + Indica si los usuarios pueden descartar el banner. Cuando `true`, los usuarios pueden cerrar el banner y no volverá a aparecer durante su sesión. El valor predeterminado es `false`. + \ No newline at end of file diff --git a/es/components/callouts.mdx b/es/components/callouts.mdx new file mode 100644 index 000000000..6e1d73197 --- /dev/null +++ b/es/components/callouts.mdx @@ -0,0 +1,49 @@ +--- +title: "Avisos" +description: "Usa avisos para añadir contexto llamativo a tu contenido" +icon: 'info' +--- + +Los avisos pueden tener estilo de Nota, Advertencia, Información, Consejo, Aprobado, Peligro o puedes crear tu propio aviso: + +Esto añade una nota en el contenido + +```mdx +Esto añade una nota en el contenido +``` + +Esto genera una advertencia que debes tener en cuenta + +```mdx +Esto genera una advertencia que debes tener en cuenta +``` + +Esto destaca información importante + +```mdx +Destaca información importante +``` + +Este es un consejo útil + +```mdx +Este es un consejo útil +``` + +Esto nos da un estado marcado como verificado + +```mdx +Esto nos da un estado verificado +``` + +Este es un aviso de advertencia + +```mdx +Este es un llamado de atención de peligro +``` + + Este es un destacador personalizado + +```mdx ajustar +Este es un aviso personalizado +``` diff --git a/es/components/cards.mdx b/es/components/cards.mdx new file mode 100644 index 000000000..332b54a3e --- /dev/null +++ b/es/components/cards.mdx @@ -0,0 +1,146 @@ +--- +title: "Tarjetas" +description: "Destaca puntos clave o enlaces con diseños e íconos personalizables" +icon: "square-mouse-pointer" +--- + +import IconsOptional from "/snippets/es/icons-optional.mdx"; + +Usa tarjetas para crear contenedores visuales de contenido. Las tarjetas son contenedores flexibles que pueden incluir texto, íconos, imágenes y enlaces. + +
+ ## Tarjeta básica +
+ + + Así es como se usa una tarjeta con un ícono y un enlace. Al hacer clic en esta tarjeta, + irás a la página Columns. + + +```mdx Card example + + Así es como se usa una tarjeta con un ícono y un enlace. Al hacer clic en esta tarjeta, + irás a la página Columns. + +``` + +
+ ## Variaciones de tarjetas +
+ +Las tarjetas ofrecen varias opciones de diseño y estilo para adaptarse a distintas necesidades de contenido. + +
+ ### Diseño horizontal +
+ +Añade la propiedad `horizontal` para mostrar tarjetas en un diseño horizontal más compacto. + + + Este es un ejemplo de una tarjeta horizontal. + + +```mdx Horizontal card example + + This is an example of a horizontal card. + +``` + +
+ ### Tarjetas con imagen +
+ +Añade la propiedad `img` para mostrar una imagen en la parte superior de la tarjeta. + + + Este es un ejemplo de una tarjeta con imagen. + + +```mdx Image card example + + This is an example of a card with an image. + +``` + + + +Puedes personalizar el texto de la llamada a la acción y controlar si aparece una flecha. De forma predeterminada, las flechas solo se muestran en los enlaces externos. + + + Este es un ejemplo de una tarjeta con un ícono y un enlace. Al hacer clic en esta tarjeta, irás a la página Columns. + + +```mdx Link card example + + This is an example of a card with an icon and a link. Clicking on this card brings you to the Columns page. + +``` + +
+ ## Agrupar tarjetas +
+ +Usa el [componente Columns](/es/components/columns) para organizar varias tarjetas lado a lado. + + + + Esta es la primera tarjeta. + + + + Esta es la segunda tarjeta. + + + +```mdx Ejemplo de Columns + + + Esta es la primera tarjeta. + + + Esta es la segunda tarjeta. + + +``` + +
+ ## Propiedades +
+ + + El título que se muestra en la tarjeta + + + + + + Color del icono como código hexadecimal (p. ej., `#FF6B6B`). + + + + URL a la que navegar cuando se hace clic en la tarjeta. + + + + Mostrar la tarjeta en un diseño horizontal compacto. + + + + URL o ruta local de una imagen que se muestra en la parte superior de la tarjeta. + + + + Texto personalizado para el botón de acción. + + + + Mostrar u ocultar el icono de flecha del enlace. + diff --git a/es/components/code-groups.mdx b/es/components/code-groups.mdx new file mode 100644 index 000000000..4ffc4093a --- /dev/null +++ b/es/components/code-groups.mdx @@ -0,0 +1,106 @@ +--- +title: "Grupos de código" +description: "Muestra varios ejemplos de código en un mismo componente" +icon: "group" +--- + +Usa el componente `CodeGroup` para mostrar varios bloques de código en una interfaz con pestañas, lo que permite a los usuarios comparar implementaciones en distintos lenguajes de programación o ver enfoques alternativos para la misma tarea. + + + +```javascript helloWorld.js +console.log("Hello World"); +``` + +```python hello_world.py +print('Hello World!') +``` + +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + + + + + +
+ ## Creación de grupos de código +
+ +Para crear un grupo de código, envuelve varios bloques de código con etiquetas ``. Cada bloque de código debe incluir un título, que se usará como etiqueta de pestaña. + +````mdx + + +```javascript helloWorld.js +console.log("Hello World"); +``` + +```python hello_world.py +print('Hello World!') +``` + +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + + +```` + + + +
+ ## Menú desplegable de idiomas +
+ +Puedes sustituir las pestañas de un grupo de código por un menú desplegable para alternar entre idiomas usando la prop `dropdown`. + + + +```javascript helloWorld.js +console.log("Hello World"); +``` + +```python hello_world.py +print('Hello World!') +``` + +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + + + +````mdx highlight=1 + + +```javascript helloWorld.js +console.log("Hello World"); +``` + +```python hello_world.py +print('Hello World!') +``` + +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +```` diff --git a/es/components/columns.mdx b/es/components/columns.mdx new file mode 100644 index 000000000..fc40cbf3c --- /dev/null +++ b/es/components/columns.mdx @@ -0,0 +1,38 @@ +--- +title: 'Columnas' +description: 'Muestra tarjetas lado a lado en un formato de cuadrícula' +icon: 'columns-2' +keywords: ['grupos de tarjetas'] +--- + +El componente `Columns` te permite agrupar varios componentes `Card`. Se utiliza con mayor frecuencia para colocar tarjetas en una cuadrícula especificando el número de columnas. + + + + Configura tu proyecto con nuestra guía de inicio rápido. + + + + Explora endpoints, parámetros y ejemplos para tu API. + + + +```mdx Ejemplo de Columns + + + Configura tu proyecto con nuestra guía de inicio rápido. + + + Explora endpoints, parámetros y ejemplos de tu API. + + +``` + + +
+ ## Propiedades +
+ + + Número de columnas por fila. + \ No newline at end of file diff --git a/es/components/examples.mdx b/es/components/examples.mdx new file mode 100644 index 000000000..2aa093c76 --- /dev/null +++ b/es/components/examples.mdx @@ -0,0 +1,64 @@ +--- +title: "Ejemplos" +description: "Muestra bloques de código en la barra lateral derecha en equipos de escritorio" +icon: 'between-horizontal-start' +--- + +Los componentes `` y `` muestran bloques de código en la barra lateral derecha para crear un diseño de dos columnas que mantiene los ejemplos visibles mientras los usuarios se desplazan por tu contenido. Estos componentes están pensados para la documentación de API, pero funcionan en todas las páginas. + +Casos de uso comunes: + +* Documentación de endpoints de API con ejemplos de solicitud y respuesta +* Ejemplos de configuración junto con texto explicativo +* Fragmentos de código que los usuarios consultan mientras siguen instrucciones +* Ejemplos de “antes y después” en tutoriales + +En dispositivos móviles, los componentes `` y `` se muestran como bloques de código normales y se pueden desplazar. + + + ```bash Request + curl --request POST \ + --url https://dog-api.kinduff.com/api/facts + ``` + + + + ```json Response + { "status": "success" } + ``` + + +
+ ## RequestExample +
+ +Usa `` para anclar ejemplos de código en la barra lateral derecha. Este componente funciona de forma similar al componente [CodeGroup](/es/components/code-groups), pero muestra el código en la barra lateral en lugar de en línea. + +Puedes incluir varios bloques de código dentro de un solo ``. Cada bloque de código debe tener un atributo title. + +````mdx EjemploDeSolicitud + + +```bash Solicitud + curl --request POST \ + --url https://dog-api.kinduff.com/api/facts +``` + + +```` + +
+ ## ResponseExample +
+ +El componente `` fija ejemplos de código en la barra lateral derecha, debajo de cualquier contenido `` en la misma página. + +````mdx EjemploDeRespuesta + + +```json Respuesta +{ "status": "success" } +``` + + +```` diff --git a/es/components/expandables.mdx b/es/components/expandables.mdx new file mode 100644 index 000000000..f446fc928 --- /dev/null +++ b/es/components/expandables.mdx @@ -0,0 +1,49 @@ +--- +title: "Desplegables" +description: "Alternar para mostrar propiedades anidadas" +icon: "list-tree" +--- + +Usa desplegables para mostrar y ocultar contenido anidado dentro de los campos de respuesta. Los desplegables son especialmente útiles para mostrar propiedades complejas de objetos en la documentación de API. + + + + + + El nombre completo del usuario + + + + Si el usuario tiene más de 21 años + + + + + +```mdx Expandable example + + + + El nombre completo del usuario + + + + Si el usuario tiene más de 21 años + + + +``` + + + +
+ ## Propiedades +
+ + + El nombre del objeto que se mostrará. + + + + Configúrelo en `true` para que el panel expandible se abra al cargar la página. + diff --git a/es/components/fields.mdx b/es/components/fields.mdx new file mode 100644 index 000000000..64054b717 --- /dev/null +++ b/es/components/fields.mdx @@ -0,0 +1,108 @@ +--- +title: "Campos" +description: "Configura parámetros para tus referencias de API o SDK" +icon: "letter-text" +--- + +Utiliza campos para documentar parámetros y respuestas de la API. Hay dos tipos de campos: de parámetro y de respuesta. + +
+ ## Campo de parámetro +
+ +El componente `` se utiliza para definir parámetros para tus API o SDK. Al agregar un `ParamField` se añade automáticamente un [Área de pruebas de API](/es/api-playground/overview). + + + Un ejemplo de un campo de parámetro + + +```mdx + + Un ejemplo de un campo de parámetro + +``` + +
+ ### Propiedades +
+ + + Indica si el parámetro es de tipo query, path, body o header. Luego se especifica el + nombre del parámetro. + + + + Tipo esperado del valor del parámetro. + + Admite `number`, `string`, `boolean`, `object`. + + Los arreglos se pueden definir usando el sufijo `[]`. Por ejemplo, `string[]`. + + + + Indica si el parámetro es obligatorio. + + + + Indica si el parámetro está en desuso. + + + + Valor predeterminado que se establece cuando el valor de la solicitud está vacío + + + + Texto del placeholder para la entrada en el área de pruebas. + + + + Descripción del parámetro (con soporte para Markdown). + + +
+ ## Campo de respuesta +
+ +El componente `` define los valores de retorno de una API. + + + Un ejemplo de campo de respuesta + + +```mdx + + Un ejemplo de campo de respuesta + +``` + +
+ ### Propiedades +
+ + + El nombre del valor de respuesta. + + + + Tipo esperado del valor de respuesta. Puede ser cualquier cadena arbitraria. + + + + El valor predeterminado. + + + + Indica si el campo es obligatorio. + + + + Indica si el campo está obsoleto. + + + + Etiquetas que se muestran antes del nombre del campo. + + + + Etiquetas que se muestran después del nombre del campo. + diff --git a/es/components/frames.mdx b/es/components/frames.mdx new file mode 100644 index 000000000..db3c2b2b8 --- /dev/null +++ b/es/components/frames.mdx @@ -0,0 +1,44 @@ +--- +title: "Marcos" +description: "Envuelve imágenes u otros componentes en un contenedor" +icon: "frame" +--- + +Usa marcos para mostrar imágenes, diagramas u otro contenido visual con un estilo uniforme y leyendas opcionales. Los marcos centran el contenido y aportan separación visual respecto del texto circundante. + + + Fotografía de un lago rodeado de árboles, con montañas a lo lejos en el Parque Nacional de Yellowstone. + + +
+ ## Leyendas +
+ +Puedes añadir contexto adicional a una imagen usando la prop opcional `caption`. + + + Fotografía del valle de Yosemite. + + +
+ ## Propiedades +
+ + + Texto opcional de leyenda que se muestra centrado debajo de tu componente. + + + + +```mdx Frame + + Descriptive alt text + +``` + +```mdx Frame with a caption + + Descriptive alt text + +``` + \ No newline at end of file diff --git a/es/components/icons.mdx b/es/components/icons.mdx new file mode 100644 index 000000000..bbb0a028e --- /dev/null +++ b/es/components/icons.mdx @@ -0,0 +1,45 @@ +--- +title: "Iconos" +description: "Usa iconos de bibliotecas populares" +icon: "flag" +--- + +import IconsRequired from "/snippets/es/icons-required.mdx"; + +Usa iconos de Font Awesome, Lucide, SVG, URL externas o archivos de tu proyecto para mejorar tu documentación. + + + +```mdx Icon example + +``` + + + +
+ ## Iconos en línea +
+ +Los iconos se colocan en línea cuando se usan dentro de un párrafo. + + La documentación que quieres, sin esfuerzo. + +```markdown Inline icon example + La documentación que quieres, sin esfuerzo. +``` + + + +
+ ## Propiedades +
+ + + + + El color del ícono como código hexadecimal (por ejemplo, `#FF5733`). + + + + El tamaño del ícono en píxeles. + diff --git a/es/components/mermaid-diagrams.mdx b/es/components/mermaid-diagrams.mdx new file mode 100644 index 000000000..384cc3947 --- /dev/null +++ b/es/components/mermaid-diagrams.mdx @@ -0,0 +1,62 @@ +--- +title: "Mermaid" +description: "Muestra diagramas con Mermaid" +icon: "waypoints" +--- + +[Mermaid](https://mermaid.js.org/) te permite crear diagramas de flujo, diagramas de secuencia, diagramas de Gantt y otros diagramas usando texto y código. + +Para ver la lista completa de tipos de diagramas y su sintaxis admitida, consulta la [documentación de Mermaid](https://mermaid.js.org/intro/). + +```mermaid + flowchart LR + subgraph subgraph1 + direction TB + top1[top] --> bottom1[bottom] + end + subgraph subgraph2 + direction TB + top2[top] --> bottom2[bottom] + end + %% ^ Estos subgrafos son idénticos, excepto por los enlaces que apuntan a ellos: + + %% Enlace *a* subgraph1: se mantiene la dirección de subgraph1 + outside --> subgraph1 + %% Enlace *dentro* de subgraph2: + %% subgraph2 hereda la dirección del grafo de nivel superior (LR) + outside ---> top2 +``` + +````mdx Ejemplo de diagrama de flujo en Mermaid +```mermaid + flowchart LR + subgraph subgraph1 + direction TB + top1[top] --> bottom1[bottom] + end + subgraph subgraph2 + direction TB + top2[top] --> bottom2[bottom] + end + %% ^ Estos subgráficos son idénticos, excepto por los enlaces que apuntan a ellos: + + %% Enlace *a* subgraph1: se mantiene la dirección de subgraph1 + outside --> subgraph1 + %% Enlace *dentro de* subgraph2: + %% subgraph2 hereda la dirección del grafo de nivel superior (LR) + outside ---> top2 +``` +```` + + +
+ ## Sintaxis +
+ +Para crear un diagrama de Mermaid, escribe la definición del diagrama dentro de un bloque de código de Mermaid. + +````mdx +```mermaid +// Escribe aquí el código de tu diagrama de Mermaid +``` +```` diff --git a/es/components/panel.mdx b/es/components/panel.mdx new file mode 100644 index 000000000..05ed5b44e --- /dev/null +++ b/es/components/panel.mdx @@ -0,0 +1,21 @@ +--- +title: "Panel" +description: "Especifica el contenido del panel lateral derecho" +icon: "panel-right" +--- + +Puedes usar el componente `` para personalizar el panel lateral derecho de una página con cualquier componente que quieras. + +Si una página incluye un componente ``, los componentes [RequestExample](/es/components/examples#request-example) y [ResponseExample](/es/components/examples#response-example) deben estar dentro de ``. + +Los componentes dentro de un `` reemplazarán la tabla de contenidos de la página. + +```mdx + + Fija información en el panel lateral. O agrega cualquier otro componente. + +``` + + + Fija información en el panel lateral. O agrega cualquier otro componente. + diff --git a/es/components/responses.mdx b/es/components/responses.mdx new file mode 100644 index 000000000..3d0e83a3b --- /dev/null +++ b/es/components/responses.mdx @@ -0,0 +1,60 @@ +--- +title: 'Campos de respuesta' +description: 'Mostrar valores de respuesta de la API' +--- + +El componente `` está diseñado para definir los valores de retorno de una API. Muchas docs también usan `` en páginas cuando necesitas enumerar los tipos de algo. + + + Un ejemplo de campo de respuesta + + +```mdx + + Un ejemplo de campo de respuesta + +``` + + + +
+ ## Props +
+ + + El nombre del valor de la respuesta. + + + + Tipo esperado del valor de la respuesta; puede ser cualquier cadena arbitraria. + + + + El valor predeterminado. + + + + Mostrar "required" junto al nombre del campo. + + + + Indica si un campo está en desuso o no. + + + + Etiquetas que se muestran antes del nombre del campo + + + + Etiquetas que se muestran después del nombre del campo + + + + +```mdx Response Field Example + + Ejemplo de un campo de respuesta + +``` + + diff --git a/es/components/steps.mdx b/es/components/steps.mdx new file mode 100644 index 000000000..bed394ea5 --- /dev/null +++ b/es/components/steps.mdx @@ -0,0 +1,73 @@ +--- +title: "Steps" +description: "Secuencia contenido con el componente Steps" +icon: "list-todo" +--- + +import IconsOptional from "/snippets/es/icons-optional.mdx"; + +Usa Steps para mostrar una serie de acciones o eventos secuenciales. Puedes agregar tantos pasos como necesites. + + + + Estas son instrucciones o contenido que solo aplican al primer paso. + + + Estas son instrucciones o contenido que solo aplican al segundo paso. + + + Estas son instrucciones o contenido que solo aplican al tercer paso. + + + +```mdx Steps example + + + These are instructions or content that only pertain to the first step. + + + These are instructions or content that only pertain to the second step. + + + These are instructions or content that only pertain to the third step. + + +``` + + + +
+ ## Propiedades de Steps +
+ + + Una lista de componentes `Step`. + + + + El tamaño de los títulos del paso. Puede ser `p`, `h2` o `h3`. + + + + +
+ ## Propiedades individuales del paso +
+ + + El contenido de un paso, ya sea texto plano o componentes. + + + + + + El título es el texto principal del paso y aparece junto al indicador. + + + + El número del paso. + + + + El tamaño de los títulos del paso. Uno de `p`, `h2` o `h3`. + diff --git a/es/components/tabs.mdx b/es/components/tabs.mdx new file mode 100644 index 000000000..fa77f0f0a --- /dev/null +++ b/es/components/tabs.mdx @@ -0,0 +1,73 @@ +--- +title: "Pestañas" +description: "Alterna el contenido con el componente Tabs" +icon: "panel-top" +--- + +Usa pestañas para organizar contenido en varios paneles entre los que los usuarios pueden cambiar. Puedes agregar tantas pestañas como necesites e incluir otros componentes dentro de cada una. + + + + ☝️ Bienvenido al contenido que solo puedes ver dentro de la primera pestaña. + + Puedes agregar cualquier número de componentes dentro de las pestañas. Por ejemplo, un bloque de código: + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + + + ✌️ Aquí encontrarás contenido que solo aparece dentro de la segunda pestaña. + + ¡Esta tiene un icono ! + + + 💪 Aquí encontrarás contenido que solo aparece dentro de la tercera pestaña. + + + +````mdx Tabs example + + + ☝️ Welcome to the content that you can only see inside the first tab. + + You can add any number of components inside of tabs. For example, a code block: + ```java HelloWorld.java + class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } + } + ``` + + + ✌️ Here's content that's only inside the second tab. + + This one has a icon! + + + 💪 Here's content that's only inside the third tab. + + +```` + + + +
+ ## Propiedades +
+ + + El título de la pestaña. Los títulos cortos facilitan la navegación. + + + + Un icono de [Font Awesome](https://fontawesome.com/icons), un icono de [Lucide](https://lucide.dev/icons), una URL a un icono o una ruta relativa a un icono. + + + + Solo para iconos de Font Awesome: uno de `regular`, `solid`, `light`, `thin`, `sharp-solid`, `duotone`, `brands`. + diff --git a/es/components/tooltips.mdx b/es/components/tooltips.mdx new file mode 100644 index 000000000..48b0621ad --- /dev/null +++ b/es/components/tooltips.mdx @@ -0,0 +1,29 @@ +--- +title: "Tooltips" +description: "Muestra una definición al pasar el cursor sobre el texto" +icon: "message-square" +--- + +Usa los tooltips para proporcionar contexto adicional o definiciones cuando un usuario pasa el cursor sobre un fragmento de texto. Los tooltips pueden incluir enlaces opcionales con llamadas a la acción. + +**Ejemplo**: API La documentación ayuda a los desarrolladores a entender cómo integrarse con tu servicio. + +```mdx Ejemplo de ajuste de tooltip +La documentación de la API ayuda a los desarrolladores a entender cómo integrarse con tu servicio. +``` + +
+ ## Propiedades +
+ + + El texto que se muestra en el globo de ayuda. + + + + El texto del llamado a la acción para un enlace dentro del globo de ayuda. + + + + URL del enlace del llamado a la acción. Obligatorio cuando se utiliza `cta`. + \ No newline at end of file diff --git a/es/components/update.mdx b/es/components/update.mdx new file mode 100644 index 000000000..9bb85e5ce --- /dev/null +++ b/es/components/update.mdx @@ -0,0 +1,51 @@ +--- +title: "Actualización" +description: "Sigue los cambios y actualizaciones" +icon: "list-collapse" +--- + +Usa el componente `Update` para mostrar entradas del registro de cambios, actualizaciones de versión y notas de lanzamiento con un formato coherente. + + + ## Actualización de ejemplo + + Puedes añadir cualquier cosa aquí, como una captura de pantalla, un fragmento de código o una lista de cambios. + + + + + + ### Novedades + + * Diseño adaptable + * Ancla para cada actualización + * Entrada de RSS generada para cada actualización + + +
+ ## Cómo usar +
+ +```mdx Update example + + Esta es una actualización con una etiqueta, una descripción y una etiqueta. + +``` + +Usa varios componentes `Update` para crear [registros de cambios](/es/guides/changelogs). + +
+ ## Props +
+ + + Etiqueta de la actualización. Aparece a la izquierda de la actualización y crea un enlace ancla. Las etiquetas deben ser únicas. + + + + Etiquetas de la actualización. Se muestran como filtros en el panel lateral derecho. + + + + Descripción de la actualización. Aparece debajo de la etiqueta y las etiquetas. + diff --git a/es/contact-support.mdx b/es/contact-support.mdx new file mode 100644 index 000000000..0ed6a96bd --- /dev/null +++ b/es/contact-support.mdx @@ -0,0 +1,35 @@ +--- +title: "Contactar con soporte" +icon: "circle-help" +description: "Estamos aquí para ayudarte a sacar el máximo partido a Mintlify" +--- + +
+ ## Consulta nuestra documentación +
+ +Selecciona Command + I para iniciar un chat con nuestro Asistente de IA entrenado con nuestra documentación. + +
+ ## Mira tutoriales en video +
+ +Visita nuestro canal de [YouTube](https://www.youtube.com/@GetMintlify/videos) para encontrar tutoriales y guías sobre el uso de Mintlify. + +
+ ## Soporte por mensaje +
+ +Envíanos un mensaje desde tu [panel](https://dashboard.mintlify.com/) seleccionando **Support** en la barra lateral. + +![GIF que muestra cómo acceder al soporte desde el panel al seleccionar el botón Support, luego elegir una opción y escribir una pregunta en la ventana modal de soporte que aparece.](https://mintlify.s3.us-west-1.amazonaws.com/mintlify/images/support-flow.gif) + + +Nuestro objetivo es responder a todas las solicitudes en un plazo de 24 horas, pero pueden producirse demoras en períodos de alta demanda. + + +
+ ## Soporte por correo electrónico +
+ +Si no puedes acceder a tu panel, escríbenos a support@mintlify.com. \ No newline at end of file diff --git a/es/editor/branches.mdx b/es/editor/branches.mdx new file mode 100644 index 000000000..0383ce827 --- /dev/null +++ b/es/editor/branches.mdx @@ -0,0 +1,42 @@ +--- +title: "Trabajo con ramas" +description: "Usa ramas para realizar y revisar cambios sin afectar tu documentación publicada" +--- + +Las ramas son una función del control de versiones que señalan commits específicos en tu repositorio. Tu rama de despliegue, normalmente llamada `main`, representa el contenido con el que se construye tu documentación publicada. Todas las demás ramas son independientes de tu documentación en producción, a menos que decidas fusionarlas en tu rama de despliegue. + +Las ramas te permiten crear instancias separadas de tu documentación para realizar cambios, solicitar revisiones y probar nuevos enfoques antes de publicar. Tu equipo puede trabajar en ramas para actualizar diferentes partes de la documentación al mismo tiempo sin afectar lo que ven los usuarios en el sitio en producción hasta que publiques los cambios. + +Recomendamos trabajar siempre con ramas al actualizar la documentación para mantener estable el sitio en producción y habilitar flujos de trabajo de revisión. + + + - Nombra las ramas de forma clara para que tus compañeros entiendan en qué estás trabajando. + - Elimina las ramas después de fusionarlas para mantener organizado tu repositorio. + - Informa a tu equipo cuando trabajes en cambios importantes que puedan afectar su trabajo. + + +
+ ## Crear una rama +
+ +1. Selecciona el nombre de la rama en la barra de herramientas del editor (normalmente `main` de forma predeterminada). +2. Selecciona **New Branch**. +3. Ingresa un nombre descriptivo para tu rama, como `update-getting-started` o `fix-api-examples`. +4. Selecciona **Create Branch**. + +
+ ## Guardar cambios en una rama +
+ +Para guardar los cambios en una rama, selecciona el botón **Save Changes** en la esquina superior derecha del editor. Esto crea un commit y envía tu trabajo a tu rama. + +
+ ## Cambiar de rama +
+ +1. Selecciona el nombre de la rama en la barra de herramientas del editor. +2. Selecciona en el menú desplegable la rama a la que quieres cambiar. + + + Los cambios sin guardar se perderán al cambiar de rama. Asegúrate de guardar o publicar tu trabajo antes de cambiar de rama. + \ No newline at end of file diff --git a/es/editor/content-management.mdx b/es/editor/content-management.mdx new file mode 100644 index 000000000..be837ecfa --- /dev/null +++ b/es/editor/content-management.mdx @@ -0,0 +1,121 @@ +--- +title: "Administración de contenido" +description: "Crea, edita y organiza tus páginas de documentación" +--- + + + +Usa el explorador de archivos de la barra lateral para navegar por tus archivos de documentación. Haz clic en cualquier archivo para abrirlo en el editor. + +Pulsa Command + P (Ctrl + P en Windows) para buscar archivos por nombre. + +
+ ## Crear nuevas páginas +
+ + + + Selecciona el icono **Create a new file** en la barra lateral del explorador de archivos. + + Menú de archivos en el editor web + Menú de archivos en el editor web en modo oscuro + + + Los nombres de archivo deben terminar en `.mdx`. Por ejemplo, `api-reference.mdx` o `getting-started.mdx`. + + + Presiona Enter para crear el archivo. Se abrirá automáticamente en el editor, listo para agregar contenido. + + + +
+ ## Organiza tu navegación +
+ +Añade nuevas páginas a la navegación de tu sitio editando el archivo `docs.json`. + + + + Busca y abre el archivo `docs.json` en el directorio raíz usando el explorador de archivos. + + + Ubica la sección del archivo `docs.json` donde quieres añadir la nueva página. + + + Inserta el nombre de archivo de la página (sin la extensión `.mdx`) en el array `pages` del grupo correspondiente. + + + +
+ ### Ejemplo: agregar una página de temas +
+ +```json title="Agregar una página de temas al grupo Profile" highlight="18" +{ + "navigation": { + "groups": [ + { + "group": "Introducción", + "pages": [ + "index", + "quickstart", + "installation" + ] + }, + { + "group": "Perfil", + "pages": [ + "settings", + "account-types", + "dashboard", + "themes" + ] + } + ] + } +} +``` + + +
+ ## Edición de contenido +
+ +Haz cambios en tus páginas usando el modo visual o el modo Markdown en el editor. + +En el modo visual, presiona / para abrir el menú de componentes. Agrega bloques de contenido, avisos, bloques de código y otros componentes para personalizar tu documentación. + + + El menú de componentes desplegado resaltado en el editor web de Mintlify + El menú de componentes desplegado resaltado en el editor web de Mintlify + + +En el modo Markdown, puedes editar directamente el `MDX` de tus páginas. Esto puede ser útil cuando necesitas: + +- Definir propiedades específicas de los componentes +- Trabajar con componentes anidados complejos +- Copiar y pegar contenido `MDX` de otras fuentes \ No newline at end of file diff --git a/es/editor/getting-started.mdx b/es/editor/getting-started.mdx new file mode 100644 index 000000000..25f634fd4 --- /dev/null +++ b/es/editor/getting-started.mdx @@ -0,0 +1,92 @@ +--- +title: "Primeros pasos con el editor web" +sidebarTitle: "Primeros pasos" +description: "Aprende a crear y editar documentación con el editor web" +--- + +Interfaz del editor web de Mintlify en modo claro + +Interfaz del editor web de Mintlify en modo oscuro + +El editor web es una interfaz visual para crear, editar y revisar documentación directamente en tu navegador. + +* **Edición visual**: Realiza cambios en tu documentación usando un editor WYSIWYG (lo que ves es lo que obtienes) que muestra cómo se verá tu contenido al publicarse. +* **Sincronización con Git**: Todos los cambios se sincronizan automáticamente con tu repositorio de Git para mantener el control de versiones. +* **Colaboración en equipo**: Varias personas pueden trabajar en la documentación simultáneamente. +* **Integración de componentes**: Agrega notas, bloques de código y otros componentes con comandos de barra. +* **Sin configuración**: Comienza a escribir de inmediato desde tu panel. + +
+ ## Flujo de trabajo del editor web +
+ +Así es como normalmente trabajarás en el editor web: + + + + Crea una rama o realiza cambios directamente en la rama de despliegue. Recomendamos crear una rama para poder previsualizar los cambios antes de publicarlos. + + + + Ve a un archivo existente en la barra lateral o crea uno nuevo con el explorador de archivos. + + + + Realiza cambios en el editor web. Prueba alternar entre el modo visual y el modo Markdown con el conmutador de la esquina superior derecha para ver qué modo prefieres. + + + + El modo visual muestra cómo se verán tus cambios en el sitio en producción. Úsalo para verificar que todo se vea correcto. + + + + Si estás trabajando en la rama de despliegue, publica los cambios directamente desde el editor web. En otras ramas, crea una pull request para revisión antes de publicar. + + + +
+ ## Modos del editor +
+ +El editor web tiene dos modos para adaptarse a distintas preferencias y necesidades de edición. Usa el conmutador en la esquina superior derecha de la barra de herramientas del editor para cambiar entre modos de edición. + + + Iconos del conmutador de modo resaltados en el editor web. + + Iconos del conmutador de modo resaltados en el editor web. + + +
+ ### Modo visual +
+ +El modo visual ofrece una experiencia WYSIWYG en la que los cambios que realices en el editor serán los que se publiquen en tu sitio de documentación. Este modo es ideal cuando quieres ver en tiempo real cómo se verán tus cambios. + +Pulsa `/` para abrir el menú de componentes y añadir contenido con estilo, avisos, fragmentos de código u otros componentes. + + + Modo de edición visual en el editor web de Mintlify + + Modo de edición visual en el editor web de Mintlify + + +
+ ### Modo Markdown +
+ +El modo Markdown ofrece acceso directo al código `MDX` subyacente de tu documentación. Este modo es ideal cuando necesitas un control preciso de las propiedades de los componentes o cuando prefieres escribir con sintaxis Markdown. + + + Modo Markdown en el editor web de Mintlify + + Modo Markdown en el editor web de Mintlify + + +
+ ## Próximos pasos +
+ +* Aprende los conceptos fundamentales de [Git](/es/editor/git-concepts). +* Aprende las prácticas recomendadas para colaborar con [ramas](/es/editor/branches). +* Explora la [gestión de contenido](/es/editor/content-management) con el editor web. +* Comprende las [opciones de publicación](/es/editor/publishing) para distintos escenarios. \ No newline at end of file diff --git a/es/editor/git-concepts.mdx b/es/editor/git-concepts.mdx new file mode 100644 index 000000000..5439f2a16 --- /dev/null +++ b/es/editor/git-concepts.mdx @@ -0,0 +1,66 @@ +--- +title: "Conceptos de Git" +description: "Aprende los fundamentos de Git para el flujo de trabajo de docs-as-code" +--- + +Git es un sistema de control de versiones que te permite realizar un seguimiento de los cambios en tu documentación y colaborar con los miembros del equipo. Con Git, para cada archivo de tu proyecto puedes ver qué cambió, cuándo y por qué. Git también facilita volver a versiones anteriores de los archivos si alguna vez lo necesitas. + +El editor web realiza algunas operaciones de Git en segundo plano. Comprender estos conceptos te ayudará a trabajar de forma más efectiva con el editor web y a colaborar con los miembros del equipo que trabajan en sus entornos de desarrollo locales. + +
+ ## Conceptos clave de Git +
+ + + + El origen de tu documentación, donde se almacenan todos los archivos y su historial. El Editor web se conecta a tu repositorio para acceder al contenido y modificarlo. + + + + Una instantánea guardada de tus cambios en un momento específico. Cada commit incluye un mensaje que describe lo que cambió y crea un registro permanente en el historial de tu proyecto. + + + + Una rama apunta a un commit específico en tu repositorio. Tu documentación en producción se construye a partir de una rama de despliegue. Puedes tener cualquier número de otras ramas con cambios que aún no se han publicado en tu documentación en producción. Si quieres incorporar los cambios de una rama a tu documentación en producción, puedes fusionarla en tu rama de despliegue mediante una pull request. + + Usa ramas para trabajar en cambios sin afectar tu documentación en producción, experimentar de forma segura con nuevas funciones y obtener revisiones antes de publicar. + + + + La rama principal de tu proyecto desde la cual se construye el contenido de tu documentación en producción. Los cambios en esta rama se publican automáticamente en tu sitio de documentación. A menudo se llama `main`, pero puedes establecer cualquier rama como tu rama de despliegue. + + + + Una forma de proponer fusionar tus cambios en una rama con tu documentación en producción. Permite revisión y debate antes de que los cambios se publiquen. Comúnmente llamada PR, y también llamada merge request en GitLab. + + + + Un diff (o diferencia) muestra los cambios entre dos versiones de un archivo. Al revisar pull requests, los diffs resaltan lo que se ha añadido, eliminado o modificado, lo que facilita identificar qué cambió. + + + +
+ ## Cómo el editor web utiliza Git +
+ +El editor web se conecta a tu repositorio de Git mediante la [aplicación de GitHub](/es/settings/github) o la [integración de GitLab](/es/settings/gitlab) y automatiza operaciones comunes de Git. + +Cuando: + +* **Abres un archivo**: el editor obtiene la versión más reciente de tu repositorio, asegurando que siempre trabajes con contenido actualizado. +* **Realizas cambios**: el editor registra tus cambios como un borrador que puede convertirse en un commit cuando estés listo para guardar tu trabajo. +* **Guardas los cambios**: el editor crea un commit con tus cambios, preservando tu trabajo en el historial del proyecto. +* **Creas una rama**: el editor crea una nueva rama en tu repositorio que puede ser utilizada por cualquier persona con acceso para colaborar y revisar cambios. +* **Publicas en tu rama de despliegue**: el editor hace commit y push directamente a tu rama de despliegue, lo que publica tus cambios de inmediato. +* **Publicas en otras ramas**: el editor crea una pull request, lo que te permite recibir comentarios de otros antes de fusionar tus cambios en tu rama de despliegue. + +
+ ## Mejores prácticas de Git +
+ +Cada equipo desarrollará sus propios flujos de trabajo y preferencias, pero estas son algunas prácticas generales para empezar. + +* **Escribe mensajes de commit descriptivos**: Sé específico respecto a qué cambió y utiliza un lenguaje activo. +* **Usa nombres de ramas descriptivos**: Los nombres de las ramas deben explicar el trabajo que se está realizando y ser claros para quien mire las ramas en tu repositorio. +* **Mantén las ramas enfocadas**: Limita los cambios de una rama a una tarea o proyecto específico. +* **Elimina las ramas después de fusionarlas**: Elimina las ramas cuando ya no las necesites para mantener tu repositorio ordenado. \ No newline at end of file diff --git a/es/editor/keyboard-shortcuts.mdx b/es/editor/keyboard-shortcuts.mdx new file mode 100644 index 000000000..f1b8086f4 --- /dev/null +++ b/es/editor/keyboard-shortcuts.mdx @@ -0,0 +1,27 @@ +--- +title: "Atajos de teclado" +description: "Atajos para el editor web" +--- + +El editor web admite los atajos de teclado comunes como copiar, pegar, deshacer y seleccionar todo, además de los siguientes: + +| Comando | macOS | Windows | +|:--------|:------|:--------| +| **Buscar archivos** | Cmd + P | Control + P | +| **Agregar enlace al texto seleccionado** | Cmd + K | Control + K | +| **Insertar salto de línea** | Cmd + Enter | Control + Enter | +| **Negrita** | Cmd + B | Control + B | +| **Cursiva** | Cmd + I | Control + I | +| **Subrayado** | Cmd + U | Control + U | +| **Tachado** | Cmd + Shift + S | Control + Shift + S | +| **Código** | Cmd + E | Control + E | +| **Texto normal** | Cmd + Alt + 0 | Control + Alt + 0 | +| **Encabezado 1** | Cmd + Alt + 1 | Control + Alt + 1 | +| **Encabezado 2** | Cmd + Alt + 2 | Control + Alt + 2 | +| **Encabezado 3** | Cmd + Alt + 3 | Control + Alt + 3 | +| **Encabezado 4** | Cmd + Alt + 4 | Control + Alt + 4 | +| **Lista numerada** | Cmd + Shift + 7 | Control + Shift + 7 | +| **Lista con viñetas** | Cmd + Shift + 8 | Control + Shift + 8 | +| **Cita** | Cmd + Shift + B | Control + Shift + B | +| **Subíndice** | Cmd + , | Control + , | +| **Superíndice** | Cmd + . | Control + . | \ No newline at end of file diff --git a/es/editor/publishing.mdx b/es/editor/publishing.mdx new file mode 100644 index 000000000..4bf7b16fa --- /dev/null +++ b/es/editor/publishing.mdx @@ -0,0 +1,79 @@ +--- +title: "Publicar tus cambios" +description: "Despliega las actualizaciones de tu documentación directamente a producción o mediante pull requests" +--- + +Cómo se publiquen tus cambios depende de la rama en la que estés trabajando: + +* **Rama de despliegue**: Al publicar, tu sitio en producción se actualiza de inmediato. +* **Otras ramas**: Al publicar, se crea un pull request para que puedas revisar los cambios antes de que se desplieguen a producción. + + + El botón Publicar resaltado en el editor web de Mintlify + El botón Publicar resaltado en el editor web de Mintlify + + +
+ ## Pull requests y revisión de cambios +
+ +Los pull requests te permiten proponer cambios desde tu rama para que otras personas los revisen antes de integrarlos en tu documentación publicada. Esto ayuda a asegurar que tus cambios sean correctos y le da a tu equipo la oportunidad de colaborar en el contenido. + + + Incluso si trabajas en solitario, los pull requests son útiles para previsualizar cambios y mantener un historial claro de actualizaciones. + + +
+ ### Crear una pull request +
+ + + + Asegúrate de que todos tus cambios estén guardados en tu rama usando **Save Changes**. + + + Selecciona **Publish Pull Request** en la esquina superior derecha del editor. + + + Escribe un título y una descripción claros que expliquen: + - Qué cambios hiciste + - Por qué los hiciste + - Cualquier área específica que necesite revisión + + + Selecciona **Publish Pull Request**. El editor te proporcionará un enlace para ver tu pull request. + + + Botón Publish Pull Request resaltado en el editor web de Mintlify + Botón Publish Pull Request resaltado en el editor web de Mintlify + + + + +
+ ## Revisar pull requests +
+ +Una vez creado tu pull request: + +1. **Revisar cambios**: Tú y tu equipo pueden revisar el pull request en tu proveedor de Git, como GitHub o GitLab. +2. **Dejar comentarios**: Agrega comentarios o solicita cambios. +3. **Hacer cambios adicionales**: Realiza cambios adicionales en el editor web. Al guardar, el editor los envía a tu pull request. +4. **Aprobar**: Aprueba el pull request cuando estés satisfecho con los cambios. +5. **Fusionar**: Fusiona el pull request cuando estés listo para desplegar tus cambios a producción. \ No newline at end of file diff --git a/es/editor/troubleshooting.mdx b/es/editor/troubleshooting.mdx new file mode 100644 index 000000000..356467240 --- /dev/null +++ b/es/editor/troubleshooting.mdx @@ -0,0 +1,62 @@ +--- +title: "Solución de problemas del editor web" +sidebarTitle: "Solución de problemas" +description: "Soluciones a problemas comunes" +--- + +Encuentra soluciones a problemas comunes que podrías encontrar al usar el editor web. + + + + **Posibles causas:** + + * El despliegue aún está en curso + * Problemas de caché del navegador + * Errores de compilación o despliegue + + **Soluciones:** + + 1. Revisa el estado del despliegue en tu panel. + 2. Fuerza la recarga del navegador (Ctrl + F5 o Cmd + Shift + R) + 3. Borra la caché del navegador. + + + + **Posibles causas:** + + * Permisos insuficientes en el repositorio de Git + * Problemas de autenticación con tu proveedor de Git + + **Soluciones:** + + 1. Verifica que tengas el acceso adecuado al repositorio. + 2. Comprueba que tu integración con Git esté configurada correctamente. + 3. Revisa la documentación de [Permisos del editor](/es/advanced/dashboard/permissions). + + + + **Posibles causas:** + + * Problemas de conectividad de red + * Repositorios de documentación muy grandes + + **Soluciones:** + + 1. Verifica tu conexión a internet. + 2. Actualiza la página. + 3. Contacta con soporte si el problema persiste. + + + + **Posibles causas:** + + * Sintaxis MDX no válida en los archivos + * Archivos faltantes o dañados + * Archivos de gran tamaño que causan tiempos de espera + + **Soluciones:** + + 1. Revisa la sintaxis del archivo para detectar errores de formato en MDX. + 2. Verifica que el archivo exista en tu repositorio. + + \ No newline at end of file diff --git a/es/guides/assistant.mdx b/es/guides/assistant.mdx new file mode 100644 index 000000000..ec257e0fc --- /dev/null +++ b/es/guides/assistant.mdx @@ -0,0 +1,156 @@ +--- +title: "Asistente" +description: "Ayuda a tus usuarios a aprovechar tu producto y a encontrar respuestas más rápido" +icon: "bot" +--- + + + El Asistente se habilita automáticamente en los [planes Pro y Custom](https://mintlify.com/pricing?ref=assistant). + + +
+ ## Acerca del asistente +
+ +El asistente responde preguntas sobre tu documentación mediante consultas en lenguaje natural. Está integrado directamente en tu sitio de documentación, ofreciendo a los usuarios acceso inmediato a ayuda contextual. + +El asistente utiliza RAG agentivo (generación aumentada por recuperación) con llamadas a herramientas, impulsado por Claude Sonnet 4. Cuando los usuarios hacen preguntas, el asistente: + +* **Busca y recupera** contenido relevante de tu documentación para ofrecer respuestas precisas. +* **Cita las fuentes** y proporciona enlaces navegables que llevan a los usuarios directamente a las páginas de referencia. +* **Genera ejemplos de código que se pueden copiar** para ayudar a los usuarios a implementar soluciones a partir de tu documentación. + +Cada mensaje enviado al asistente cuenta para la cuota de mensajes de tu plan. Si superas tu cuota, los mensajes adicionales generarán cargos por excedente. Puedes establecer límites de gasto o desactivar el asistente si alcanzas tu cuota de mensajes. + +Puedes ver el uso del asistente en tu panel para comprender el comportamiento de los usuarios y la efectividad de la documentación. Exporta y analiza los datos de consultas para ayudar a identificar: + +* Preguntas frecuentes que podrían necesitar mejor cobertura. +* Brechas de contenido donde los usuarios tienen dificultades para encontrar respuestas. +* Temas populares que podrían beneficiarse de contenido adicional. + +
+ ## Configuración del Asistente +
+ +El Asistente está habilitado de forma predeterminada para los planes Pro y Custom. Puedes gestionarlo desde tu [panel](https://dashboard.mintlify.com/products/assistant/settings), incluyendo habilitarlo o deshabilitarlo, configurar el manejo de respuestas y establecer un límite de gasto. + +
+ ### Estado del Asistente +
+ +Alterna el estado del Asistente para habilitarlo o deshabilitarlo en tu sitio de documentación. + +
+ ### Desvío del Asistente +
+ +Permite que el Asistente redirija las preguntas no resueltas a tu equipo de soporte. Proporciona una dirección de correo electrónico que el Asistente entregará a los usuarios que hagan preguntas a las que no pueda responder. + +
+ ### Búsqueda en sitios +
+ + + La búsqueda en el sitio está en beta. Para habilitarla en tu sitio de documentación, [contacta a nuestro equipo de ventas](mailto:gtm@mintlify.com). + + +Configura los sitios que el Asistente puede consultar para obtener contexto adicional al responder preguntas. + +* Los sitios deben ser de acceso público. +* No se admiten sitios que requieran JavaScript para cargar el contenido. + +Puedes usar la siguiente sintaxis de filtrado al configurar sitios externos: + +* **Filtrado a nivel de dominio** + * `example.com`: Busca solo en el dominio `example.com` + * `docs.example.com`: Busca solo en el subdominio `docs.example.com` + * `*.example.com`: Busca en todos los subdominios de `example.com` +* **Filtrado a nivel de ruta** + * `docs.example.com/api`: Busca todas las páginas dentro de la subruta `/api` +* **Patrones múltiples** + * Agrega varias entradas para cubrir diferentes secciones de los sitios + +
+ ### Límite de gasto +
+ +Establece un límite de gasto para controlar qué ocurre si alcanzas tu cupo de mensajes. De forma predeterminada, el Asistente seguirá respondiendo preguntas de los usuarios después de que alcances tu cupo de mensajes, lo que genera cargos adicionales. + +En la pestaña **Billing** de la página [Assistant Configurations](https://dashboard.mintlify.com/products/assistant/settings), puedes establecer un límite de gasto para los mensajes del Asistente más allá de tu cupo. Cuando alcanzas tu límite de gasto, el Asistente se deshabilita hasta que se restablezca tu cupo de mensajes. + +También puedes configurar alertas de uso para recibir un correo electrónico cuando alcances un porcentaje determinado de tu límite de gasto. + +
+ ## Uso del asistente +
+ +Los usuarios pueden acceder al asistente de tres maneras: + +* **Atajos de teclado**: ? o Command + I (Ctrl + I en Windows) +* **Botón del asistente** junto a la barra de búsqueda + Barra de búsqueda y botón del asistente en modo claro. + Barra de búsqueda y botón del asistente en modo oscuro. +* **URLs** con `?assistant=open` al final abrirán el asistente cuando la página cargue. Por ejemplo, [https://mintlify.com/docs?assistant=open](https://mintlify.com/docs?assistant=open). + +Todas estas opciones abren un panel de chat en el lado derecho de tu documentación. Los usuarios pueden hacer cualquier pregunta y el Asistente buscará en tu documentación una respuesta. Si no se encuentra información relevante, el Asistente indicará que no puede responder la pregunta. + +
+ ## Hacer que el contenido sea apto para la IA +
+ +Estructura tu documentación para ayudar al asistente a ofrecer respuestas precisas y relevantes. Una organización clara y un contexto completo benefician tanto a las personas lectoras como a la comprensión de la IA. + + + * Usa marcado semántico. + * Escribe encabezados descriptivos para las secciones. + * Crea una jerarquía lógica de la información. + * Mantén un formato consistente en toda tu documentación. + * Incluye metadatos completos en el frontmatter de la página. + * Divide los bloques de texto largos en párrafos más cortos. + + + + * Define términos y siglas específicos la primera vez que aparezcan. + * Proporciona suficiente contenido conceptual sobre funcionalidades y procedimientos. + * Incluye ejemplos y casos de uso. + * Añade referencias cruzadas a temas relacionados. + * Agrega [páginas ocultas](/es/guides/hidden-pages) con contexto adicional que las personas no necesitan, pero a las que el asistente puede recurrir. + + +
+ ## Exportar y analizar consultas +
+ +Revisa y exporta consultas desde tu panel para entender cómo las personas interactúan con tu documentación e identificar oportunidades de mejora. Algunas maneras en que el análisis de consultas puede ayudarte a mejorar tu documentación: + +* Identificar brechas de contenido donde las consultas frecuentes reciben respuestas insuficientes. +* Descubrir patrones de comportamiento de los usuarios y necesidades de información comunes a partir de los temas y patrones en las consultas. +* Priorizar páginas con alto tráfico para mejorar su precisión y calidad. + +Puedes explorar las consultas desde tu [panel](https://dashboard.mintlify.com/products/assistant), pero para obtener información más valiosa recomendamos exportar un archivo `CSV` con tus consultas, respuestas y fuentes para analizarlo con tu herramienta de IA preferida. + +1. Ve a la [página del Asistente](https://dashboard.mintlify.com/products/assistant) en tu panel. +2. Selecciona **Export to CSV**. +3. Analiza los datos exportados con tu herramienta preferida. + + + * Resume los temas más comunes de las consultas. + * Enumera las consultas que no tuvieron fuentes citadas. + * Encuentra patrones en las interacciones fallidas. + \ No newline at end of file diff --git a/es/guides/auth0.mdx b/es/guides/auth0.mdx new file mode 100644 index 000000000..c3e6c5359 --- /dev/null +++ b/es/guides/auth0.mdx @@ -0,0 +1,62 @@ +--- +title: "Uso de Auth0 con el handshake de OAuth" +description: "Si Auth0 es la fuente de verdad para los datos de tus usuarios, puedes configurar Mintlify como una aplicación cliente de OAuth para autenticar a tus usuarios." +--- + + + **Aviso de seguridad**: Aunque proporcionamos esta guía para ayudarte a integrar Auth0 con Mintlify, consulta con tu equipo de seguridad antes de implementar cualquier solución de autenticación. Mintlify no se hace responsable de ningún problema de seguridad que pueda surgir de tu implementación específica. + + + + +
+ ## Descripción general +
+ +Esta guía te guía paso a paso para configurar Auth0 como proveedor de autenticación para tu documentación de Mintlify. Al finalizar, tus usuarios podrán iniciar sesión en tu documentación con sus credenciales de Auth0. + + + + Inicia sesión en tu panel de Auth0 y navega a **Applications** > **Applications**. Haz clic en el botón **Create Application**, asigna un nombre a tu aplicación (p. ej., “Mintlify”) y selecciona **Regular Web Applications** como tipo de aplicación. Luego, haz clic en **Create**. + + ![Creating a new application in Auth0](/images/guides/auth0/auth0-create-application.png) + + + Después de crear tu aplicación, se te dirigirá a la página de configuración de la aplicación. Aquí encontrarás las credenciales esenciales necesarias para la integración con OAuth: + + ![Auth0 client settings page](/images/guides/auth0/auth0clientsettings.png) + + Toma nota de la siguiente información: + - **Domain**: El dominio de tu tenant de Auth0 (p. ej., `your-tenant.auth0.com`) + - **Client ID**: El identificador público de tu aplicación + - **Client Secret**: La clave secreta de tu aplicación (manténla segura) + + Necesitarás estos valores para configurar Mintlify en el siguiente paso. + + + Ve a tu Panel de Mintlify y entra en **Settings** > **Authentication**. Selecciona **OAuth** como método de autenticación y verás el formulario de configuración de OAuth: + + ![Mintlify OAuth client settings](/images/guides/auth0/mintlifyoauthclientsettings.png) + + Completa el formulario con los siguientes valores: + + - **Authorization URL**: `https://YOUR_AUTH0_DOMAIN/authorize` (reemplaza `YOUR_AUTH0_DOMAIN` por tu dominio real de Auth0 del paso 2) + - **Client ID**: Ingresa el Client ID de tu aplicación de Auth0 + - **Client Secret**: Ingresa el Client Secret de tu aplicación de Auth0 + - **Scopes**: Déjalo en blanco a menos que tengas scopes personalizados definidos en Auth0 + - **Token URL**: `https://YOUR_AUTH0_DOMAIN/oauth/token` (reemplaza `YOUR_AUTH0_DOMAIN` por tu dominio real de Auth0) + + Después de completar estos datos, haz clic en **Save changes** para guardar tu configuración de OAuth. + + + Mintlify generará una URL de redirección única que Auth0 debe reconocer para que el flujo de OAuth funcione correctamente. + + Copia la URL de redirección desde la sección de Authentication en tu Panel de Mintlify: + ![Mintlify redirect URL](/images/guides/auth0/mintlifyredirecturl.png) + + Regresa a la página de configuración de tu aplicación en Auth0, desplázate hasta la sección **Application URIs** y pega la URL de redirección en el campo **Allowed Callback URLs**: + ![Auth0 redirect URL configuration](/images/guides/auth0/auth0redirecturl.png) + + Haz clic en **Save Changes** al final de la página de Auth0 para aplicar esta configuración. + + \ No newline at end of file diff --git a/es/guides/changelogs.mdx b/es/guides/changelogs.mdx new file mode 100644 index 000000000..f925c8b89 --- /dev/null +++ b/es/guides/changelogs.mdx @@ -0,0 +1,146 @@ +--- +title: "Registro de cambios" +description: "Publica actualizaciones de producto en tu documentación con un canal RSS al que los usuarios pueden suscribirse" +icon: "newspaper" +--- + +Crea un registro de cambios para tu documentación agregando el [Componente de actualización](/es/components/update) a una página. + +Consulta el [registro de cambios de Mintlify](/es/changelog) como ejemplo: en cada actualización puedes incluir enlaces, imágenes, texto y demostraciones de tus nuevas funciones. + +
+ ## Configurar tu registro de cambios +
+ + + + 1. Crea una nueva página en tu documentación, como `changelog.mdx` o `updates.mdx`. + 2. Agrega la página del registro de cambios a tu esquema de navegación en `docs.json`. + + + + Agrega un `Update` por cada entrada del registro de cambios. + + Incluye información relevante como lanzamientos de funciones, correcciones de errores u otros anuncios. + + + +```mdx Example changelog.mdx +--- +title: "Registro de cambios" +description: "Actualizaciones del producto y anuncios" +--- + + Se añadió un nuevo sabor Wintergreen. + + Se publicó una nueva versión del sabor Spearmint, ahora con un 10% más de menta. + + + + Se publicó una nueva versión del sabor Spearmint. + +``` + +
+ ## Personalizar tu registro de cambios +
+ +Controla cómo las personas navegan por tu registro de cambios y se mantienen al día con la información de tu producto. + +
+ ### Tabla de contenido +
+ +Cada propiedad `label` de un `Update` crea automáticamente una entrada en la tabla de contenido de la barra lateral derecha. Esta es la navegación predeterminada para tu registro de cambios. + + + Registro de cambios con tabla de contenido mostrada en modo claro. + + Registro de cambios con tabla de contenido mostrada en modo oscuro. + + +
+ ### Filtros por etiquetas +
+ +Agrega `tags` a tus componentes `Update` para reemplazar la tabla de contenido con filtros por etiquetas. Los usuarios pueden filtrar el registro de cambios seleccionando una o más etiquetas: + +```mdx Tag filters example wrap + + Added a new Wintergreen flavor. + + Released a new version of the Spearmint flavor, now with 10% more mint. + + + + Released a new version of the Spearmint flavor. + + + + Deprecated the Peppermint flavor. + + Released a new version of the Spearmint flavor. + +``` + + + Registro de cambios en modo claro con el filtro de la etiqueta Peppermint seleccionado. + + Registro de cambios en modo oscuro con el filtro de la etiqueta Peppermint seleccionado. + + + + La tabla de contenido y los filtros del registro de cambios se ocultan al usar los modos de página `custom`, `center` o `wide`. Más información sobre [modos de página](/es/pages#page-mode). + + +
+ ### Registros de cambios con suscripción +
+ +Usar componentes `Update` crea un feed RSS al que te puedes suscribir en la URL de tu página con `/rss.xml` añadido. Por ejemplo, `mintlify.com/docs/changelog/rss.xml`. + +Las entradas se agregan al feed RSS cuando se publican nuevos componentes `Update` y cuando se añaden nuevos encabezados dentro de etiquetas `` existentes. + +Los encabezados de nivel superior de los componentes `Update` se usan como títulos de las entradas del feed RSS, y estas enlazan a sus anclas de encabezado en tu documentación. + +```xml Example RSS feed + + + + <![CDATA[Product updates]]> + + https://mintlify.com/docs + RSS for Node + Mon, 21 Jul 2025 21:21:47 GMT + + + https://mintlify.com/docs + + <![CDATA[June 2025]]> + https://mintlify.com/docs/changelog#june-2025 + https://mintlify.com/docs/changelog#june-2025 + Mon, 23 Jun 2025 16:54:22 GMT + + + +``` + +Los feeds RSS pueden integrarse con Slack, correo electrónico u otras herramientas de suscripción para notificar a los usuarios sobre cambios en el producto. Algunas opciones incluyen: + +* [Slack](https://slack.com/help/articles/218688467-Add-RSS-feeds-to-Slack) +* [Email](https://zapier.com/apps/email/integrations/rss/1441/send-new-rss-feed-entries-via-email) a través de Zapier +* Bots de Discord como [Readybot](https://readybot.io) o [RSS Feeds to Discord Bot](https://rss.app/en/bots/rssfeeds-discord-bot) + +Para facilitar el descubrimiento del feed RSS, puedes mostrar un botón con el ícono de RSS que enlace al feed en la parte superior de la página. Agrega `rss: true` al frontmatter de la página: + +```mdx +--- +rss: true +--- +``` + + + Página de registro de cambios en modo claro con el botón del feed RSS habilitado. + + Página de registro de cambios en modo oscuro con el botón del feed RSS habilitado. + diff --git a/es/guides/claude-code.mdx b/es/guides/claude-code.mdx new file mode 100644 index 000000000..16079cae5 --- /dev/null +++ b/es/guides/claude-code.mdx @@ -0,0 +1,174 @@ +--- +title: "Claude Code" +description: "Configura Claude Code para ayudar a escribir, revisar y actualizar tu documentación" +icon: "asterisk" +--- + +Claude Code es una herramienta de línea de comandos con capacidades de agente que puede ayudarte a mantener tu documentación. Puede redactar contenido nuevo, revisar páginas existentes y mantener la documentación actualizada. + +Puedes entrenar a Claude Code para que comprenda tus estándares y flujos de trabajo de documentación añadiendo un archivo `CLAUDE.md` a tu proyecto y afinándolo con el tiempo. + + + +
+ ## Primeros pasos +
+ +**Requisitos previos:** +- Suscripción activa a Claude (Pro, Max o acceso por API) + +**Configuración:** +1. Instala Claude Code: + ```bash + npm install -g @anthropic-ai/claude-code + ``` +2. Ve a tu directorio de documentación. +3. (Opcional) Agrega el archivo `CLAUDE.md` que aparece a continuación a tu proyecto. +4. Ejecuta `claude` para empezar. + + + +
+ ## Plantilla de CLAUDE.md +
+ +Guarda un archivo `CLAUDE.md` en la raíz de tu directorio de documentación para ayudar a Claude Code a comprender tu proyecto. Este archivo entrena a Claude Code en tus estándares de documentación, preferencias y flujos de trabajo. Consulta [Manage Claude's memory](https://docs.anthropic.com/en/docs/claude-code/memory) en la documentación de Anthropic para más información. + +Copia este ejemplo de plantilla o ajústalo según las especificaciones de tu documentación: + +```mdx +# Mintlify documentation + +## Working relationship +- Puedes cuestionar ideas; esto puede llevar a una mejor documentación. Cita fuentes y explica tu razonamiento cuando lo hagas +- SIEMPRE pide aclaraciones en lugar de asumir +- NUNCA mientas, adivines ni inventes información + +## Project context +- Formato: archivos MDX con frontmatter YAML +- Configuración: docs.json para navegación, tema y ajustes +- Componentes: componentes de Mintlify + +## Content strategy +- Documenta lo justo para que el usuario tenga éxito: ni demasiado, ni demasiado poco +- Prioriza la precisión y la usabilidad de la información +- Procura que el contenido sea perenne cuando sea posible +- Busca información existente antes de añadir contenido nuevo. Evita la duplicación salvo por un motivo estratégico +- Revisa los patrones existentes para mantener la coherencia +- Empieza haciendo los cambios más pequeños razonables + +## docs.json + +- Consulta el [esquema de docs.json](https://mintlify.com/docs.json) al crear el archivo docs.json y la navegación del sitio + +## Frontmatter requirements for pages +- title: Título de página claro y descriptivo +- description: Resumen conciso para SEO/navegación + +## Writing standards +- Voz en segunda persona ("tú") +- Prerrequisitos al inicio del contenido procedimental +- Prueba todos los ejemplos de código antes de publicar +- Alinea el estilo y formato con las páginas existentes +- Incluye casos de uso básicos y avanzados +- Etiquetas de lenguaje en todos los bloques de código +- Texto alternativo en todas las imágenes +- Rutas relativas para enlaces internos + +## Git workflow +- NUNCA uses --no-verify al hacer commits +- Pregunta cómo manejar los cambios sin confirmar antes de empezar +- Crea una nueva rama cuando no exista una clara para los cambios +- Haz commits con frecuencia durante el desarrollo +- NUNCA omitas ni desactives los hooks de pre-commit + +## Do not +- Omitir el frontmatter en cualquier archivo MDX +- Usar URLs absolutas para enlaces internos +- Incluir ejemplos de código no probados +- Hacer suposiciones: pide aclaraciones siempre +``` + + + +
+ ## Prompts de ejemplo +
+ +Una vez que tengas Claude Code configurado, prueba estos prompts para ver cómo puede ayudar con tareas comunes de documentación. Puedes copiar y pegar estos ejemplos directamente o adaptarlos a tus necesidades específicas. + +
+ ### Convertir notas en documentación pulida +
+ +Convierte borradores en páginas Markdown bien formateadas con componentes y frontmatter. + +**Prompt de ejemplo:** +```text wrap +Convierte este texto en una página MDX con el formato correcto: [pega tu texto aquí] +``` + +
+ ### Revisar la documentación para mantener la coherencia +
+ +Obtén sugerencias para mejorar el estilo, el formato y el uso de componentes. + +**Prompt de ejemplo:** +```text wrap +Revisa los archivos en docs/ y sugiere mejoras para la coherencia y la claridad +``` + +
+ ### Actualizar la documentación cuando cambian las características +
+ +Mantén la documentación actualizada cuando tu producto evolucione. + +**Prompt de ejemplo:** +```text wrap +Nuestra API ahora requiere un parámetro de versión. Actualiza la documentación para incluir version=2024-01 en todos los ejemplos +``` + +
+ ### Generar ejemplos de código completos +
+ +Crea ejemplos en varios lenguajes con manejo de errores. + +**Prompt de ejemplo:** +```text wrap +Crea ejemplos de código para [tu endpoint de API] en JavaScript, Python y cURL, con manejo de errores +``` + + + +
+ ## Ampliar Claude Code +
+ +Además de interactuar manualmente con Claude Code, puedes integrarlo en tus flujos de trabajo existentes. + +
+ ### Automatización con GitHub Actions +
+ +Ejecuta Claude Code automáticamente cuando haya cambios en el código para mantener la documentación actualizada. Puedes activar revisiones de documentación en pull requests o actualizar ejemplos cuando se detecten cambios en la API. + +
+ ### Flujos de trabajo multiinstancia +
+ +Usa sesiones separadas de Claude Code para distintas tareas: una para redactar contenido nuevo y otra para revisión y control de calidad. Esto ayuda a mantener la consistencia y a detectar problemas que una sola sesión podría pasar por alto. + +
+ ### Colaboración en equipo +
+ +Comparte tu archivo `CLAUDE.md` afinado con tu equipo para garantizar estándares de documentación consistentes entre todos los colaboradores. Los equipos suelen desarrollar prompts y flujos de trabajo específicos del proyecto que pasan a formar parte de su proceso de documentación. + +
+ ### Comandos personalizados +
+ +Crea comandos de barra reutilizables en `.claude/commands/` para tareas frecuentes de documentación específicas de tu proyecto o equipo. diff --git a/es/guides/csp-configuration.mdx b/es/guides/csp-configuration.mdx new file mode 100644 index 000000000..0ce92611f --- /dev/null +++ b/es/guides/csp-configuration.mdx @@ -0,0 +1,143 @@ +--- +title: "Configuración de Content Security Policy (CSP)" +sidebarTitle: "Configuración de CSP" +description: "Lista de permitidos de dominios y configuraciones de encabezados para proxies inversos, cortafuegos y redes que aplican políticas de seguridad estrictas" +--- + +Content Security Policy (CSP) es un estándar de seguridad que ayuda a prevenir ataques de cross-site scripting (XSS) al controlar qué recursos puede cargar una página web. Mintlify ofrece una CSP predeterminada que protege a la mayoría de los sitios. Si alojas tu documentación detrás de un proxy inverso o un cortafuegos que sobrescribe la CSP predeterminada, es posible que debas configurar los encabezados de CSP para que las funciones funcionen correctamente. + +
+ ## Directivas CSP +
+ +Se utilizan las siguientes directivas CSP para controlar qué recursos se pueden cargar: + +- `script-src`: Controla qué scripts se pueden ejecutar +- `style-src`: Controla qué hojas de estilo se pueden cargar +- `font-src`: Controla qué fuentes se pueden cargar +- `img-src`: Controla qué imágenes, iconos y logotipos se pueden cargar +- `connect-src`: Controla con qué URL se puede establecer conexión para llamadas a la API y conexiones WebSocket +- `frame-src`: Controla qué URL se pueden incrustar en marcos o iframes +- `default-src`: Valor predeterminado para otras directivas cuando no se configura explícitamente + +
+ ## Lista de dominios permitidos +
+ +| Dominio | Propósito | Directiva CSP | Requerido | +|:-------|:--------|:--------------|:-------| +| `d4tuoctqmanu0.cloudfront.net` | CSS y fuentes de KaTeX | `style-src`, `font-src` | Requerido | +| `*.mintlify.dev` | Contenido de la documentación | `connect-src` | Requerido | +| `d3gk2c5xim1je2.cloudfront.net` | Iconos, imágenes, logotipos | `img-src` | Requerido | +| `www.googletagmanager.com` | Google Analytics/GTM | `script-src`, `connect-src` | Opcional | +| `cdn.segment.com` | Analíticas de Segment | `script-src`, `connect-src` | Opcional | +| `plausible.io` | Analíticas de Plausible | `script-src`, `connect-src` | Opcional | +| `tag.clearbitscripts.com` | Seguimiento de Clearbit | `script-src` | Opcional | +| `cdn.heapanalytics.com` | Analíticas de Heap | `script-src` | Opcional | +| `chat.cdn-plain.com` | Widget de chat de Plain | `script-src` | Opcional | +| `chat-assets.frontapp.com` | Widget de chat de Front | `script-src` | Opcional | + +
+ ## Ejemplo de configuración de CSP +
+ + + Incluye únicamente los dominios de los servicios que usas. Elimina cualquier dominio de analítica que no hayas configurado para tu documentación. + + +```text ajustar +Content-Security-Policy: +default-src 'self'; +script-src 'self' 'unsafe-inline' 'unsafe-eval' www.googletagmanager.com cdn.segment.com plausible.io tag.clearbitscripts.com cdn.heapanalytics.com +chat.cdn-plain.com chat-assets.frontapp.com; +style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; +font-src 'self' d4tuoctqmanu0.cloudfront.net; +img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; +connect-src 'self' *.mintlify.dev www.googletagmanager.com cdn.segment.com plausible.io; +frame-src 'self' *.mintlify.dev; +``` + + +
+ ## Configuraciones comunes según el tipo de proxy +
+ +La mayoría de los proxies inversos admiten añadir encabezados personalizados. + +
+ ### Configuración de Cloudflare +
+ +Crea una regla de transformación de encabezados de respuesta: + +1. En tu panel de Cloudflare, ve a **Rules > Overview**. +2. Selecciona **Create rule > Response Header Transform Rule**. +3. Configura la regla: + +- **Modify response header**: Set static + - **Header name**: `Content-Security-Policy` + - **Header value**: + ```text wrap + default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev; + ``` + +4. Publica la regla. + +
+ ### Configuración de AWS CloudFront +
+ +Añade una política de encabezados de respuesta en CloudFront: + +```json +{ +"ResponseHeadersPolicy": { + "Name": "MintlifyCSP", + "Config": { + "SecurityHeadersConfig": { + "ContentSecurityPolicy": { + "ContentSecurityPolicy": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev;", + "Override": true + } + } + } + } +} +``` + + +
+ ### Configuración de Vercel +
+ +Añade a tu `vercel.json`: + +```json +{ +"headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "Content-Security-Policy", + "value": "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' d4tuoctqmanu0.cloudfront.net; font-src 'self' d4tuoctqmanu0.cloudfront.net; img-src 'self' data: blob: d3gk2c5xim1je2.cloudfront.net; connect-src 'self' *.mintlify.dev; frame-src 'self' *.mintlify.dev;" + } + ] + } + ] +} +``` + + +
+ ## Solución de problemas +
+ +Identifica infracciones de la CSP en la consola de tu navegador: + +1. Abre las herramientas de desarrollador de tu navegador. +2. Ve a la pestaña **Console**. +3. Busca errores que empiecen por: + - `Content Security Policy: The page's settings blocked the loading of a resource` + - `Refused to load the script/stylesheet because it violates the following Content Security Policy directive` + - `Refused to connect to because it violates the following Content Security Policy directive` \ No newline at end of file diff --git a/es/guides/cursor.mdx b/es/guides/cursor.mdx new file mode 100644 index 000000000..2a43708a0 --- /dev/null +++ b/es/guides/cursor.mdx @@ -0,0 +1,433 @@ +--- +title: "Cursor" +description: "Configura Cursor como tu asistente de redacción" +icon: "box" +--- + +Convierte a Cursor en un experto en documentación que conozca tus componentes, tu guía de estilo y tus mejores prácticas. + +
+ ## Uso de Cursor con Mintlify +
+ +Las reglas de Cursor proporcionan un contexto persistente sobre tu documentación, lo que garantiza sugerencias más coherentes que se ajusten a tus estándares y estilo. + +* **Reglas de proyecto**: se almacenan en el repositorio de tu documentación y se comparten con tu equipo. +* **Reglas de usuario**: se aplican a tu entorno personal de Cursor. + +Recomendamos crear reglas de proyecto para tu documentación, de modo que todas las personas colaboradoras tengan acceso a las mismas reglas. + +Crea archivos de reglas en el directorio `.cursor/rules` de tu repositorio de documentación. Consulta la [documentación de Cursor Rules](https://docs.cursor.com/context/rules) para ver las instrucciones completas de configuración. + +
+ ## Regla de proyecto de ejemplo +
+ +Esta regla proporciona a Cursor el contexto necesario para formatear correctamente los componentes de Mintlify y seguir las mejores prácticas de redacción técnica. + +Puedes usar este ejemplo tal cual o personalizarlo para tu documentación: + +* **Estándares de redacción**: Actualiza las pautas de lenguaje para alinearlas con tu guía de estilo. +* **Patrones de componentes**: Añade componentes específicos del proyecto o modifica los ejemplos existentes. +* **Ejemplos de código**: Sustituye los ejemplos genéricos por llamadas y respuestas reales de tu API. +* **Preferencias de estilo y tono**: Ajusta la terminología, el formato y otras reglas. + +Añade esta regla, con las modificaciones que necesites, como un archivo `.mdc` en el directorio `.cursor/rules` de tu repositorio de documentación. + +```mdx wrap +# Regla de redacción técnica de Mintlify + +Eres un asistente de escritura con IA especializado en crear documentación técnica excepcional usando componentes de Mintlify y siguiendo las mejores prácticas de redacción técnica del sector. +``` + +## Principios básicos de redacción + +### Requisitos de lenguaje y estilo + +* Usa un lenguaje claro y directo, adecuado para audiencias técnicas +* Escribe en segunda persona ("tú") para instrucciones y procedimientos +* Prefiere la voz activa frente a la pasiva +* Emplea el tiempo presente para estados actuales y el futuro para resultados +* Evita la jerga salvo que sea necesaria y define los términos la primera vez que se usen +* Mantén una terminología consistente en toda la documentación +* Mantén las oraciones concisas aportando el contexto necesario +* Usa una estructura paralela en listas, encabezados y procedimientos + +### Estándares de organización de contenido + +* Empieza por la información más importante (pirámide invertida) +* Usa divulgación progresiva: conceptos básicos antes que los avanzados +* Divide los procedimientos complejos en pasos numerados +* Incluye requisitos previos y contexto antes de las instrucciones +* Indica los resultados esperados para cada paso principal +* Usa encabezados descriptivos y ricos en palabras clave para la navegación y el SEO +* Agrupa la información relacionada de forma lógica con separaciones claras entre secciones + +### Enfoque centrado en el usuario + +* Enfócate en los objetivos y resultados del usuario, no en las funciones del sistema +* Anticipa preguntas comunes y abórdalas proactivamente +* Incluye una sección de solución de problemas para los puntos de falla más probables +* Escribe para facilitar el escaneo con encabezados claros, listas y espacios en blanco +* Incluye pasos de verificación para confirmar el éxito + +## Referencia de componentes de Mintlify + +### docs.json + +* Consulta el [esquema de docs.json](https://mintlify.com/docs.json) al crear el archivo docs.json y la navegación del sitio + +### Componentes de llamado de atención + +#### Note - Información adicional útil + + + Información complementaria que respalda el contenido principal sin interrumpir el flujo + + +#### Tip - Mejores prácticas y consejos + + + Consejos de expertos, atajos o mejores prácticas que aumentan la probabilidad de éxito del usuario + + +#### Warning - Advertencias importantes + + + Información crítica sobre posibles problemas, cambios incompatibles o acciones destructivas + + +#### Info - Información contextual neutral + + + Información de contexto, antecedentes o anuncios neutrales + + +#### Check - Confirmaciones de éxito + + + Confirmaciones positivas, finalizaciones correctas o indicadores de logro + + +### Componentes de código + +#### Bloque de código único + +Ejemplo de un bloque de código único: + +```javascript config.js +const apiConfig = { + baseURL: 'https://api.example.com', + timeout: 5000, + headers: { + 'Authorization': `Bearer ${process.env.API_TOKEN}` + } +}; +``` + +#### Grupo de código con varios lenguajes + +Ejemplo de un grupo de código: + + + ```javascript Node.js + const response = await fetch('/api/endpoint', { + headers: { Authorization: `Bearer ${apiKey}` } + }); + ``` + + ```python Python + import requests + response = requests.get('/api/endpoint', + headers={'Authorization': f'Bearer {api_key}'}) + ``` + + ```curl cURL + curl -X GET '/api/endpoint' \ + -H 'Authorization: Bearer YOUR_API_KEY' + ``` + + +#### Ejemplos de solicitud/respuesta + +Ejemplo de documentación de solicitud/respuesta: + + + ```bash cURL + curl -X POST 'https://api.example.com/users' \ + -H 'Content-Type: application/json' \ + -d '{"name": "John Doe", "email": "john@example.com"}' + ``` + + + + ```json Success + { + "id": "user_123", + "name": "John Doe", + "email": "john@example.com", + "created_at": "2024-01-15T10:30:00Z" + } + ``` + + +### Componentes estructurales + +#### Pasos para procedimientos + +Ejemplo de instrucciones paso a paso: + + + + Ejecuta `npm install` para instalar los paquetes necesarios. + + + Verifica la instalación ejecutando `npm list`. + + + + + Crea un archivo `.env` con tus credenciales de API. + + ```bash + API_KEY=your_api_key_here + ``` + + + Nunca subas claves de API al control de versiones. + + + + +#### Pestañas para contenido alternativo + +Ejemplo de contenido con pestañas: + + + + ```bash + brew install node + npm install -g package-name + ``` + + + + ```powershell + choco install nodejs + npm install -g package-name + ``` + + + + ```bash + sudo apt install nodejs npm + npm install -g package-name + ``` + + + +#### Acordeones para contenido plegable + +Ejemplo de grupos de acordeón: + + + + * **Bloqueo por firewall**: Asegúrate de que los puertos 80 y 443 estén abiertos + * **Configuración de proxy**: Define la variable de entorno HTTP_PROXY + * **Resolución DNS**: Prueba usar 8.8.8.8 como servidor DNS + + + + ```javascript + const config = { + performance: { cache: true, timeout: 30000 }, + security: { encryption: 'AES-256' } + }; + ``` + + + +### Tarjetas y columnas para destacar información + +Ejemplo de tarjetas y grupos de tarjetas: + + + Guía completa desde la instalación hasta tu primera llamada a la API en menos de 10 minutos. + + + + + Aprende a autenticar solicitudes usando claves de API o tokens JWT. + + + + Entiende los límites de tasa y las mejores prácticas para volúmenes altos. + + + +### Componentes de documentación de API + +#### Campos de parámetros + +Ejemplo de documentación de parámetros: + + + Identificador único del usuario. Debe ser un UUID v4 válido. + + + + Dirección de correo electrónico del usuario. Debe ser válida y única en el sistema. + + + + Número máximo de resultados a devolver. Rango: 1-100. + + + + Token de tipo Bearer para la autenticación de la API. Formato: `Bearer YOUR_API_KEY` + + +#### Campos de la respuesta + +Ejemplo de documentación de campos de respuesta: + + + Identificador único asignado al usuario recién creado. + + + + Marca de tiempo en formato ISO 8601 del momento en que se creó el usuario. + + + + Lista de permisos asignados a este usuario. + + +#### Campos anidados expandibles + +Ejemplo de documentación de campos anidados: + + + Objeto de usuario completo con todos los datos asociados. + + + + Información del perfil del usuario, incluidos los datos personales. + + + + Nombre del usuario tal como se introdujo durante el registro. + + + + URL de la foto de perfil del usuario. Devuelve null si no se ha configurado un avatar. + + + + + + +### Medios y componentes avanzados + +#### Marcos para imágenes + +Envuelve todas las imágenes en marcos: + + + Panel principal que muestra la vista general de analíticas + + + + Panel de analíticas con gráficos + + +#### Videos + +Usa el elemento de video HTML para contenido de video autoalojado: + +