{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-article-template-tsx","path":"/progressive-web-apps-offline-capabilities-and-background-operations","result":{"pageContext":{"article":{"id":"ba6d4176-7616-520c-ba8f-c0389bb586f8","slug":"/progressive-web-apps-offline-capabilities-and-background-operations","secret":false,"title":"Progressive Web Apps, Offline Capabilities and Background Operations","author":"Luke Celitan","date":"September 18th, 2025","dateForSEO":"2025-09-18T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive, hands-on guide to building Progressive Web Apps (PWAs) with robust offline capabilities, advanced caching strategies, background sync, background fetch, push notifications, and real-world troubleshooting. Learn the architecture, implementation, performance optimization, and best practices for resilient, user-friendly web apps.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Progressive Web Apps, Offline Capabilities and Background Operations\",\n  \"excerpt\": \"A comprehensive, hands-on guide to building Progressive Web Apps (PWAs) with robust offline capabilities, advanced caching strategies, background sync, background fetch, push notifications, and real-world troubleshooting. Learn the architecture, implementation, performance optimization, and best practices for resilient, user-friendly web apps.\",\n  \"date\": \"2025-09-18T00:00:00.000Z\",\n  \"hero\": \"pwacover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"JS\", \"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"progressive-web-apps-the-definitive-deep-dive-on-offline-capabilities-and-background-operations\"\n  }, \"Progressive Web Apps: The Definitive Deep-Dive on Offline Capabilities and Background Operations\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Progressive Web Apps (PWAs) have revolutionized the way we build web applications, bringing native-like reliability, speed, and engagement to the browser. One of the most powerful features of PWAs is their ability to work offline and perform background operations, ensuring users have a seamless experience regardless of network conditions. In this guide, I\\u2019ll take you on a deep technical journey through the architecture, implementation, and advanced strategies for building PWAs with robust offline capabilities and background features. Whether you\\u2019re new to PWAs or looking to master advanced APIs, this post will serve as your definitive reference.\"), mdx(\"h2\", {\n    \"id\": \"1-what-is-a-pwa-why-offline-matters\"\n  }, \"1. What is a PWA? Why Offline Matters\"), mdx(\"p\", null, \"A Progressive Web App (PWA) is a web application that leverages modern browser APIs to deliver an app-like experience: installability, offline support, background sync, push notifications, and more. PWAs bridge the gap between web and native apps, offering reliability and engagement even in poor or intermittent network conditions.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Why Offline Capabilities Matter:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"User Expectations:\"), \" Users expect apps to work regardless of connectivity. Offline support is no longer a luxury\\u2014it\\u2019s a necessity.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reliability:\"), \" Offline operation ensures users can access critical features and data, improving trust and retention.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Performance:\"), \" Serving cached resources is faster than fetching from the network, leading to snappier UX.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Engagement:\"), \" Features like background sync and push notifications keep users engaged even when the app isn\\u2019t open.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Key Technologies:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Service Worker API\"), \": The backbone of offline and background operations.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cache API\"), \": Store and retrieve resources for offline use.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Background Sync, Background Fetch, Periodic Sync, Push API, Notifications\"), \": Advanced APIs for background tasks and user engagement.\")), mdx(\"h2\", {\n    \"id\": \"2-pwa-architecture-main-app-vs-service-worker\"\n  }, \"2. PWA Architecture: Main App vs. Service Worker\"), mdx(\"p\", null, \"PWAs are architected around a clear separation of concerns:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Main App Thread\"), \": Handles UI, user interactions, and business logic. Runs in the browser\\u2019s main thread.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Service Worker Thread\"), \": Runs in the background, intercepts network requests, manages cache, and handles background tasks. Isolated from the main app, communicates via messaging.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Diagram: PWA Architecture\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"+-------------------+      +---------------------+\\n|   Main App (UI)   | <--> |  Service Worker     |\\n| HTML, CSS, JS     |      | Background Thread   |\\n+-------------------+      +---------------------+\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Communication:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"postMessage\"), \" API for sending messages between main app and service worker.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Service worker events (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"fetch\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sync\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"push\"), \", etc.) for intercepting and handling background tasks.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Why This Matters:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keeps UI responsive while service worker handles heavy lifting.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enables offline and background operations even when the app is closed.\")), mdx(\"h2\", {\n    \"id\": \"3-service-worker-fundamentals\"\n  }, \"3. Service Worker Fundamentals\"), mdx(\"p\", null, \"Service workers are the heart of PWAs. Let\\u2019s break down their lifecycle and core concepts:\"), mdx(\"h3\", {\n    \"id\": \"registering-a-service-worker\"\n  }, \"Registering a Service Worker\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// main.js\\nif ('serviceWorker' in navigator) {\\n  window.addEventListener('load', () => {\\n    navigator.serviceWorker.register('/service-worker.js')\\n      .then(registration => {\\n        console.log('Service Worker registered with scope:', registration.scope);\\n      })\\n      .catch(error => {\\n        console.error('Service Worker registration failed:', error);\\n      });\\n  });\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"service-worker-lifecycle\"\n  }, \"Service Worker Lifecycle\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Install\"), \": Cache assets and prepare for activation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Activate\"), \": Clean up old caches, take control of pages.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fetch\"), \": Intercept network requests, serve from cache or network.\")), mdx(\"h3\", {\n    \"id\": \"scope-and-limitations\"\n  }, \"Scope and Limitations\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Service workers are scoped to the directory they\\u2019re registered from.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"No direct DOM access; communicate via messaging.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Runs in a separate thread; may be stopped and restarted by the browser.\")), mdx(\"h2\", {\n    \"id\": \"4-implementing-offline-operation\"\n  }, \"4. Implementing Offline Operation\"), mdx(\"p\", null, \"Offline operation is enabled by intercepting network requests and serving cached resources. The most common strategies are \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"cache-first\"), \" and \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"network-first\"), \".\"), mdx(\"h3\", {\n    \"id\": \"caching-strategies\"\n  }, \"Caching Strategies\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cache-First\"), \": Serve from cache if available, otherwise fetch from network.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Network-First\"), \": Try network first, fall back to cache if offline.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stale-While-Revalidate\"), \": Serve cached response, update cache in background.\")), mdx(\"h3\", {\n    \"id\": \"using-the-cache-api\"\n  }, \"Using the Cache API\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nconst CACHE_NAME = 'pwa-cache-v1';\\nconst ASSETS_TO_CACHE = [\\n  '/',\\n  '/index.html',\\n  '/styles.css',\\n  '/app.js',\\n  '/fallback.html',\\n];\\n\\nself.addEventListener('install', event => {\\n  event.waitUntil(\\n    caches.open(CACHE_NAME).then(cache => cache.addAll(ASSETS_TO_CACHE))\\n  );\\n});\\n\\nself.addEventListener('activate', event => {\\n  event.waitUntil(\\n    caches.keys().then(keys =>\\n      Promise.all(\\n        keys.filter(key => key !== CACHE_NAME).map(key => caches.delete(key))\\n      )\\n    )\\n  );\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"intercepting-fetch-requests\"\n  }, \"Intercepting Fetch Requests\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Cache-First Example with Fallback Redirect:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('fetch', event => {\\n  event.respondWith(\\n    caches.match(event.request).then(cachedResponse => {\\n      if (cachedResponse) {\\n        return cachedResponse;\\n      }\\n      return fetch(event.request).catch(() => caches.match('/fallback.html'));\\n    })\\n  );\\n});\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Annotated Explanation:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Try to match the request in cache.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"If found, return cached response.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"If not, attempt network fetch.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"If network fails (offline), return cached fallback page.\")), mdx(\"h3\", {\n    \"id\": \"practical-example-redirecting-to-cache-when-offline\"\n  }, \"Practical Example: Redirecting to Cache When Offline\"), mdx(\"p\", null, \"Suppose your app has a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/fallback.html\"), \" page cached during install. If the user is offline and requests a page not in cache, the service worker serves \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/fallback.html\"), \".\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Edge Case:\"), \" Ensure \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/fallback.html\"), \" is always cached and updated during service worker install.\"), mdx(\"h2\", {\n    \"id\": \"5-advanced-caching-strategies\"\n  }, \"5. Advanced Caching Strategies\"), mdx(\"h3\", {\n    \"id\": \"when-to-use-cache-first-vs-network-first\"\n  }, \"When to Use Cache-First vs. Network-First\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Static assets\"), \" (HTML, CSS, JS): Cache-first for speed.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Dynamic data\"), \" (API responses): Network-first for freshness, fallback to cache for offline.\")), mdx(\"h3\", {\n    \"id\": \"handling-stale-data-and-cache-invalidation\"\n  }, \"Handling Stale Data and Cache Invalidation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use cache versioning (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"CACHE_NAME\"), \") and clean up old caches on activate.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Implement custom logic to revalidate or update cache entries.\")), mdx(\"h3\", {\n    \"id\": \"pre-caching-assets-during-install\"\n  }, \"Pre-Caching Assets During Install\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"cache.addAll()\"), \" to pre-cache essential assets.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Consider runtime caching for assets loaded after install.\")), mdx(\"h3\", {\n    \"id\": \"dynamic-caching-for-api-responses\"\n  }, \"Dynamic Caching for API Responses\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('fetch', event => {\\n  if (event.request.url.includes('/api/')) {\\n    event.respondWith(\\n      fetch(event.request)\\n        .then(response => {\\n          return caches.open(CACHE_NAME).then(cache => {\\n            cache.put(event.request, response.clone());\\n            return response;\\n          });\\n        })\\n        .catch(() => caches.match(event.request))\\n    );\\n  }\\n});\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Explanation:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For API requests, try network first, cache response, fallback to cache if offline.\")), mdx(\"h2\", {\n    \"id\": \"6-background-operation\"\n  }, \"6. Background Operation\"), mdx(\"p\", null, \"Service workers can run even when the main app is closed, enabling background tasks like sync, fetch, and push notifications.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Lifecycle Management:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Browsers may stop service workers when idle; restart them for events.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"event.waitUntil()\"), \" to keep service worker alive during async operations.\")), mdx(\"h2\", {\n    \"id\": \"7-background-sync\"\n  }, \"7. Background Sync\"), mdx(\"p\", null, \"Background Sync lets you queue actions (e.g., sending messages) and execute them when connectivity returns.\"), mdx(\"h3\", {\n    \"id\": \"registering-sync-events-from-main-app\"\n  }, \"Registering Sync Events from Main App\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// main.js\\nasync function registerSync() {\\n  const swRegistration = await navigator.serviceWorker.ready;\\n  swRegistration.sync.register('send-message');\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"handling-sync-events-in-service-worker\"\n  }, \"Handling Sync Events in Service Worker\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('sync', event => {\\n  if (event.tag === 'send-message') {\\n    event.waitUntil(sendMessage());\\n  }\\n});\\n\\nasync function sendMessage() {\\n  // Logic to send queued messages\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Limitations:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Browser may retry sync if it fails, but limits retries and execution time.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use IndexedDB to store queued actions for reliability.\")), mdx(\"h2\", {\n    \"id\": \"8-background-fetch\"\n  }, \"8. Background Fetch\"), mdx(\"p\", null, \"Background Fetch is ideal for downloading large files, even if the app is closed.\"), mdx(\"h3\", {\n    \"id\": \"initiating-background-fetch-from-main-app\"\n  }, \"Initiating Background Fetch from Main App\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// main.js\\nasync function requestBackgroundFetch() {\\n  const swRegistration = await navigator.serviceWorker.ready;\\n  await swRegistration.backgroundFetch.fetch(\\n    'download-movie',\\n    ['/movie-part-1.webm', '/movie-part-2.webm'],\\n    {\\n      icons: [{ src: '/icon.png', sizes: '192x192', type: 'image/png' }],\\n      title: 'Downloading movie',\\n      downloadTotal: 60 * 1024 * 1024,\\n    }\\n  );\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"handling-fetch-completion-in-service-worker\"\n  }, \"Handling Fetch Completion in Service Worker\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('backgroundfetchsuccess', event => {\\n  event.waitUntil(async () => {\\n    const records = await event.registration.matchAll();\\n    const responses = await Promise.all(records.map(record => record.responseReady));\\n    // Store responses in cache or IndexedDB\\n  });\\n  event.updateUI({ title: 'Download complete!' });\\n});\\n\")), mdx(\"h2\", {\n    \"id\": \"9-periodic-background-sync\"\n  }, \"9. Periodic Background Sync\"), mdx(\"p\", null, \"Periodic Sync keeps data fresh by updating in the background at intervals.\"), mdx(\"h3\", {\n    \"id\": \"registering-periodic-sync\"\n  }, \"Registering Periodic Sync\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// main.js\\nasync function registerPeriodicSync() {\\n  const swRegistration = await navigator.serviceWorker.ready;\\n  swRegistration.periodicSync.register('update-news', {\\n    minInterval: 24 * 60 * 60 * 1000, // 24 hours\\n  });\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"handling-periodic-sync-in-service-worker\"\n  }, \"Handling Periodic Sync in Service Worker\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('periodicsync', event => {\\n  if (event.tag === 'update-news') {\\n    event.waitUntil(updateNews());\\n  }\\n});\\n\\nasync function updateNews() {\\n  // Fetch and cache latest news articles\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"10-push-notifications\"\n  }, \"10. Push Notifications\"), mdx(\"p\", null, \"Push API enables server-initiated messages and notifications.\"), mdx(\"h3\", {\n    \"id\": \"subscribing-to-push-messages\"\n  }, \"Subscribing to Push Messages\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// main.js\\nasync function subscribeToPush() {\\n  const swRegistration = await navigator.serviceWorker.ready;\\n  const subscription = await swRegistration.pushManager.subscribe({\\n    userVisibleOnly: true,\\n    applicationServerKey: '<Your Public VAPID Key>'\\n  });\\n  // Send subscription to server\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"handling-push-events-in-service-worker\"\n  }, \"Handling Push Events in Service Worker\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// service-worker.js\\nself.addEventListener('push', event => {\\n  const data = event.data ? event.data.json() : {};\\n  event.waitUntil(\\n    self.registration.showNotification(data.title, {\\n      body: data.body,\\n      icon: '/icon.png',\\n      data: data.url\\n    })\\n  );\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"responding-to-notification-clicks\"\n  }, \"Responding to Notification Clicks\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"self.addEventListener('notificationclick', event => {\\n  event.notification.close();\\n  event.waitUntil(\\n    clients.openWindow(event.notification.data)\\n  );\\n});\\n\")), mdx(\"h2\", {\n    \"id\": \"11-permissions-and-browser-restrictions\"\n  }, \"11. Permissions and Browser Restrictions\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Service Worker\"), \": No explicit permission, but must be served over HTTPS.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Background Fetch/Sync/Periodic Sync\"), \": May require user permission; browser UI informs users.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Push Notifications\"), \": Explicit user permission required; must be user-visible.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Request permissions contextually (when needed, not on load).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Inform users why permissions are needed.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Handle permission denial gracefully.\")), mdx(\"h2\", {\n    \"id\": \"12-real-world-use-cases\"\n  }, \"12. Real-World Use Cases\"), mdx(\"h3\", {\n    \"id\": \"music-app-with-offline-streaming\"\n  }, \"Music App with Offline Streaming\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Pre-cache tracks for offline playback.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use background fetch for large downloads.\")), mdx(\"h3\", {\n    \"id\": \"email-app-with-background-send\"\n  }, \"Email App with Background Send\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Queue emails in IndexedDB.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use background sync to send when online.\")), mdx(\"h3\", {\n    \"id\": \"chat-app-with-push-notifications\"\n  }, \"Chat App with Push Notifications\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Subscribe to push for new messages.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Show notifications even when app is closed.\")), mdx(\"h2\", {\n    \"id\": \"13-performance-optimization\"\n  }, \"13. Performance Optimization\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Minimize Cache Size\"), \": Remove unused assets, use cache versioning.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Efficient Background Operations\"), \": Use IndexedDB for large/complex data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Battery and Privacy\"), \": Limit background tasks, respect user settings.\")), mdx(\"h2\", {\n    \"id\": \"14-troubleshooting-and-debugging\"\n  }, \"14. Troubleshooting and Debugging\"), mdx(\"h3\", {\n    \"id\": \"common-errors\"\n  }, \"Common Errors\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Service worker not registering: Check HTTPS, file paths, browser support.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cache misses: Ensure assets are cached during install.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sync failures: Use IndexedDB for reliability, handle retries.\")), mdx(\"h3\", {\n    \"id\": \"debugging-tools\"\n  }, \"Debugging Tools\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Chrome DevTools: Application tab for service workers and cache.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Console logs in service worker for lifecycle events.\")), mdx(\"h3\", {\n    \"id\": \"recovery-strategies\"\n  }, \"Recovery Strategies\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fallback pages for offline errors.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Retry logic for background sync.\")), mdx(\"h2\", {\n    \"id\": \"15-best-practices-and-common-pitfalls\"\n  }, \"15. Best Practices and Common Pitfalls\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Avoid Stale Data\"), \": Implement cache invalidation and revalidation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Handle Edge Cases\"), \": Always provide a fallback for offline requests.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"User Experience\"), \": Inform users of offline status, sync progress, and permission needs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Security\"), \": Serve service worker over HTTPS, validate push messages.\")), mdx(\"h2\", {\n    \"id\": \"16-conclusion-and-further-reading\"\n  }, \"16. Conclusion and Further Reading\"), mdx(\"p\", null, \"PWAs empower developers to build resilient, engaging web apps that work offline and in the background. By mastering service workers, caching strategies, and advanced APIs, you can deliver a truly native-like experience on the web. Dive deeper into the official documentation and experiment with these APIs to unlock the full potential of your web apps!\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Service Worker API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Background_Sync_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Background Sync API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Background_Fetch_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Background Fetch API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Push_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Push API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Notifications API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://web.dev/progressive-web-apps/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"PWA Guides on web.dev\"))), mdx(\"hr\", null), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Ready to build your next offline-first PWA? Let\\u2019s get coding!\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["JS","TS"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADM0lEQVQ4y5WSXUzTVxiHz7+lUGkFrThrywC1EKFUojiEyYe4G5fUiUYUCDJQgeGUGKgRdHNxF02cuxE3P8LlvHFuOvwIGowIUiPSK7WYqEBgVflYZrIt8/LZ6V9KoALOi1/OOe8573PeL6HRKAghUBTlLQXskxW0azQa9RwWFoZWqw21T3UIhfwfhQTx9oNgBO8JCmr6h++CzPLu/VILRP+O0swc0WwNCjRkxghDL4KRBBToYsBmNBpxu938evEiZrN5tvLMnN7k1WKxkJyczPnzP3PkyDcUFRWRmJg40cRpuzz5N0VMBer1eux2O/X19Zw40URrayuFhYVTgBNzOBkUTDV0hBwOB8ePf09TUxNtbTc5evRbNjo3TpRkxpRDxyLo4HK5OHP6DKd+PMW9e93U1NTgdDoJj4iYDqiEgN5EGehk4Jyfn8/Jkz9w7Nh3XLjwC1euXCV7bTYFBQXodLrpgWK8ZkFIULZlNs79dI6GhkYuXfqNlpbL7N27j9TUVIqLSzCZTON+OgkPHwcqslbaN4C0NAd7vvwCW+JS6ur247nbRXPzWdpv36Kjo53y8jI2FXzGunW55EnFxcWiaARW62JZZzsiUslBJz5GK7LQiEwMmnzWrNhHXoaLLZ+61f3K5VVs3uCWtgPq3mGrwBztJFLJZY7IRi9l0OYRY9iASLLUkuU4TPryg2SkNJJmc2GPryXOVEXqkloyHQ3Em6qxJ9TiWLqfD+ZUyI+3SkgxUWKHVJmquXJvFKWI2Hk7WbuygZxVjeSkN7I+8yuyVhyUH9SRYT9A7upDfJTiIjf9MJ9kfc3qlHqSrHtIiKkkUmxTZRDb1dUoihCWqAoWzy0nRl/KIsPnE3tr9E4+nL9bqlJGu1velWGN2kX8gkqWLKwmdt4uzMYKFup3YAovYUFEKdFaCfT7x3j6ZAiv9yE99x/IkWjjTmc3ni4v167e5HLLDdX+8METfI+e0evrwyc10P9Cnp/S2dFN+y0PHo9XDnwnYnBoEL//dx4/7mVkZJixsVF17et7hq/Xx/XrrQwM9PP69b+8evUnf//zl9rxHu99hkdeMvbHKM+f+1X/Icn6DwvebGh8eNoPAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/53920bf873a1ff67b3b19c0f6ad43482/a1946/pwacover.png","srcSet":"/static/53920bf873a1ff67b3b19c0f6ad43482/5b37e/pwacover.png 236w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/49058/pwacover.png 472w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/a1946/pwacover.png 944w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/6050d/pwacover.png 1200w","srcWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/99fbb/pwacover.webp","srcSetWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/77392/pwacover.webp 236w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/1f177/pwacover.webp 472w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/99fbb/pwacover.webp 944w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/9000d/pwacover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20180v181l28-1c25%200%2027%200%2029%202h5l5-1h48a140%20140%200%200128%200%20376%20376%200%200166%201c1-2%2011-2%2072-2a8952%208952%200%2001119%201l1-182V0h-45a244%20244%200%2000-47%201L154%200H0v180m230-54c-6%202-19%2013-15%2013v2c-2%204%200%203%202-1%202-3%203-4%207-4s5%200%204%201-1%201%201%201h1l1%202%201-1c-2-2%201-1%203%201l1%202%201%202%201-1c-2-2%200-1%203%201%202%202%203%203%202%204h2c1%209%203%2015%204%2013h1l1%201%201-1%202-2c3-2%204-2%204-1v1l1-2c-1%200%200-2%202-3s3-2%204-1l-1%201v2h-3v1c2-1%202%202%200%204v2l-1%201-1-2-5%201-6%201v6c-1%201-1%202%201%202%204%201%201%204-8%207-5%203-10%204-13%205-3%200-4%200-2-1%202%200%202%200-3-2-7-2-9%200-4%205l4%204%203%201c3%200%203%200%201-1s-2-1%202-1l8-2h7l-2%201h2l-2%201c-2%201-5%202-6%201-2%200-2%200-1%201s1%201-1%201h-3c-1%201%200%201%201%201l4%202c1%202%201%202-1%202l-4-2-6-2h-2l-1-1c0-3-1-3-5%200-3%203-3%203-1%204v4c-2%202-3%2011-1%2010%201-1%202%201%202%204l1%203v5l-1-3-1-2-1-1c0-2-2-1-3%200l-1%203v1l-1-2c-1-3-3-3-4%201l-5%205c-5%204-13%2011-13%2013l-2%201c-2%201-6%209-5%2010l-1%202-1%206c0%206-4%208-8%206l-1-1c2%200%202%200%201-2l5%201%201-1-4-2c-4-1-7%200-5%203%200%202-5%204-11%206l-2%202c0%202-18%2010-23%2010h-5l-2%201-1-1c1-1-2-4-5-5s-3-1-4%201c0%202-1%201-6-4-5-6-6-6-10-6-6-1-6%201-3%209%202%203%203%204%203%202%200-3%201-2%201%202l2%204%201%203%201%202v-4c0-3%200-3%201-1l2%201%201%202c0%202%200%202%202%201l1-1c0%203%202%202%204-1%201-2%201-2%201%200h1v1l1%202c2%200%201-4-1-6l-1-2%202%201c1%201%201%201%201-1l1-2v3h1c1-2%202%202%202%205v1h10c0%202%204%201%205-1%201-1%201-1%201%201h2l1-1c0%202%2016%202%2016%200h1c1%203%203%202%204-1%200-2%200-2%201%200%201%201%201%201%201-1%200-4%202-4%202%201v4l1-4v-3l2%203c2%203%202%203%203%202h4v-2l1%202c1%202%201%200%201-8%200-5%200-5%201-3s2%202%202%201c1-1%201-1%200%200l2%203v-2c0-2%201-2%202%202%203%208%204%207%201-1-2-7-2-10%200-5l2%202%201%201h1c1-2%201-3-2-7l-2-4%202-2%202-5v-6c2%201%202%201%202-1v-1c1%202%202%202%202%201%201-1%201%200%201%201%200%202%200%202%201%201v-5c2%201%201-1%200-2-2-1-3-3-1-2l1-2c-1-3%201-3%202%200%201%202%201%202%202%201%201-3%200-5-1-3h-1c1-1%200-2-1-3-2-1-1-2%202-2%202%201%203%202%204%205l2%203%201%201v-11l1-2%201%204%201%208c1%202%201%203-2%205-5%202-5%205%200%206%202%200%203%200%202-2h2c0-2%200-2%201-1l1%201v-14c0-7%200-7%202-6%201%201%203%202%203%204l3%203%202%203c0%202%201%204%203%205%203%202%204%206%201%207v-2c0-2%200-3-3-2-3%200-3%201-1%201l2%201-1%201h-3l-1%201v-1l-1-1-2%203c0%202%200%202-1%200s-3-3-4-1l-4%201-2%201h-1c-1-2-8-1-9%201l-2%201-3%203c-3%204-3%204-1%207%203%205%204%206%204%201v-1l1%201c0-3%203%203%203%205%200%204-5%2010-6%207-1-1-1-1-1%201%201%201%200%202-2%203-2%202-1%202%2014%202l17-1h1c1%201%203%201%204-1s1-2%201%200c1%202%202%202%206%202l6-1h1l1-1%202-1h1c2-2%201-7%200-7v-1l-1-1h-2c-2-2-7-3-7-2h-2l-7-1-4%201%203-1c4-2%205-2%203-3v-3c1-3%203-2%202%202v2c2%200%204-3%203-4l1-1%201%201h1c1-2%201-2%202-1h1c0-1%200-2%201-1l1-1h1l1%201-1%201v2h1c0-2%200-2%201%200%201%203%202%203%201%200l1-2h3l-1-2c-1-1-1-3%201-3l1%201h2l2%201c1%201%201%200%201-1%200-2%200-2-1-1h-1c2-5-8-13-14-13-2%200-3%200-2-1l-1-2-3-2-4-3h-1v-1l2-1h1l-2-1-1-2%201-2%201%201c1%201%201%201%201-1l1-6v1l2%202c3-1%204%208%201%2010v3c2%201%202%201%202-1v-2l1%202%203%202h1l1%201h-1l-3%201%204%201h3c-1%201-1%201%201%201h1l1%202%201-1v-1l2%201-1%201%201%203%203%201%202%201c1%202%202%202%202%201h1c1%201%201%201%202-1%200-2%200-2%201-1h1c0-2%200-2%202%200%202%203%203%201%200-2v-2l-2-2v-2h3l1-1c-2-2%201-1%203%202l3%202-2-3c-2-3%200-3%203%200%205%203%205-1%201-4l-3-3%204%202%202%202-2-3-2-2%202%201c2%201%201%200-2-3l-3-4%202%201%201%201%201-1v-1c2-1-2-3-7-4-4-1-4-1%201-1%207%201%209%200%206-2l-1-1%203%201c2%203%202%200%200-4-2-3%201-3%204%201l1%202%202-2%201-3v-3h-2v-1l-5-2-6-2v-1c1-1%201-1-1-1h-2v-1l-5-1-4%201c-2%202-2%202-2-1%200-2%201-3%2010-1%206%202%208%201%208-3l1%201v3l1%202h5l2%201h2l-1-2c-2-2-3-5-1-3v-1l1-1c1%201%202%200%203-1h1l1-1-2-1v-1c0-2%200-2-1-1h-1c1-2-1-3-5-6-6-5-14-6-18-4h-4c-1-1-1-1%201-1l3-3h-2l-4%201-2%201h-3l-1-1c-5%200-5%200-3%201v1l-3-1%205-3%2010-5%204-3%201%203c1%203%205%204%209%202%204-1%204-3%201-2-2%200-2%200-1-1%202-1%202-1%201-2v-1l1-1h-2v-10l-1-1%201-3h1l1%201v10h4l5%201c1%202%201%202-2%202s-4%200-4%202l2%201v1c-3%202-2%203%201%202%201%200%202%200%201%201-4%201-1%203%203%203h5l-4%202-2%201%202%201c-1%201%200%201%202%201l4%201v1c-1%200-2%200-1%201l4%201h4l-3-1-3-1h3c1%200%202%200%201-1s-2-10%200-10l1%205%201%205%201-2-1-10v-8h-4l-4%201v-4c0-3%200-3%201-1s1%202%201-1l1-3v3c0%202%200%203%203%203%202%200%203%201%203%204%201%203%201%203%202%201l1-3v-3c-1%200-1-1%201-1h3v2l1-2c0-2-1-2-7-2-8%200-8-2%200-2%207%200%208-1%204-4-5-3-9-3-17-2h-8l-4-1c-4%200-7%203-7%206h2l-1%202-3%202c-1%202-2%202-3%202-3-1-2-2%201-2l1-4%201-3%201-1h-3c0-1%201-2%203-2%201-1%202-1%201-2l-1-2c0-2%200-2%201-1h1v-1c2%202%203%201%201-1-1-2-2-3-2-1-1%201-1%201-1-1%201-2-4-8-10-12-7-5-20-7-30-5m20%2060l-2%201c0%202-3%204-4%203-2%200-2%200-1%201%202%201%202%201-1%202l-1%201%202%201h-2v1c2%201%200%202-8%203-5%200-7%202-2%201%203%200%203%200%202%201-2%201-1%201%202%201h5v4c0%203%200%203-1%202l-2-4c-1-1-1%200-1%203%200%202%200%203-1%202v2l-1%204-1-4c0-3%200-3-1-1l-1%202-1%201%201%201h1l-2%201-1-5v-2l-1%2010c0%205%200%208%201%207l2-1v-3c-2%200-1-3%201-3l5-1c3-1%204%200%203%207l1%205v-1c0-2%202-4%203-2v3c2%200%205%203%205%204l-2%201h-2l-2%201c0%201-1%201%200%200l-2-1-3%201h2c1%200%202%202%200%204v1h1l1%201%201-2v-2h1c0%202%200%202%202%202l2-1-1-2c-1-1-1-1%201-1%203%201%203%201%203-1l1-3c1-3%201-8-2-8-2%201-6-7-6-17v-5c0%202%200%202%202-1%200-2%201-3%202-3l-1%203v17c1%201%201-1%201-6v-7c0-3%200-3%201-2v-1c0-3%200-3%201-2s1%201%201-1v-1h1c-1-1%200-3%201-4l2-2-4%202-2%201c1-1%201-1%200%200-3%201-2-3%201-6s3-4%200-2M15%20314l1%208%201-3c0-2%200-3%202-3%208%200%208-9%200-10h-4v8m128-6l2%206c2%208%202%208%204%208l2-6c2-7%202-7%204%200%201%207%203%208%205%202a3102%203102%200%2001-1-5c-1%206-2%206-4-3-1-6-3-5-5%203l-1%206-2-5-3-8-1%202m34%206v8h4c4%200%205-1%206-3%202-4%200-9-5-8-3%200-3-1-3-3l-1-2-1%208m-140-2c-2%201-2%206-1%208%202%203%207%202%209-1%203-6-4-12-8-7m13%200c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m162%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8m14%200l1%208%201-2c0-2%200-3%203-2%203%200%205-2%205-6s-2-6-7-6l-3%201v7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADM0lEQVQ4y5WSXUzTVxiHz7+lUGkFrThrywC1EKFUojiEyYe4G5fUiUYUCDJQgeGUGKgRdHNxF02cuxE3P8LlvHFuOvwIGowIUiPSK7WYqEBgVflYZrIt8/LZ6V9KoALOi1/OOe8573PeL6HRKAghUBTlLQXskxW0azQa9RwWFoZWqw21T3UIhfwfhQTx9oNgBO8JCmr6h++CzPLu/VILRP+O0swc0WwNCjRkxghDL4KRBBToYsBmNBpxu938evEiZrN5tvLMnN7k1WKxkJyczPnzP3PkyDcUFRWRmJg40cRpuzz5N0VMBer1eux2O/X19Zw40URrayuFhYVTgBNzOBkUTDV0hBwOB8ePf09TUxNtbTc5evRbNjo3TpRkxpRDxyLo4HK5OHP6DKd+PMW9e93U1NTgdDoJj4iYDqiEgN5EGehk4Jyfn8/Jkz9w7Nh3XLjwC1euXCV7bTYFBQXodLrpgWK8ZkFIULZlNs79dI6GhkYuXfqNlpbL7N27j9TUVIqLSzCZTON+OgkPHwcqslbaN4C0NAd7vvwCW+JS6ur247nbRXPzWdpv36Kjo53y8jI2FXzGunW55EnFxcWiaARW62JZZzsiUslBJz5GK7LQiEwMmnzWrNhHXoaLLZ+61f3K5VVs3uCWtgPq3mGrwBztJFLJZY7IRi9l0OYRY9iASLLUkuU4TPryg2SkNJJmc2GPryXOVEXqkloyHQ3Em6qxJ9TiWLqfD+ZUyI+3SkgxUWKHVJmquXJvFKWI2Hk7WbuygZxVjeSkN7I+8yuyVhyUH9SRYT9A7upDfJTiIjf9MJ9kfc3qlHqSrHtIiKkkUmxTZRDb1dUoihCWqAoWzy0nRl/KIsPnE3tr9E4+nL9bqlJGu1velWGN2kX8gkqWLKwmdt4uzMYKFup3YAovYUFEKdFaCfT7x3j6ZAiv9yE99x/IkWjjTmc3ni4v167e5HLLDdX+8METfI+e0evrwyc10P9Cnp/S2dFN+y0PHo9XDnwnYnBoEL//dx4/7mVkZJixsVF17et7hq/Xx/XrrQwM9PP69b+8evUnf//zl9rxHu99hkdeMvbHKM+f+1X/Icn6DwvebGh8eNoPAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/53920bf873a1ff67b3b19c0f6ad43482/3ddd4/pwacover.png","srcSet":"/static/53920bf873a1ff67b3b19c0f6ad43482/078a8/pwacover.png 163w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/e56da/pwacover.png 327w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/3ddd4/pwacover.png 653w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/c5cc7/pwacover.png 980w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/6050d/pwacover.png 1200w","srcWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/0acdf/pwacover.webp","srcSetWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/ac59e/pwacover.webp 163w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/7660b/pwacover.webp 327w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/0acdf/pwacover.webp 653w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/75470/pwacover.webp 980w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/9000d/pwacover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20180v181l28-1c25%200%2027%200%2029%202h5l5-1h48a140%20140%200%200128%200%20376%20376%200%200166%201c1-2%2011-2%2072-2a8952%208952%200%2001119%201l1-182V0h-45a244%20244%200%2000-47%201L154%200H0v180m230-54c-6%202-19%2013-15%2013v2c-2%204%200%203%202-1%202-3%203-4%207-4s5%200%204%201-1%201%201%201h1l1%202%201-1c-2-2%201-1%203%201l1%202%201%202%201-1c-2-2%200-1%203%201%202%202%203%203%202%204h2c1%209%203%2015%204%2013h1l1%201%201-1%202-2c3-2%204-2%204-1v1l1-2c-1%200%200-2%202-3s3-2%204-1l-1%201v2h-3v1c2-1%202%202%200%204v2l-1%201-1-2-5%201-6%201v6c-1%201-1%202%201%202%204%201%201%204-8%207-5%203-10%204-13%205-3%200-4%200-2-1%202%200%202%200-3-2-7-2-9%200-4%205l4%204%203%201c3%200%203%200%201-1s-2-1%202-1l8-2h7l-2%201h2l-2%201c-2%201-5%202-6%201-2%200-2%200-1%201s1%201-1%201h-3c-1%201%200%201%201%201l4%202c1%202%201%202-1%202l-4-2-6-2h-2l-1-1c0-3-1-3-5%200-3%203-3%203-1%204v4c-2%202-3%2011-1%2010%201-1%202%201%202%204l1%203v5l-1-3-1-2-1-1c0-2-2-1-3%200l-1%203v1l-1-2c-1-3-3-3-4%201l-5%205c-5%204-13%2011-13%2013l-2%201c-2%201-6%209-5%2010l-1%202-1%206c0%206-4%208-8%206l-1-1c2%200%202%200%201-2l5%201%201-1-4-2c-4-1-7%200-5%203%200%202-5%204-11%206l-2%202c0%202-18%2010-23%2010h-5l-2%201-1-1c1-1-2-4-5-5s-3-1-4%201c0%202-1%201-6-4-5-6-6-6-10-6-6-1-6%201-3%209%202%203%203%204%203%202%200-3%201-2%201%202l2%204%201%203%201%202v-4c0-3%200-3%201-1l2%201%201%202c0%202%200%202%202%201l1-1c0%203%202%202%204-1%201-2%201-2%201%200h1v1l1%202c2%200%201-4-1-6l-1-2%202%201c1%201%201%201%201-1l1-2v3h1c1-2%202%202%202%205v1h10c0%202%204%201%205-1%201-1%201-1%201%201h2l1-1c0%202%2016%202%2016%200h1c1%203%203%202%204-1%200-2%200-2%201%200%201%201%201%201%201-1%200-4%202-4%202%201v4l1-4v-3l2%203c2%203%202%203%203%202h4v-2l1%202c1%202%201%200%201-8%200-5%200-5%201-3s2%202%202%201c1-1%201-1%200%200l2%203v-2c0-2%201-2%202%202%203%208%204%207%201-1-2-7-2-10%200-5l2%202%201%201h1c1-2%201-3-2-7l-2-4%202-2%202-5v-6c2%201%202%201%202-1v-1c1%202%202%202%202%201%201-1%201%200%201%201%200%202%200%202%201%201v-5c2%201%201-1%200-2-2-1-3-3-1-2l1-2c-1-3%201-3%202%200%201%202%201%202%202%201%201-3%200-5-1-3h-1c1-1%200-2-1-3-2-1-1-2%202-2%202%201%203%202%204%205l2%203%201%201v-11l1-2%201%204%201%208c1%202%201%203-2%205-5%202-5%205%200%206%202%200%203%200%202-2h2c0-2%200-2%201-1l1%201v-14c0-7%200-7%202-6%201%201%203%202%203%204l3%203%202%203c0%202%201%204%203%205%203%202%204%206%201%207v-2c0-2%200-3-3-2-3%200-3%201-1%201l2%201-1%201h-3l-1%201v-1l-1-1-2%203c0%202%200%202-1%200s-3-3-4-1l-4%201-2%201h-1c-1-2-8-1-9%201l-2%201-3%203c-3%204-3%204-1%207%203%205%204%206%204%201v-1l1%201c0-3%203%203%203%205%200%204-5%2010-6%207-1-1-1-1-1%201%201%201%200%202-2%203-2%202-1%202%2014%202l17-1h1c1%201%203%201%204-1s1-2%201%200c1%202%202%202%206%202l6-1h1l1-1%202-1h1c2-2%201-7%200-7v-1l-1-1h-2c-2-2-7-3-7-2h-2l-7-1-4%201%203-1c4-2%205-2%203-3v-3c1-3%203-2%202%202v2c2%200%204-3%203-4l1-1%201%201h1c1-2%201-2%202-1h1c0-1%200-2%201-1l1-1h1l1%201-1%201v2h1c0-2%200-2%201%200%201%203%202%203%201%200l1-2h3l-1-2c-1-1-1-3%201-3l1%201h2l2%201c1%201%201%200%201-1%200-2%200-2-1-1h-1c2-5-8-13-14-13-2%200-3%200-2-1l-1-2-3-2-4-3h-1v-1l2-1h1l-2-1-1-2%201-2%201%201c1%201%201%201%201-1l1-6v1l2%202c3-1%204%208%201%2010v3c2%201%202%201%202-1v-2l1%202%203%202h1l1%201h-1l-3%201%204%201h3c-1%201-1%201%201%201h1l1%202%201-1v-1l2%201-1%201%201%203%203%201%202%201c1%202%202%202%202%201h1c1%201%201%201%202-1%200-2%200-2%201-1h1c0-2%200-2%202%200%202%203%203%201%200-2v-2l-2-2v-2h3l1-1c-2-2%201-1%203%202l3%202-2-3c-2-3%200-3%203%200%205%203%205-1%201-4l-3-3%204%202%202%202-2-3-2-2%202%201c2%201%201%200-2-3l-3-4%202%201%201%201%201-1v-1c2-1-2-3-7-4-4-1-4-1%201-1%207%201%209%200%206-2l-1-1%203%201c2%203%202%200%200-4-2-3%201-3%204%201l1%202%202-2%201-3v-3h-2v-1l-5-2-6-2v-1c1-1%201-1-1-1h-2v-1l-5-1-4%201c-2%202-2%202-2-1%200-2%201-3%2010-1%206%202%208%201%208-3l1%201v3l1%202h5l2%201h2l-1-2c-2-2-3-5-1-3v-1l1-1c1%201%202%200%203-1h1l1-1-2-1v-1c0-2%200-2-1-1h-1c1-2-1-3-5-6-6-5-14-6-18-4h-4c-1-1-1-1%201-1l3-3h-2l-4%201-2%201h-3l-1-1c-5%200-5%200-3%201v1l-3-1%205-3%2010-5%204-3%201%203c1%203%205%204%209%202%204-1%204-3%201-2-2%200-2%200-1-1%202-1%202-1%201-2v-1l1-1h-2v-10l-1-1%201-3h1l1%201v10h4l5%201c1%202%201%202-2%202s-4%200-4%202l2%201v1c-3%202-2%203%201%202%201%200%202%200%201%201-4%201-1%203%203%203h5l-4%202-2%201%202%201c-1%201%200%201%202%201l4%201v1c-1%200-2%200-1%201l4%201h4l-3-1-3-1h3c1%200%202%200%201-1s-2-10%200-10l1%205%201%205%201-2-1-10v-8h-4l-4%201v-4c0-3%200-3%201-1s1%202%201-1l1-3v3c0%202%200%203%203%203%202%200%203%201%203%204%201%203%201%203%202%201l1-3v-3c-1%200-1-1%201-1h3v2l1-2c0-2-1-2-7-2-8%200-8-2%200-2%207%200%208-1%204-4-5-3-9-3-17-2h-8l-4-1c-4%200-7%203-7%206h2l-1%202-3%202c-1%202-2%202-3%202-3-1-2-2%201-2l1-4%201-3%201-1h-3c0-1%201-2%203-2%201-1%202-1%201-2l-1-2c0-2%200-2%201-1h1v-1c2%202%203%201%201-1-1-2-2-3-2-1-1%201-1%201-1-1%201-2-4-8-10-12-7-5-20-7-30-5m20%2060l-2%201c0%202-3%204-4%203-2%200-2%200-1%201%202%201%202%201-1%202l-1%201%202%201h-2v1c2%201%200%202-8%203-5%200-7%202-2%201%203%200%203%200%202%201-2%201-1%201%202%201h5v4c0%203%200%203-1%202l-2-4c-1-1-1%200-1%203%200%202%200%203-1%202v2l-1%204-1-4c0-3%200-3-1-1l-1%202-1%201%201%201h1l-2%201-1-5v-2l-1%2010c0%205%200%208%201%207l2-1v-3c-2%200-1-3%201-3l5-1c3-1%204%200%203%207l1%205v-1c0-2%202-4%203-2v3c2%200%205%203%205%204l-2%201h-2l-2%201c0%201-1%201%200%200l-2-1-3%201h2c1%200%202%202%200%204v1h1l1%201%201-2v-2h1c0%202%200%202%202%202l2-1-1-2c-1-1-1-1%201-1%203%201%203%201%203-1l1-3c1-3%201-8-2-8-2%201-6-7-6-17v-5c0%202%200%202%202-1%200-2%201-3%202-3l-1%203v17c1%201%201-1%201-6v-7c0-3%200-3%201-2v-1c0-3%200-3%201-2s1%201%201-1v-1h1c-1-1%200-3%201-4l2-2-4%202-2%201c1-1%201-1%200%200-3%201-2-3%201-6s3-4%200-2M15%20314l1%208%201-3c0-2%200-3%202-3%208%200%208-9%200-10h-4v8m128-6l2%206c2%208%202%208%204%208l2-6c2-7%202-7%204%200%201%207%203%208%205%202a3102%203102%200%2001-1-5c-1%206-2%206-4-3-1-6-3-5-5%203l-1%206-2-5-3-8-1%202m34%206v8h4c4%200%205-1%206-3%202-4%200-9-5-8-3%200-3-1-3-3l-1-2-1%208m-140-2c-2%201-2%206-1%208%202%203%207%202%209-1%203-6-4-12-8-7m13%200c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m162%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8m14%200l1%208%201-2c0-2%200-3%203-2%203%200%205-2%205-6s-2-6-7-6l-3%201v7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADM0lEQVQ4y5WSXUzTVxiHz7+lUGkFrThrywC1EKFUojiEyYe4G5fUiUYUCDJQgeGUGKgRdHNxF02cuxE3P8LlvHFuOvwIGowIUiPSK7WYqEBgVflYZrIt8/LZ6V9KoALOi1/OOe8573PeL6HRKAghUBTlLQXskxW0azQa9RwWFoZWqw21T3UIhfwfhQTx9oNgBO8JCmr6h++CzPLu/VILRP+O0swc0WwNCjRkxghDL4KRBBToYsBmNBpxu938evEiZrN5tvLMnN7k1WKxkJyczPnzP3PkyDcUFRWRmJg40cRpuzz5N0VMBer1eux2O/X19Zw40URrayuFhYVTgBNzOBkUTDV0hBwOB8ePf09TUxNtbTc5evRbNjo3TpRkxpRDxyLo4HK5OHP6DKd+PMW9e93U1NTgdDoJj4iYDqiEgN5EGehk4Jyfn8/Jkz9w7Nh3XLjwC1euXCV7bTYFBQXodLrpgWK8ZkFIULZlNs79dI6GhkYuXfqNlpbL7N27j9TUVIqLSzCZTON+OgkPHwcqslbaN4C0NAd7vvwCW+JS6ur247nbRXPzWdpv36Kjo53y8jI2FXzGunW55EnFxcWiaARW62JZZzsiUslBJz5GK7LQiEwMmnzWrNhHXoaLLZ+61f3K5VVs3uCWtgPq3mGrwBztJFLJZY7IRi9l0OYRY9iASLLUkuU4TPryg2SkNJJmc2GPryXOVEXqkloyHQ3Em6qxJ9TiWLqfD+ZUyI+3SkgxUWKHVJmquXJvFKWI2Hk7WbuygZxVjeSkN7I+8yuyVhyUH9SRYT9A7upDfJTiIjf9MJ9kfc3qlHqSrHtIiKkkUmxTZRDb1dUoihCWqAoWzy0nRl/KIsPnE3tr9E4+nL9bqlJGu1velWGN2kX8gkqWLKwmdt4uzMYKFup3YAovYUFEKdFaCfT7x3j6ZAiv9yE99x/IkWjjTmc3ni4v167e5HLLDdX+8METfI+e0evrwyc10P9Cnp/S2dFN+y0PHo9XDnwnYnBoEL//dx4/7mVkZJixsVF17et7hq/Xx/XrrQwM9PP69b+8evUnf//zl9rxHu99hkdeMvbHKM+f+1X/Icn6DwvebGh8eNoPAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/53920bf873a1ff67b3b19c0f6ad43482/502b1/pwacover.png","srcSet":"/static/53920bf873a1ff67b3b19c0f6ad43482/f2e6d/pwacover.png 114w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/4ddba/pwacover.png 229w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/502b1/pwacover.png 457w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/7ddc2/pwacover.png 686w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/435bf/pwacover.png 914w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/6050d/pwacover.png 1200w","srcWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/15384/pwacover.webp","srcSetWebp":"/static/53920bf873a1ff67b3b19c0f6ad43482/31fce/pwacover.webp 114w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/e3e25/pwacover.webp 229w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/15384/pwacover.webp 457w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/0258d/pwacover.webp 686w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/64ea2/pwacover.webp 914w,\n/static/53920bf873a1ff67b3b19c0f6ad43482/9000d/pwacover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20180v181l28-1c25%200%2027%200%2029%202h5l5-1h48a140%20140%200%200128%200%20376%20376%200%200166%201c1-2%2011-2%2072-2a8952%208952%200%2001119%201l1-182V0h-45a244%20244%200%2000-47%201L154%200H0v180m230-54c-6%202-19%2013-15%2013v2c-2%204%200%203%202-1%202-3%203-4%207-4s5%200%204%201-1%201%201%201h1l1%202%201-1c-2-2%201-1%203%201l1%202%201%202%201-1c-2-2%200-1%203%201%202%202%203%203%202%204h2c1%209%203%2015%204%2013h1l1%201%201-1%202-2c3-2%204-2%204-1v1l1-2c-1%200%200-2%202-3s3-2%204-1l-1%201v2h-3v1c2-1%202%202%200%204v2l-1%201-1-2-5%201-6%201v6c-1%201-1%202%201%202%204%201%201%204-8%207-5%203-10%204-13%205-3%200-4%200-2-1%202%200%202%200-3-2-7-2-9%200-4%205l4%204%203%201c3%200%203%200%201-1s-2-1%202-1l8-2h7l-2%201h2l-2%201c-2%201-5%202-6%201-2%200-2%200-1%201s1%201-1%201h-3c-1%201%200%201%201%201l4%202c1%202%201%202-1%202l-4-2-6-2h-2l-1-1c0-3-1-3-5%200-3%203-3%203-1%204v4c-2%202-3%2011-1%2010%201-1%202%201%202%204l1%203v5l-1-3-1-2-1-1c0-2-2-1-3%200l-1%203v1l-1-2c-1-3-3-3-4%201l-5%205c-5%204-13%2011-13%2013l-2%201c-2%201-6%209-5%2010l-1%202-1%206c0%206-4%208-8%206l-1-1c2%200%202%200%201-2l5%201%201-1-4-2c-4-1-7%200-5%203%200%202-5%204-11%206l-2%202c0%202-18%2010-23%2010h-5l-2%201-1-1c1-1-2-4-5-5s-3-1-4%201c0%202-1%201-6-4-5-6-6-6-10-6-6-1-6%201-3%209%202%203%203%204%203%202%200-3%201-2%201%202l2%204%201%203%201%202v-4c0-3%200-3%201-1l2%201%201%202c0%202%200%202%202%201l1-1c0%203%202%202%204-1%201-2%201-2%201%200h1v1l1%202c2%200%201-4-1-6l-1-2%202%201c1%201%201%201%201-1l1-2v3h1c1-2%202%202%202%205v1h10c0%202%204%201%205-1%201-1%201-1%201%201h2l1-1c0%202%2016%202%2016%200h1c1%203%203%202%204-1%200-2%200-2%201%200%201%201%201%201%201-1%200-4%202-4%202%201v4l1-4v-3l2%203c2%203%202%203%203%202h4v-2l1%202c1%202%201%200%201-8%200-5%200-5%201-3s2%202%202%201c1-1%201-1%200%200l2%203v-2c0-2%201-2%202%202%203%208%204%207%201-1-2-7-2-10%200-5l2%202%201%201h1c1-2%201-3-2-7l-2-4%202-2%202-5v-6c2%201%202%201%202-1v-1c1%202%202%202%202%201%201-1%201%200%201%201%200%202%200%202%201%201v-5c2%201%201-1%200-2-2-1-3-3-1-2l1-2c-1-3%201-3%202%200%201%202%201%202%202%201%201-3%200-5-1-3h-1c1-1%200-2-1-3-2-1-1-2%202-2%202%201%203%202%204%205l2%203%201%201v-11l1-2%201%204%201%208c1%202%201%203-2%205-5%202-5%205%200%206%202%200%203%200%202-2h2c0-2%200-2%201-1l1%201v-14c0-7%200-7%202-6%201%201%203%202%203%204l3%203%202%203c0%202%201%204%203%205%203%202%204%206%201%207v-2c0-2%200-3-3-2-3%200-3%201-1%201l2%201-1%201h-3l-1%201v-1l-1-1-2%203c0%202%200%202-1%200s-3-3-4-1l-4%201-2%201h-1c-1-2-8-1-9%201l-2%201-3%203c-3%204-3%204-1%207%203%205%204%206%204%201v-1l1%201c0-3%203%203%203%205%200%204-5%2010-6%207-1-1-1-1-1%201%201%201%200%202-2%203-2%202-1%202%2014%202l17-1h1c1%201%203%201%204-1s1-2%201%200c1%202%202%202%206%202l6-1h1l1-1%202-1h1c2-2%201-7%200-7v-1l-1-1h-2c-2-2-7-3-7-2h-2l-7-1-4%201%203-1c4-2%205-2%203-3v-3c1-3%203-2%202%202v2c2%200%204-3%203-4l1-1%201%201h1c1-2%201-2%202-1h1c0-1%200-2%201-1l1-1h1l1%201-1%201v2h1c0-2%200-2%201%200%201%203%202%203%201%200l1-2h3l-1-2c-1-1-1-3%201-3l1%201h2l2%201c1%201%201%200%201-1%200-2%200-2-1-1h-1c2-5-8-13-14-13-2%200-3%200-2-1l-1-2-3-2-4-3h-1v-1l2-1h1l-2-1-1-2%201-2%201%201c1%201%201%201%201-1l1-6v1l2%202c3-1%204%208%201%2010v3c2%201%202%201%202-1v-2l1%202%203%202h1l1%201h-1l-3%201%204%201h3c-1%201-1%201%201%201h1l1%202%201-1v-1l2%201-1%201%201%203%203%201%202%201c1%202%202%202%202%201h1c1%201%201%201%202-1%200-2%200-2%201-1h1c0-2%200-2%202%200%202%203%203%201%200-2v-2l-2-2v-2h3l1-1c-2-2%201-1%203%202l3%202-2-3c-2-3%200-3%203%200%205%203%205-1%201-4l-3-3%204%202%202%202-2-3-2-2%202%201c2%201%201%200-2-3l-3-4%202%201%201%201%201-1v-1c2-1-2-3-7-4-4-1-4-1%201-1%207%201%209%200%206-2l-1-1%203%201c2%203%202%200%200-4-2-3%201-3%204%201l1%202%202-2%201-3v-3h-2v-1l-5-2-6-2v-1c1-1%201-1-1-1h-2v-1l-5-1-4%201c-2%202-2%202-2-1%200-2%201-3%2010-1%206%202%208%201%208-3l1%201v3l1%202h5l2%201h2l-1-2c-2-2-3-5-1-3v-1l1-1c1%201%202%200%203-1h1l1-1-2-1v-1c0-2%200-2-1-1h-1c1-2-1-3-5-6-6-5-14-6-18-4h-4c-1-1-1-1%201-1l3-3h-2l-4%201-2%201h-3l-1-1c-5%200-5%200-3%201v1l-3-1%205-3%2010-5%204-3%201%203c1%203%205%204%209%202%204-1%204-3%201-2-2%200-2%200-1-1%202-1%202-1%201-2v-1l1-1h-2v-10l-1-1%201-3h1l1%201v10h4l5%201c1%202%201%202-2%202s-4%200-4%202l2%201v1c-3%202-2%203%201%202%201%200%202%200%201%201-4%201-1%203%203%203h5l-4%202-2%201%202%201c-1%201%200%201%202%201l4%201v1c-1%200-2%200-1%201l4%201h4l-3-1-3-1h3c1%200%202%200%201-1s-2-10%200-10l1%205%201%205%201-2-1-10v-8h-4l-4%201v-4c0-3%200-3%201-1s1%202%201-1l1-3v3c0%202%200%203%203%203%202%200%203%201%203%204%201%203%201%203%202%201l1-3v-3c-1%200-1-1%201-1h3v2l1-2c0-2-1-2-7-2-8%200-8-2%200-2%207%200%208-1%204-4-5-3-9-3-17-2h-8l-4-1c-4%200-7%203-7%206h2l-1%202-3%202c-1%202-2%202-3%202-3-1-2-2%201-2l1-4%201-3%201-1h-3c0-1%201-2%203-2%201-1%202-1%201-2l-1-2c0-2%200-2%201-1h1v-1c2%202%203%201%201-1-1-2-2-3-2-1-1%201-1%201-1-1%201-2-4-8-10-12-7-5-20-7-30-5m20%2060l-2%201c0%202-3%204-4%203-2%200-2%200-1%201%202%201%202%201-1%202l-1%201%202%201h-2v1c2%201%200%202-8%203-5%200-7%202-2%201%203%200%203%200%202%201-2%201-1%201%202%201h5v4c0%203%200%203-1%202l-2-4c-1-1-1%200-1%203%200%202%200%203-1%202v2l-1%204-1-4c0-3%200-3-1-1l-1%202-1%201%201%201h1l-2%201-1-5v-2l-1%2010c0%205%200%208%201%207l2-1v-3c-2%200-1-3%201-3l5-1c3-1%204%200%203%207l1%205v-1c0-2%202-4%203-2v3c2%200%205%203%205%204l-2%201h-2l-2%201c0%201-1%201%200%200l-2-1-3%201h2c1%200%202%202%200%204v1h1l1%201%201-2v-2h1c0%202%200%202%202%202l2-1-1-2c-1-1-1-1%201-1%203%201%203%201%203-1l1-3c1-3%201-8-2-8-2%201-6-7-6-17v-5c0%202%200%202%202-1%200-2%201-3%202-3l-1%203v17c1%201%201-1%201-6v-7c0-3%200-3%201-2v-1c0-3%200-3%201-2s1%201%201-1v-1h1c-1-1%200-3%201-4l2-2-4%202-2%201c1-1%201-1%200%200-3%201-2-3%201-6s3-4%200-2M15%20314l1%208%201-3c0-2%200-3%202-3%208%200%208-9%200-10h-4v8m128-6l2%206c2%208%202%208%204%208l2-6c2-7%202-7%204%200%201%207%203%208%205%202a3102%203102%200%2001-1-5c-1%206-2%206-4-3-1-6-3-5-5%203l-1%206-2-5-3-8-1%202m34%206v8h4c4%200%205-1%206-3%202-4%200-9-5-8-3%200-3-1-3-3l-1-2-1%208m-140-2c-2%201-2%206-1%208%202%203%207%202%209-1%203-6-4-12-8-7m13%200c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m162%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8m14%200l1%208%201-2c0-2%200-3%203-2%203%200%205-2%205-6s-2-6-7-6l-3%201v7'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/53920bf873a1ff67b3b19c0f6ad43482/6050d/pwacover.png"}}},"authors":[{"authorsPage":true,"bio":"Hello everybody 👋 !  My name is Luke and I am the creator and owner of the spaceout.pl. Personally, I am a big geek with huge love for Star Wars, Marvel and DC comic books, Funk and 80s music. I take most of my design inspiration from offline experiences like going to art museums, galleries and working with other creative people on various projects. I also work with various Activist and NGO groups as a pro-bono designer and developer.\n","id":"f69d27c7-7f9a-5fbd-b05d-1a324fd10c0a","name":"Luke Celitan","featured":true,"social":[{"url":"https://www.facebook.com/spaceout/"},{"url":"https://twitter.com/spaceout.pl"},{"url":"https://www.instagram.com/spaceout.pl/"},{"url":"https://huggingface.co/MassivDash"},{"url":"https://bsky.app/profile/lukecelitan.bsky.social"}],"slug":"/authors/luke-celitan","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/afb2b/spaceghost.jpg 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/03612/spaceghost.jpg 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/58718/spaceghost.webp 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/ed320/spaceghost.webp 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 50px) 100vw, 50px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/59538/spaceghost.jpg 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fd013/spaceghost.jpg 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/d9b14/spaceghost.webp 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/6b183/spaceghost.webp 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 100px) 100vw, 100px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/a2637/spaceghost.jpg 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/15203/spaceghost.jpg 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/2d087/spaceghost.webp 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/29d87/spaceghost.webp 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 305px) 100vw, 305px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"}}}],"basePath":"/","tech":["JS","TS"],"category":"Post","slug":"/progressive-web-apps-offline-capabilities-and-background-operations","id":"ba6d4176-7616-520c-ba8f-c0389bb586f8","title":"Progressive Web Apps, Offline Capabilities and Background Operations","appDescription":null,"mailchimp":false,"next":[{"id":"a4b2aee2-8f6c-50a8-9775-2455971f8d3d","slug":"/chaos-engineering","secret":false,"title":"Chaos Engineering","author":"Luke Celitan","date":"September 10th, 2025","dateForSEO":"2025-09-10T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive, hands-on guide to chaos engineering for distributed systems. Learn the principles, methodologies, tools, advanced concepts, and real-world case studies that will help you build resilient, reliable architectures.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Chaos Engineering\",\n  \"excerpt\": \"A comprehensive, hands-on guide to chaos engineering for distributed systems. Learn the principles, methodologies, tools, advanced concepts, and real-world case studies that will help you build resilient, reliable architectures.\",\n  \"date\": \"2025-09-10T00:00:00.000Z\",\n  \"hero\": \"cover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"chaos-engineering-the-definitive-deep-dive-for-distributed-systems\"\n  }, \"Chaos Engineering: The Definitive Deep-Dive for Distributed Systems\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Distributed systems are the backbone of modern digital infrastructure, powering everything from streaming platforms to global e-commerce. But with great scale comes great complexity\\u2014and unpredictability. How do you ensure your system can survive the unexpected? Enter \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Chaos Engineering\"), \": the discipline of intentionally injecting failure to learn, adapt, and build truly resilient systems.\"), mdx(\"p\", null, \"In this guide, I\\u2019ll take you on a deep technical journey through chaos engineering. We\\u2019ll cover its origins, principles, methodologies, tools, and advanced concepts. You\\u2019ll see practical examples, code demonstrations, and real-world case studies. Whether you\\u2019re a seasoned SRE, a cloud architect, or a curious developer, this is your definitive reference for mastering chaos engineering.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"why-chaos-engineering\"\n  }, \"Why Chaos Engineering?\"), mdx(\"h3\", {\n    \"id\": \"learning-from-failure\"\n  }, \"Learning from Failure\"), mdx(\"p\", null, \"Traditional testing can\\u2019t predict every possible failure in a distributed system. Chaos engineering flips the script: instead of fearing failure, we embrace it\\u2014on our own terms. By simulating outages, latency, and resource exhaustion, we learn how our systems behave under stress and how to make them stronger.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Key Goals:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Resilience:\"), \" Survive and recover from failures.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reliability:\"), \" Deliver consistent service, even when things go wrong.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Continuous Learning:\"), \" Use failure as feedback for improvement.\")), mdx(\"h3\", {\n    \"id\": \"a-brief-history\"\n  }, \"A Brief History\"), mdx(\"p\", null, \"Chaos engineering was popularized by Netflix in the late 2000s. Their legendary \\u201CChaos Monkey\\u201D tool randomly killed production instances to test system recovery. Today, chaos engineering is a global movement, with open-source tools, cloud-native platforms, and a vibrant community.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"challenges-in-distributed-systems\"\n  }, \"Challenges in Distributed Systems\"), mdx(\"p\", null, \"Distributed systems are complex, dynamic, and massive in scale. Let\\u2019s break down the three main challenges:\"), mdx(\"h3\", {\n    \"id\": \"1-complexity\"\n  }, \"1. Complexity\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multiple components interact in unpredictable ways.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Emergent behaviors can lead to cascading failures.\")), mdx(\"h3\", {\n    \"id\": \"2-scale\"\n  }, \"2. Scale\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Thousands (or millions) of nodes, services, and dependencies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Testing every possible interaction is impossible.\")), mdx(\"h3\", {\n    \"id\": \"3-dynamicity\"\n  }, \"3. Dynamicity\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Nodes join and leave frequently.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The system\\u2019s topology and state are always changing.\")), mdx(\"h4\", {\n    \"id\": \"why-traditional-testing-falls-short\"\n  }, \"Why Traditional Testing Falls Short\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Unit and integration tests\"), \" cover known scenarios, not unknown unknowns.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Staging environments\"), \" rarely match production scale or diversity.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Manual failover drills\"), \" are infrequent and limited in scope.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Real-World Failure Scenarios:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Network partitions\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sudden traffic spikes\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hardware failures\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dependency outages\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Data corruption\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"principles-of-chaos-engineering\"\n  }, \"Principles of Chaos Engineering\"), mdx(\"p\", null, \"Chaos engineering isn\\u2019t random destruction\\u2014it\\u2019s a disciplined, scientific approach. The five core principles are:\"), mdx(\"h3\", {\n    \"id\": \"1-define-a-steady-state-hypothesis\"\n  }, \"1. Define a Steady State Hypothesis\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Identify what \\u201Cnormal\\u201D looks like (e.g., 99.99% uptime, <200ms latency).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use metrics, SLIs, and dashboards to measure steady state.\")), mdx(\"h3\", {\n    \"id\": \"2-vary-real-world-events\"\n  }, \"2. Vary Real-World Events\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Simulate realistic failures: network latency, hardware crashes, dependency timeouts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid synthetic, idealized scenarios.\")), mdx(\"h3\", {\n    \"id\": \"3-run-experiments-in-production\"\n  }, \"3. Run Experiments in Production\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test in the real environment, with real traffic and dependencies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use canary releases and progressive rollouts to minimize risk.\")), mdx(\"h3\", {\n    \"id\": \"4-automate-experiments-for-continuous-testing\"\n  }, \"4. Automate Experiments for Continuous Testing\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate chaos into CI/CD pipelines.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use automation to run experiments regularly and consistently.\")), mdx(\"h3\", {\n    \"id\": \"5-minimize-blast-radius\"\n  }, \"5. Minimize Blast Radius\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Limit the scope of experiments to reduce impact.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use isolation, rollback procedures, and monitoring to contain failures.\")), mdx(\"h4\", {\n    \"id\": \"diagram-chaos-engineering-principles\"\n  }, \"Diagram: Chaos Engineering Principles\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-mermaid\"\n  }, \"graph TD;\\n    A[Define Steady State] --> B[Vary Real-World Events];\\n    B --> C[Run in Production];\\n    C --> D[Automate Experiments];\\n    D --> E[Minimize Blast Radius];\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"chaos-engineering-methodology\"\n  }, \"Chaos Engineering Methodology\"), mdx(\"p\", null, \"Let\\u2019s walk through the step-by-step process of running a chaos experiment:\"), mdx(\"h3\", {\n    \"id\": \"1-hypothesis-generation\"\n  }, \"1. Hypothesis Generation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"What do you expect to happen if a failure occurs?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Example: \\u201CIf a database node fails, the system should reroute traffic and maintain availability.\\u201D\")), mdx(\"h3\", {\n    \"id\": \"2-experimentation\"\n  }, \"2. Experimentation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Design:\"), \" Choose the failure scenario, scope, and metrics.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Execution:\"), \" Inject failure using tools (e.g., kill a VM, add latency).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Monitoring:\"), \" Track system behavior, collect logs and metrics.\")), mdx(\"h3\", {\n    \"id\": \"3-analysis-and-improvement\"\n  }, \"3. Analysis and Improvement\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Compare results to the steady state hypothesis.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Identify weaknesses, bottlenecks, and unexpected behaviors.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Prioritize fixes and improvements.\")), mdx(\"h3\", {\n    \"id\": \"4-continuous-feedback-loop\"\n  }, \"4. Continuous Feedback Loop\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Repeat experiments regularly.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Refine hypotheses and expand scenarios.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Share learnings across teams.\")), mdx(\"h4\", {\n    \"id\": \"table-chaos-experiment-lifecycle\"\n  }, \"Table: Chaos Experiment Lifecycle\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Step\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Hypothesis\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Define expected system behavior\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Experimentation\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Inject failure, monitor system\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Analysis\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Compare results, identify weaknesses\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Improvement\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Fix issues, update system\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Feedback\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Repeat, refine, share learnings\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"popular-chaos-engineering-tools-and-platforms\"\n  }, \"Popular Chaos Engineering Tools and Platforms\"), mdx(\"h3\", {\n    \"id\": \"netflix-simian-army\"\n  }, \"Netflix Simian Army\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chaos Monkey:\"), \" Randomly kills VM instances.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Latency Monkey:\"), \" Injects network latency.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chaos Kong:\"), \" Simulates region-wide outages.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Janitor Monkey:\"), \" Cleans up unused resources.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chaos Gorilla:\"), \" Simulates loss of an entire availability zone.\")), mdx(\"h4\", {\n    \"id\": \"example-chaos-monkey-configuration\"\n  }, \"Example: Chaos Monkey Configuration\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"enabled\\\": true,\\n  \\\"schedule\\\": \\\"business-hours\\\",\\n  \\\"target\\\": \\\"stateless-services\\\",\\n  \\\"region\\\": \\\"us-west-2\\\"\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"open-source-tools\"\n  }, \"Open-Source Tools\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Gremlin:\"), \" SaaS platform for chaos experiments (UI, API, integrations).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"LitmusChaos:\"), \" Kubernetes-native chaos framework (CRDs, workflows).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chaos Toolkit:\"), \" Extensible, Python-based chaos automation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"PowerfulSeal:\"), \" Kubernetes-focused, YAML-driven experiments.\")), mdx(\"h4\", {\n    \"id\": \"table-tool-comparison\"\n  }, \"Table: Tool Comparison\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tool\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Platform\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Features\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Integration\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chaos Monkey\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"AWS/Cloud\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"VM termination\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Netflix OSS\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Gremlin\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SaaS/Cloud\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"UI, API, multi-failure\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"CI/CD, cloud-native\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"LitmusChaos\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Kubernetes\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"CRDs, workflows, UI\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"K8s, Prometheus\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chaos Toolkit\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Python\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Extensible, automation\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Any, Python\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"PowerfulSeal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Kubernetes\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Node/pod failure, YAML\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"K8s, CLI\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"implementing-chaos-experiments\"\n  }, \"Implementing Chaos Experiments\"), mdx(\"h3\", {\n    \"id\": \"designing-safe-experiments\"\n  }, \"Designing Safe Experiments\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Scope:\"), \" Limit to non-critical services or test environments.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Blast Radius:\"), \" Use canary deployments, feature flags, and isolation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Rollback:\"), \" Prepare scripts and procedures to revert changes.\")), mdx(\"h4\", {\n    \"id\": \"example-1-killing-a-vm-with-chaos-monkey\"\n  }, \"Example 1: Killing a VM with Chaos Monkey\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"# Chaos Monkey CLI (pseudo-code)\\nchaos-monkey kill --target vm-12345 --region us-west-2\\n\")), mdx(\"h4\", {\n    \"id\": \"example-2-simulating-network-latency-with-latency-monkey\"\n  }, \"Example 2: Simulating Network Latency with Latency Monkey\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"# Gremlin Python SDK example\\nimport gremlin\\nclient = gremlin.Client(auth_token=\\\"YOUR_TOKEN\\\")\\nclient.network.latency(\\n    target=\\\"service-a\\\",\\n    delay_ms=500,\\n    duration=\\\"5m\\\"\\n)\\n\")), mdx(\"h4\", {\n    \"id\": \"example-3-inducing-node-failures-in-kubernetes-with-litmuschaos\"\n  }, \"Example 3: Inducing Node Failures in Kubernetes with LitmusChaos\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"apiVersion: litmuschaos.io/v1alpha1\\nkind: ChaosEngine\\nmetadata:\\n  name: node-failure\\nspec:\\n  appinfo:\\n    appns: default\\n    applabel: \\\"app=web\\\"\\n    appkind: deployment\\n  chaosServiceAccount: litmus-admin\\n  experiments:\\n    - name: node-cpu-hog\\n      spec:\\n        components:\\n          env:\\n            - name: CPU_CORES\\n              value: \\\"2\\\"\\n\")), mdx(\"h3\", {\n    \"id\": \"monitoring-and-observability\"\n  }, \"Monitoring and Observability\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use metrics (Prometheus, Datadog), logs (ELK), and dashboards (Grafana).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Track error rates, latency, throughput, and recovery times.\")), mdx(\"h4\", {\n    \"id\": \"diagram-observability-stack-for-chaos-experiments\"\n  }, \"Diagram: Observability Stack for Chaos Experiments\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-mermaid\"\n  }, \"graph TD;\\n    A[Chaos Experiment] --> B[Metrics: Prometheus];\\n    A --> C[Logs: ELK];\\n    A --> D[Dashboards: Grafana];\\n    B --> E[Alerting];\\n    C --> E;\\n    D --> E;\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"advanced-chaos-engineering-concepts\"\n  }, \"Advanced Chaos Engineering Concepts\"), mdx(\"h3\", {\n    \"id\": \"running-experiments-in-production-vs-staging\"\n  }, \"Running Experiments in Production vs. Staging\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Production:\"), \" Real traffic, real dependencies, higher risk, higher value.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Staging:\"), \" Safer, but may miss real-world issues.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Best Practice:\"), \" Start in staging, graduate to production with canary releases.\")), mdx(\"h3\", {\n    \"id\": \"automating-chaos-in-cicd-pipelines\"\n  }, \"Automating Chaos in CI/CD Pipelines\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate chaos experiments into build/test workflows.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use GitHub Actions, Jenkins, or GitLab CI to trigger chaos jobs.\")), mdx(\"h4\", {\n    \"id\": \"example-github-actions-for-chaos-experiment\"\n  }, \"Example: GitHub Actions for Chaos Experiment\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"name: Chaos Test\\non: [push]\\njobs:\\n  chaos:\\n    runs-on: ubuntu-latest\\n    steps:\\n      - name: Run Chaos Toolkit\\n        run: chaos run experiment.json\\n\")), mdx(\"h3\", {\n    \"id\": \"canary-testing-and-progressive-rollouts\"\n  }, \"Canary Testing and Progressive Rollouts\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Deploy changes to a small subset of users/services.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor impact before full rollout.\")), mdx(\"h3\", {\n    \"id\": \"failure-injection-patterns\"\n  }, \"Failure Injection Patterns\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Network:\"), \" Latency, packet loss, partitions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Hardware:\"), \" CPU/memory exhaustion, disk failure.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Application:\"), \" Crash, exception, resource leak.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Dependency:\"), \" Third-party outage, API throttling.\")), mdx(\"h3\", {\n    \"id\": \"statistical-analysis-of-experiment-results\"\n  }, \"Statistical Analysis of Experiment Results\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use statistical models to analyze recovery times, error rates, and impact.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Identify patterns and correlations in failure scenarios.\")), mdx(\"h4\", {\n    \"id\": \"table-failure-injection-patterns\"\n  }, \"Table: Failure Injection Patterns\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Pattern\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example Scenario\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tool/Method\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Network\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"500ms latency, partition\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Gremlin, LitmusChaos\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Hardware\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"CPU hog, disk failure\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"LitmusChaos, K8s\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Application\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Crash, memory leak\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chaos Toolkit\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Dependency\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"API outage, throttling\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Gremlin, custom\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"case-studies-and-real-world-applications\"\n  }, \"Case Studies and Real-World Applications\"), mdx(\"h3\", {\n    \"id\": \"netflix-evolution-of-chaos-engineering\"\n  }, \"Netflix: Evolution of Chaos Engineering\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Started with Chaos Monkey in 2008.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Expanded to Simian Army (multiple tools).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Lessons learned: automate, minimize blast radius, share learnings.\")), mdx(\"h3\", {\n    \"id\": \"amazon-google-linkedin\"\n  }, \"Amazon, Google, LinkedIn\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Amazon: \\u201CGameDays\\u201D\\u2014team-based failure drills.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Google: SREs use failure injection for reliability.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LinkedIn: Chaos engineering for Kafka and data pipelines.\")), mdx(\"h3\", {\n    \"id\": \"open-source-project-case-studies\"\n  }, \"Open-Source Project Case Studies\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Kubernetes:\"), \" LitmusChaos, PowerfulSeal for pod/node failures.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cassandra:\"), \" Simulate node loss, network partitions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Zookeeper:\"), \" Test quorum loss, leader election under stress.\")), mdx(\"h4\", {\n    \"id\": \"anecdote-netflixs-chaos-kong\"\n  }, \"Anecdote: Netflix\\u2019s Chaos Kong\"), mdx(\"p\", null, \"Netflix simulated the loss of an entire AWS region to test global failover. The experiment revealed gaps in data replication and led to major improvements in disaster recovery.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"best-practices-and-common-pitfalls\"\n  }, \"Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"planning-and-communication\"\n  }, \"Planning and Communication\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Involve all stakeholders: SREs, developers, product owners.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Communicate experiment scope, goals, and rollback plans.\")), mdx(\"h3\", {\n    \"id\": \"minimizing-risk-and-blast-radius\"\n  }, \"Minimizing Risk and Blast Radius\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Start small, expand gradually.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use canary deployments and feature flags.\")), mdx(\"h3\", {\n    \"id\": \"handling-stateful-vs-stateless-services\"\n  }, \"Handling Stateful vs. Stateless Services\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stateless:\"), \" Easier to experiment, less risk.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stateful:\"), \" Higher risk, require careful planning and backup.\")), mdx(\"h3\", {\n    \"id\": \"avoiding-uncontrolled-outages\"\n  }, \"Avoiding Uncontrolled Outages\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always have rollback procedures.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor closely, alert on anomalies.\")), mdx(\"h3\", {\n    \"id\": \"continuous-improvement-and-learning\"\n  }, \"Continuous Improvement and Learning\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Document findings, share across teams.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use post-mortems to drive improvement.\")), mdx(\"h4\", {\n    \"id\": \"callout-common-pitfalls\"\n  }, \"Callout: Common Pitfalls\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Running experiments without clear hypotheses.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Failing to monitor or alert on failures.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Overlooking dependencies and cascading effects.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Neglecting documentation and communication.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"troubleshooting-and-recovery\"\n  }, \"Troubleshooting and Recovery\"), mdx(\"h3\", {\n    \"id\": \"rollback-strategies\"\n  }, \"Rollback Strategies\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Automated scripts to revert changes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Manual intervention plans for critical failures.\")), mdx(\"h3\", {\n    \"id\": \"incident-response-during-chaos-experiments\"\n  }, \"Incident Response During Chaos Experiments\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"On-call teams ready to respond.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Clear escalation paths and communication channels.\")), mdx(\"h3\", {\n    \"id\": \"post-mortem-analysis-and-documentation\"\n  }, \"Post-Mortem Analysis and Documentation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Analyze what happened, why, and how to improve.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Share learnings in blameless post-mortems.\")), mdx(\"h4\", {\n    \"id\": \"example-post-mortem-template\"\n  }, \"Example: Post-Mortem Template\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-markdown\"\n  }, \"# Chaos Experiment Post-Mortem\\n## Summary\\n## Timeline\\n## Impact\\n## Root Cause\\n## Recovery Steps\\n## Lessons Learned\\n## Action Items\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"building-your-own-chaos-engineering-tool\"\n  }, \"Building Your Own Chaos Engineering Tool\"), mdx(\"h3\", {\n    \"id\": \"principles-for-custom-tool-development\"\n  }, \"Principles for Custom Tool Development\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Modular, extensible architecture.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integration with existing infrastructure (cloud, K8s, CI/CD).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Support for multiple failure scenarios.\")), mdx(\"h3\", {\n    \"id\": \"example-architecture\"\n  }, \"Example Architecture\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-mermaid\"\n  }, \"graph TD;\\n    A[CLI/API] --> B[Experiment Engine];\\n    B --> C[Failure Injectors];\\n    B --> D[Metrics Collector];\\n    B --> E[Rollback Manager];\\n    C --> F[Cloud/K8s];\\n    D --> G[Prometheus/Grafana];\\n\")), mdx(\"h3\", {\n    \"id\": \"code-snippet-custom-failure-injector-python\"\n  }, \"Code Snippet: Custom Failure Injector (Python)\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"import subprocess\\n\\ndef kill_process(pid):\\n    try:\\n        subprocess.run([\\\"kill\\\", \\\"-9\\\", str(pid)], check=True)\\n        print(f\\\"Process {pid} killed successfully.\\\")\\n    except Exception as e:\\n        print(f\\\"Error killing process: {e}\\\")\\n\")), mdx(\"h3\", {\n    \"id\": \"extensibility-and-integration\"\n  }, \"Extensibility and Integration\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use plugins for new failure types.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate with monitoring and alerting platforms.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Support REST APIs and CLI for automation.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"conclusion-and-further-reading\"\n  }, \"Conclusion and Further Reading\"), mdx(\"p\", null, \"Chaos engineering is more than breaking things\\u2014it\\u2019s about building confidence in your system\\u2019s ability to survive the unexpected. By embracing failure, running disciplined experiments, and sharing learnings, you can create systems that are truly resilient and reliable.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Key Takeaways:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Chaos engineering is a scientific, iterative process.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use automation, monitoring, and communication to minimize risk.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Learn from real-world failures and continuously improve.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Recommended Resources:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\u201CChaos Engineering: Building Confidence in System Behavior through Experiments\\u201D (O\\u2019Reilly)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Netflix Tech Blog: Chaos Monkey, Simian Army\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Gremlin Blog and Documentation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LitmusChaos Documentation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"PrinciplesOfChaos.org\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Future Trends:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Chaos engineering for serverless and edge computing\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"AI-driven failure scenario generation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Deeper integration with observability and incident response platforms\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"appendix-full-example---chaos-experiment-in-kubernetes\"\n  }, \"Appendix: Full Example - Chaos Experiment in Kubernetes\"), mdx(\"h3\", {\n    \"id\": \"step-1-define-steady-state\"\n  }, \"Step 1: Define Steady State\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Service latency < 200ms\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Error rate < 0.1%\")), mdx(\"h3\", {\n    \"id\": \"step-2-design-experiment\"\n  }, \"Step 2: Design Experiment\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Inject CPU hog on one node for 5 minutes\")), mdx(\"h3\", {\n    \"id\": \"step-3-execute-experiment\"\n  }, \"Step 3: Execute Experiment\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"apiVersion: litmuschaos.io/v1alpha1\\nkind: ChaosEngine\\nmetadata:\\n  name: cpu-hog\\nspec:\\n  appinfo:\\n    appns: default\\n    applabel: \\\"app=web\\\"\\n    appkind: deployment\\n  chaosServiceAccount: litmus-admin\\n  experiments:\\n    - name: pod-cpu-hog\\n      spec:\\n        components:\\n          env:\\n            - name: CPU_CORES\\n              value: \\\"2\\\"\\n\")), mdx(\"h3\", {\n    \"id\": \"step-4-monitor-and-analyze\"\n  }, \"Step 4: Monitor and Analyze\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use Prometheus and Grafana to track latency and error rate.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Compare to steady state hypothesis.\")), mdx(\"h3\", {\n    \"id\": \"step-5-rollback-and-document\"\n  }, \"Step 5: Rollback and Document\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stop experiment, restore node.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Document findings in post-mortem.\")), mdx(\"hr\", null), mdx(\"p\", null, \"Chaos engineering is a journey, not a destination. Start small, learn continuously, and build systems that thrive in the face of chaos!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE90lEQVQ4y1WVaVCVZRiGv3M4dQ47SAlBKCgH9bDEkKE2KcqWHZQQdECQZHVDDJRUBJRdoAxwEBRQBBVwwRRyo5F0FBSRRZQIHPFXM9FMOvZH+3X1ng/E6cczz7vez3Lf7/dJkiTx1nQ6HVlZWURGricxMYnY2Dj0wcFojDXyvkKpQPWeCmNj48k7CgmlkRK1Wj2NIRkufbF0KYsXLyYqKop169ZhZGQkH7K0tCQkJITi4mK0rq7Tl4xNjDExMZHPGeZqjRoTUxNUKhVSyo4dFBQUUl9/km1bt+Lk5CQfUiqVuLi4yEDLly+nrq6O8PBwZk/tqzUaNMJMzUwxNTXFysoSa2trJJ3ODd9lvkRERHCqsZHk5O2YmZvL5cbGxk5ntSp4FcGifP+AAGxtbeU1I5URCoVCztbQBsNc8vP3l7MyWGlJKZ2dnWzevAUPDw/y8/LJFD01lBMXF8+GmBi8vb2Jjo7+X/lvwc3MzJACAwPZsCEGLy8vXEV5zc0ttLf/zFd6vZzh06dPGR0dY2joMf0DA3R3dzMwMEh19VHS0tI4f/4CYaIVCsUUKX5+fqJPWoIE8KcLFwpiorlwoZWengcy2Pj4cy5dukRKSgqXL7cxMfEXf794yatX/8h7b978y4uXL0lKSpoErKmpFYTUs2nTZvbvP0B5eQWZmdnU1tbSJgDu3LlLbk4uS5YsIT+/gOEnw9y6dZtz587T86CXPycmeP36DX19/XKbJEdHR/z9A0gSusvO3s+xYzXyxePH6+USm5qaqT9RT1tbu5zh+LNxrly5yv37PaKKXvbt2ycnkpGRgVarRYoRjQ4MChIWSIBgcO/evZSVlVFdVU1XVxeFQlKHDv3I6dNn5EAtLWdFkCYKxLio6CD+fv64ubnhOMtxsuSEhARWrFiBu7u7TL8hmqGEI0eqWB8ZJURdQmFhEfHxCawX/fXxWYS9vT2enp74+vpiZ2c3zbgs9LVr18qpLvLxITU1TRZ4R8cvMlD6rnT6+wc4fPgwesG6AThRJPAWwCDod2DKScCwsDU0NjRQVVUltBaHbsF8loqnaCAhNyeH3Nwc+X1XCLLy8/KEVkuEvLTMnTsHCwtzGcx25sx3sum4eZvK6joior5BvyqU2XNc+cDWgaCVq8k+UEBoWATxScnUnTxDdU09x4VvOH2Wax2dNJ45x6HySppaWqmpa6Ci8ijSlQx3Tmy0oCpSzfVMHRdTZ1MRruTXXC9+SnPm+r4FXExzojHRhlv5n9GZt5AbWZ50lXzOYGUgI7WrGTsRyh9no4T/GulRusSzgzMZL7bjt/2mjOZZ8bzYlpEcC37PtRDeUqxZM5ZvxZA4O7RLkv3gTon+byX6dkzag+0SD4WXBvaoeFzgwMj38xkt82C4aDbDJVpGK7yFd2Ws/BNGSsW83Isn2WY82i0A9yoZnPIGe5yhnB5Lvbs1PM40pkdEvCui9KYr6dttxMPvVAxlauhKkegWmdxLFV7YvZ1K7oi1vj1qutMU8lqX2L+/y0geS1vioyk8kEFrcwPFeVncaG8lZOUKQvX+rBZep52FPmAZ85ztmT/HHo1SIuTL5SRtjEQtmLUxfx+7GSa4Otnh7GCDlF9wkMZTTdzouMnVax2UlP4gGNajnbcAJ2cXdG4ehK4Jx95hlvhUmfGR/cdsS94hfgtTGlSqMLe0YobNh1jNsOE/paZE1nl5Y8UAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/c370cac4ebfe0b74881682593e7ee256/a1946/cover.png","srcSet":"/static/c370cac4ebfe0b74881682593e7ee256/5b37e/cover.png 236w,\n/static/c370cac4ebfe0b74881682593e7ee256/49058/cover.png 472w,\n/static/c370cac4ebfe0b74881682593e7ee256/a1946/cover.png 944w,\n/static/c370cac4ebfe0b74881682593e7ee256/6050d/cover.png 1200w","srcWebp":"/static/c370cac4ebfe0b74881682593e7ee256/99fbb/cover.webp","srcSetWebp":"/static/c370cac4ebfe0b74881682593e7ee256/77392/cover.webp 236w,\n/static/c370cac4ebfe0b74881682593e7ee256/1f177/cover.webp 472w,\n/static/c370cac4ebfe0b74881682593e7ee256/99fbb/cover.webp 944w,\n/static/c370cac4ebfe0b74881682593e7ee256/9000d/cover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2016v16h3a153%20153%200%200129%204h1l6%201%205%202c0%202%203%200%209-6l16-13%2010-3c2%200%202%200%200-3v-3c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1%200-1h3l-3-2-1-2c2%200%201-2-2-2h-2l2-1-38-1H0v16M91%202l1%205v4h1c0-2%206-4%2011-5h2a131%20131%200%200172%2010l6%203%2023%2018c3%204%205%205%207%206a78%2078%200%200111%202l10%204c17%209%2030%2024%2034%2041l1%208h8c9%200%2010%201%2012%208l1%203%201%202c0%201%205%202%207%200l7-2a377%20377%200%200011%200l5%201%205%201-2-2c-1-1-3-2-4-1l-1-1%201-1v-1c-1-1%200-6%202-7s3-1%207%203c6%206%2012%209%2022%2012l9%202c2%200%203%204%203%209%200%204%200%205%205%208l8%207%207%208c3%203%204%204%205%208%200%202%200%203-1%202l-3-1-6-5-4-3%201%202%202%205%202%203h3l1%201h3v12l-1%208-1-1v-1l-1-3-1-6-2-5-1-4v5l1%206v1l-1%204c-1%204-3%205-3%202l-1-3-1-1-1-6c-2-5-2-7-1-12v-6l-2%202-1%203-1%204-1%201-4%203c-2%202-2%202%200%202%202-1%202-1%202%206v20c-1%202-2-1-1-3l-1-1-1-1%201-1v-2l-1-1-4-4-2-3v6l1%207%201%207c0%205%200%207-1%206-2-1-2-8-1-10v-2c-1-1-1-1-1%201h-1l-2-1v-5l-1-5%201-5%202-3c-1-1-4%201-4%204s-2%203-7-2c-4-3-4-3-4-1v5c0%204-1%204-2%203-2-2-2-2-1-3l1-3h-2c-1%201-1%201-1-1%200-1%200-2-1-1l-1-1c1-1%200-1-1-1l-2%201-2%201c-2-1-2-1-2%202l-1%203-2%203c0%202-1%204-3%204v-1l1-2-3%202c-1%201-2%203-2%209l-1%208v12c1-1%201%200%201%201l-1%201h-1l-1%207-1-10-1-1v-2l-1-2c-1%200-4-6-3-7v-4c-1-2-1-2-1%202-1%206-3%206-4%202-1-6-2-4-1%202%200%207-1%2010-3%206l-1-2c-2%201-2-6%200-8l1-2h-4l-3%201h-2c-2%202-6%200-6-2l2-2%204-2%203-2%201-1%201-1c4%200%206-1%207-2%202-2%202-2%204-1%201%201%201%201%201-1s0-2%201-1%201%201%201-1l2-2h1l2-1h3l4-2c3-1%204-3%203-5l2-1c0%201%201%201%200%200l1-1c3%201%206%200%205-1v-1c1%201%202%200%203-1s1-1%201%202l1%203%201-1v-2l1-2v2l1-1c1-2%201-2%202-1l2%201%201%201h2l1%201%201%201h1l3%201c3%200%204%200%205%202l1%203v-3c0-3%201-4%203-3%201%201%201%201%201-1%200-3-1-4-2-2-2%202-9%201-15-1-4-2-8-3-10-2-5%201-16%206-21%2010a117%20117%200%2001-21%209l-2%201-25%2013-3%202h-2l-2%201h-1c-2%200-2%200-1%201l-1%202-2-2-1%201c-1%201-1%201-2-3l-2-4-3%203c-4%204-6%205-6%204l-4%203-3%202-1%201-3%204a81%2081%200%2000-17%2024c-2%202-3%206-2%206l1%204c0%206%202%2011%204%2011%200-1%201-1%200%200l1%201c2%200%202-1-1-4l-3-4c0-2%200-2%202%201%203%204%205%205%205%201%201-2%201-2%202%200h2l-2-5-1-1c-1-2%200-2%201-1l2-1-5-1c-5%200-7-2-2-3s6-1%208-5%204-5%206-3l-1%201-3%205-2%205%203%201h3l1%201h-5c-2-1-2%200-1%204l1%201c0-2%200-2%201-1l1%203c-1%201%200%202%201%202%201%201%201%201-1%201-2-1-3%201%200%205%201%201%202%202%204%201%203-1%204%200%203%204l4%201h4l-3-2c-4-3-7-14-8-24%200-12%200-12-3-11-6%202-8%202-7%200l2-1%201-1c-1-1%203-5%205-4l2-1c1-3%204-2%203%200-1%203%201%202%202-2%203-4%203-4%202%202v8c2%203%204%204%204%202l-1-2-1-2c0-1%200-2-1-1v-3h1c0%201%201%202%202%201%203%200%205-5%205-10%200-4%205-11%205-7l-2%207c-2%205-2%208%200%2029%201%2011%202%2014%203%2012h2l3%202h3c2-3%202-2%204%200%202%203%202%203-3%203l-6-1c-3-2-4%200-2%201%202%202%2019%202%2021%201h1c1%201%201%200%201-1%200-4%202-8%203-7l1%205c0%204%200%205%201%202%200-4%202-4%203%200%200%204%201%205%201%202%200-2%201-3%202-3l1-3%201-2c1-1%201%200%201%201l1%205c1%203%201%203%203%202%204-2%205-3%206-7v-3l2%203%201%206%202%204c3%202%203%202%204-3l1-4%202%205%203%204h2l2-3%201-3%201%203c1%205%202%206%205%206%205-1%207-2%208-5l1-2%201%203c1%203%202%204%203%203l2%201-2%202c-3%200-2%201%203%202l8%201c4%200%205%200%205-2h-1l-3%201c-3%200-3%200-3-3s0-4-2-4c-2%201-4%202-2%202l1%202c0%201-1%201-2-1-3-4-3-3-1-9%201-6%203-6%204%200%201%205%202%205%205-1%203-9%205-8%206%204%200%206%202%2011%203%209l2-6%203-9%201%206v6l5-1c6-3%2024-3%2026-1%201%202%201%202%201%200V0H245C98%200%2090%200%2091%202m1%2012v11l-1%204v2l-1%202-3%2010-2%205-6%2012c-5%2011-10%2016-11%2013h-1l-2-2v-2h2l-1-1-2-2h2v-1c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1-1-2l2-3c-1-1%200-2%202-2%201%200%202%200%201%201l-1%202h2l2-2%201-1-1-1h-2v-1c2%200%205-3%203-3v-2c-2%201-3-1-2-3h2v-3l1-1%202%203c1%201%201%201%201-1v-2h2l-2-1c-2-1-2-3%200-4l-1-1v-2l1-1v-5l1-1%201-1v-1c-3%200-2-2%200-2l2-1h-2l-2-2h1l2-1c-2-2-5-1-5%202l-1%203v1l-1%201-1-2-2-1%201%203v1h-2c1%201-2%203-3%203l-1%201c-1%202-5%205-6%204l-1%201c1%201-3%204-5%205-2%200-3%201-1%201s7%203%2012%207l2%202-3%204a431%20431%200%2000-7%209v-3l-1%201-2%201c-1%201-2%200-2-1h-1c-1%201-1%201-2-1-1-3-2-3-3-3-3%201-3%200-3-2v-9l-1%203-1%203v5l-2-10c0-2%200-3-1-1l-3%204-2%203c0%202-2%201-3-2l-1-2%201%202c0%202%200%203-1%202-1%200-2-1-1-2%200-2%200-2-1-1l-1-5v-2c-1%202-2%202-3%202l-1%201%201%201c1-1%201%202-1%204h-2l-1-1c-5%200-7%200-10-3s-5-3-4%200h1l1%201%202%201c1%201%200%201-2%201-3%200-4%200-4-2-1-2-1-2-2-1v4c-1%200-2%202-2%207l1%208%206-2c10-2%2031-2%2038%201l5%202h1l16%207c7%204%207%205%207%203l1-6c2%200%202%200%201-1l2-6%203-5%207%207c9%2010%2013%2013%2014%2017%201%203%203%204%203%202a289%20289%200%200150-36l15-4h19l1%201a2298%202298%200%2001-34%209l-2%201-15%208h-1l-1%201c1%201-5%204-6%203v1l-1%201h-1c1%201-3%203-4%202l-1%202c1%200%201%201%200%200l-1%202-1%202h-2l-1%201v1l-1%201c1%201-4%204-6%204-4%200-1%201%204%202%2011%201%2014%2014%204%2019l-2%202%2014%209c4%201%2013%200%2014-2l3-1h5l6-1%204-2%201-2v-1l-4-6c-5-8-7-11-9-10v-1l-2-2-1-2-3-4-5-2h-1l-2-3-5-2h-5c-4%201-2-2%202-4%205-2%2014-1%2020%202l19%2015c4%205%2020%2013%2024%2011l3%201c1%202%203%203%203%201h2v1c-2%200-2%200%200%201%204%202%205-1%201-3-3-2-3-3-1-7%200-2%200-2-2-2-1%201-2%201-2-1l11-1h9c-3%200-4-2-2-2l10-2h-6l-1-1v-2c2-2%201-4%200-4-3%200-3%200-1-2v-1h-1l-1-1v-1l-1-1c-1%200-1-1%201-1v-2l-2%201h-1l2-2v-2c1-1%200-4-1-4v2c0%202%200%202-1%201s-2-2-1-3l-1-1h-1c1-1%201-1%200%200l-2-1c0-1%200-2-1-1v-1l-1-1h-1c0-3-1-5-2-4h-1l-1-2c-1%201-3-3-2-4l-1-1h-2l-1-1c0-2-3-4-4-4-2%202-1-1%201-3l1-2h-4c-1%201-1%201%200%200l-1-1v-1l-1-2h-2v-1h-1l-1-1c1-3-1-2-2%200s-2%202-3%200l-1-2%201-1h-2l-2-1-3-2-3-2v-3l-1%202v2l-2-2c-2-2-3-2-2%201h-3c0-2%200-2-1-1s-1%201-1-1l-1-2-2-1-1-1c0%203-2%202-3-1%200-2%200-2-1%200h-8c-3%200-4-1-4-2-1-1-1-1-3%201s-2%202-3%200-2-2-2%200h-1c0-2-4-4-4-2l2%201c1%201%201%201-1%201l-2%201-1-1-2-3v1c0%202-3%202-4%200h-2l-1%202-1%201c-1%202-3%201-3-1v-1l-2%201h-2c1%201%200%202-2%202l-3-3-1-2v1c0%202-3%205-4%203-1-1-1-1-1%201l-1-2c-1-4-1-4-2-2m125%2036l4%209a74%2074%200%20018%2024l1%206v1l1%208v6c1-2%204-3%205-1l3%202h12l-3-1-5-1c0-1-1-2-2-1h-1v-2l3-1-2-1h-2l9-1c6%200%208%200%207-1v-1l1-1c-1-2%204-2%204%200h1l3-3%203-1h-3l-3-1-2-3c-2-2-2-2-1-3s1-1-1-1l-1-2-1-1v-1l-1-1c-1%200-5-7-5-10h-1c-1%201-1%200-4-2l-4-4s-2%200-3-2l-20-9M17%2070l-9%203-7%201v6c0%204%200%206%202%207l1%202%202%202c2%200%204%201%205%203%203%202%207%202%207-1l1-1v-2l1-2%201-1v-1l1-1v-2l1-2%201-1h3l3%201-4%206-4%209-2%202h-3l1%201%202%202%201%201h2c0%201%201%202%203%202%202%201%202%201%202%203-1%202-1%202%201%202l3%202%201%201%201-1v-1h2v-1l2-1h2l2-3v-1l-2%201h-1v-1l1-1%201-3c2-1%202-1%202%201v1h1l2%201%202-2h2c2%201-1%205-4%204v2l-1%201c1%201-3%205-5%205-4%200-2%204%202%204l2%202%201%201%201%201v1l1%202c-1%201%200%202%201%201v1l-1%202%202-1%202-1h1c2%200%203%202%202%205-2%204-9%203-7-1l-1-1h-1l-1-2c0%201-2%200-3-2l-2-1c-1%201-1%201-3-1l-2-1-4-3c-2-2-3-3-4-2h-2v-3l1%201h1v-2l-2-1v-1l-1-1-4-1-4-2-2%204-7%2010-5%207c0%203%201%204%206%202%203-2%203-2%203%200l2%201%201%201h-2l-1%201-1%201H7l-2%202c-5%202-5%203%200%204l3%201h4l3%201%2011%202%2014%204c5%201%206%202%205%204l1%201h2c0%201%207%200%2011-2%202-2%206-3%209-4l3-2%202-1%202-1h-3l2-2h3l1%201%201%202%201%203c0%202%202%205%205%205l3%202c2%201%202%201%202-1l-1-2-2-3h-1l-1-2v-1l-4-2c-3-3-3-4-3-9%201-5%200-11-2-16l1-2%203%207c1%206%204%209%202%204%200-3%202-4%205-1%201%201%203%202%203%200v-1l1%201c-1%201%200%202%201%203l2%201%201-2%201%204c-1%204%201%205%202%202v-1l-1-1%203-2h4l-4-1c-3-1-15-12-15-14s0-3-1-2l-1-1-1-2-2-1-1-3c2-1%203%200%204%201%200%203%203%205%204%204l-1-1-2-3-2-4-5-6c-4-7-9-12-11-11l-1-1-7-7-8-7h-3l-1-1v1c1%201%201%201-1%201s-3-1-3-2h-1l-3%201c-3%200-3%200-2-1s1-1-2-1h-7c0%201-1%202-2%201h-4l-2-1-2%201m86%2023l-1%201h-3l-1%201-1%201h-4l3%205%206%204v-2c-1%200-2-1-1-2h2c1%201%202%201%203-1l4-3c2%200%206%205%207%209l1%202v-2h2v-1c-1-1-1-2%201-3l1-4-1-3h-1l-1-1-7-1h-9M1%20104c0%2013%200%2013%207%205%204-5%203-5%205-3%202%201%202%201%202-1%200-1%200-2-2-1v-4c-2%201-8-3-8-4H4c-1%201-1%201-2-1s-1%200-1%209m202%2023c-10%203-15%2013-12%2027%200%204%202%207%202%204l1-1c1%201%206-1%206-2l1-1%201-1c-1-2%200-2%202-1h1l1-1%201%201v1l2-1h3v1h2l3%201c1%201%201%201%201-1-1-2%200-2%201-2%201%201%201%200%201-1%200-2%200-2%201%200l2%203%201%201c0%201%201%202%202%201v4c1-1%201%200%201%201%200%205%202-1%202-7%200-4%200-6%201-4%201%203%202%204%202%200-1-5-3-9-4-8v-1l-1-1-2-1-1-2h-1v-1h-1v-1l-1-1h-1l-1-1-3-1-8-2c-5%200-7-1-2-1l4-1h-7m-120%204l1%203%201%205c0%204%202%208%204%206l-1-2-1-1h1l1-1v-1h1v2c0%201%200%202%201%201%200-2%203-1%203%201h2c1-1%202%200%200%202v1h1l1-1c1%200%202%201%201%202l1%205c1%203%202%202%201-1l2-1%202%201c0%206%204%2013%205%2011l-1-6-1-5%202%203c0%201%201%202%202%201v1l1%204%201%202h2l1%202%202%201c2-1%202-1%201%201l1%202c2-1%201%201-1%203v3l2%204c0%202%200%202-7-7l-5-4-1-1c0-2%200-3-1-2l-1%202c1%201-3%202-5%200-2-1-3-1-7%201-5%202-6%202-9-1l-2-2%202%201c2%200%202%200%201-2l-4-4-5-4c-2-2-10-3-10-2l-1%201-2%201h4l1%201%204%201%204%201c2%201%202%201%200%203l-4%206c-3%204-3%204-3%202l-1-2v2l-1%203-1-1v-1l-1-3c0-4-1-2-1%202%200%206-2%205-2-1%200-5-1-6-1-2l-1%202v2c1%202%201%204-1%203v-2l-1-1v-1l-1-2h-1l1-1%201-1-1-1c-2%201-1-4%201-6s1-2-2-1l-2%204c-1%202-2%202-4%202-3%200-4%200-3-1l-1-2c-1-1-1%200-1%203l-1%201h-2l-4%201c-1%200-2%200-1-1l1-1c0-2-3%200-3%202h-2l-1-1v-1l-2-1c-2-2-2-2-4-1-1%202-1%202-2%201h-1l-5-1h-1l-1%201v-3h-1l-2-1c-2%200-2%200-2-2%200-4-2-5-2-1-1%203-1%203-2%202H7l-1-2v-3l-1%203-1%202-1-3-1-1-1%2014v13l2-1%203-1%201-1c0-1%209-2%2012-1%204%201%203%202-1%203l-4%201-1%201h-1a1075%201075%200%2001-5%202c1%201-3%204-3%203v2l-1%202H1l2%201%209%206c5%205%208%206%207%204v-3l1-4%201-1c1%201%203%200%205-2l4-2%204-1c8-5%2030-8%2034-5%202%203%200%204-4%205h-4l-10%201c-12%202-20%205-28%2013l-2%203-2%201v1c1%201%201%201-1%201s-2%200-1%201v4l1%201-1%2019%201%201c1%200%203%201%205%204%203%204%2013%2011%2015%2011%203%200%203-2-1-6-3-3-3-4-3-8l2-6%201-2c1-6%206-12%2010-11v-3c2-1%203-1%203%201h-2c1%202-3%206-5%205v1c0%202%200%202-2%201v1c1%201-1%207-2%207l-1%203c0%203%203%2011%204%2011v2c0%202%200%202%203%200%202%200%203-1%203-2h7l4-1c3-1%204-1%203-3s-1-2%201-3h3l4-1c2-1%203-8%201-9l-1-2-1-3c-2-3%201-4%203-2l3%206c1%204%201%204-1%205v2c3%201%206-2%205-5%200-1%200-2%203-2%202-1%203-2%203-4%201-2%200-3-2%200-3%203-2-3%201-8l2-4%2012-12c2-2%203-2%204-1h7c1-1%208%200%207%201l2%201c2%200%202%200%201-1-3-2%201-1%204%201s3%202%201%203c-1%201-1%201%202%201l2%201%201%201%201%201v1l1%202v2c-1%201-1%201%201%201s3-2%201-4v-2c2-2%203-1%204%204l1%204%201%202c0%201%200%202-1%201l-2%201%201%201%201%201c1%201-1%201-3%201s-4%203-2%204v1l3%201c1%200%202%202%201%203l-1%201v-1l-1-1-2-1c-1%200-2%201-2%203%200%203%200%203%201%202%200-2%201-2%201-1h2l2%201-2%201-4%202c-3%204-14%2011-12%207h-1l-2-1-3%201h-2v-1l-1-1h-3l-3-1v-5c0-3%200-3-1-1-2%203-5%203-4%201%200-2%200-2-2%200-3%203-10%206-11%205l-1%201-1%202-2%201-2%201-3%202c-1%201-1%201-2-1-1-1-1-1-2%202l-2%202h-1l-2%202-2%201-2%201c-2%200-4%201-3%203%200%202-1%204-2%202h-1l-7%204-2%201c-2%202-4%203-4%201l-1-3v2c0%202%200%203-2%204l-3%201c-4%202-5%201-6-3%200-3%200-4-1-3-2%201-1%202%200%203v6l-1-1c-1-1-1-1%200%200l-1%202-3%202c-3%203-8%204-10%202-1-1-1-1-1%201v2h-1l-5%203-5%203h4l6-1h4l3%201%202-1h2v-4l1-1h1l1-1v2h3v-2l1-1%201%202c1%202%201%202%202%201h2l2%201c2%200%203%201%201%203l2-1h3v1c-1%201%205%201%2014%201%2014%200%2018-1%2014-3l-2-2h-1l-1-1%201-1h-1v-1l-1-1-1%201-1%201v-1l-1-2-1%201-4-1c-4-2-5-3-4-5%200-2%200-2-1-1-2%201-3%201-3-1l1-1%203-1c1-2%202-2%202-1l1%201c1-2%2024%209%2030%2015l4%204h11c11-1%2014-2%2027-8%209-4%2020-16%2018-18l1-1%203-5%203-5%201-1-1-1-1-2c0-1%200-2-2-1v1l-2%201v1c1%201%201%201-1%201-3-1-5%200-3%202s1%208-1%208l-2-5h-1l-1-1-1-2c-2-1-3-10-1-13%203-6%206-3%206%206%200%202%200%203%201%202h1c2%203%202%200-1-8-4-12-4-17-1-21%202-3%203-5%201-4-1%201-2-1-1-2h1l1%201%201-1v-1c1%201%203%200%204-1l8-4%205-2-5%201h-13l6-3a140%20140%200%20008-1l1-1%201-2%201-3c0-3%200-3-1-1-2%205-8%208-10%204h-1c0%202-2%203-4%201h-1l-3%201h-4l-6%201c-7%200-7-1-8-11%200-4-1-4-3-1-1%202-1%202%200%200l1-7h1c1%202%206%200%206-3h-1c-1%202-4%203-4%201l1-1%201-2v-2l-2%202-3%202%201-2c4-3%204-3%200-7l-5-6-4-5-2-4v-3l2%202c3%203%203%202%201-3l-2-3c0%201-1%201-1-1-2-1-2-1-2%202l-1%204-1-3-1-2c-1%201-5-4-5-5h-1l-1-2v-2l-1%201h-3l-7-1c-3%201-3%201-5-4s-3-5-3-2m-27%201v1h-1v1l-2%201%201%201h1l2%202h3l2%201c1-1%201%200%201%202l1%201h3l2-2c2%200%203%200%202-2%200-2-1-2-3-2h-2l-2-2-1-1-5-3-2%202m70%206v2l-1%201c-1-1-1%200-1%203%201%205%202%206%204%207l3%201%202-1c-1-1%200-1%202-1%201%200%202%200%201%201l1%201c2-1%201-2-1-3-2%200-3-1-1-2h1v-1c0-4%202-4%203%200%201%202%201%202%202%201l-1-3-1-4-3-3h-2c2%203%202%206%200%206-3%200-6-3-5-5%200-2-1-3-3%200m165%203l-13%2021c-1%205-3%207-3%204%200-1-1-2-2-1l-2-2-1%201-1%202-2%203h-1c0-3-1-2-1%200l-2%203c-2%202-1%204%201%202l3-1v1c-3%202%201%201%204-1l4-3h1l4-1c3-2%203-2%201-3-1-1-1-1%201-5l1-4%201-1%202-2c0-3%205-8%205-7l1-3%201-3%202-2-4%202m-127%208l-2%205-1-1v-2l-1%202-1%201-1%201-1%203c-1%203-1%203%201%203v2h2l1%201v2h1c2%200%202%200%201%201v4l1%201%202%205%203%206v2l-2%203%201%202h2v7l-2%201%201%201%202%201%2011%201%2016-1h2l-2%202c-2%202-4%202-14%202-13%200-20%201-21%202l-3%201-2%201-3%203-3%203-1%202c-4%202-5%2011-3%2015%201%201%201%201%201-1s8-15%2010-15h2l4-4%207-5c11-1%2015-1%2021%201l6%202%201-2%202-2v2c2%204%206%202%209-4l2-4-6-1c-12-1-17-2-17-3l-1-1c-2%203-15-10-19-18-5-10-8-24-5-26v-3c-1-2-1-2-1%202m18-3c-1%202%200%2012%201%2013l1%202c-1%201%201%205%202%204l1%201c-2%201%201%204%203%203h1l-1%201v1c1%201%202%202%203%201l1%202%201%201%201%201%203%201h1c-1%201-1%201%202%201h6l1-1%201%201h2c3-1%200-3-5-3l-5-2-3-1-3-1-1-1-1-1-3-3-3-3-2-3v-1l2-1h-2c-2%200-3-2-3-10l-1-2m-8%2012l2%206c0%208%201%209%202%206%202-1%202-1%202%201%200%201%200%202-1%201l-1%201v2l-1%201%204%201c2-1%203%200%203%201h2l1%202c1-1%202%200%202%201%201%201%201%202%202%201l2%201%202%201h1l1%201c2%200%201-3-3-5l-6-4-4-2-1-1c0-1%200-3-2-5l-2-5c-1-4-3-7-4-7l-1%202m-98%2010c-1%203%200%205%202%204l1%201%202%203%201%203%201%201c1%200%201%206-1%207v1c2%200%203%202%201%202v2l2%202%201%201v4c1%201%201%201%201-1s0-2%203-1c1%201%202%201%202-1l1-1c1%201%207-1%209-3h4l2-1%201%201c-1%201%204%204%207%204%203-1%204-3%201-4l-3-3h-1l-1-1%201-3%202%201%201%202%202%202%201%202h3l1%201v-2c-2-3-2-5-1-7v-2l-2-2h-3v-2h-2l-1-1v-2l-2-2-2-2-1-1-2%201c-2%202-2%202-3%201%200-2-2%200-1%203%200%202%200%202-2%202l-3%201c-2%202-4%201-4-1%201-2-2-4-3-4h-3v-1l-1-1h-1l-3-1c-2%200-2%200-1-1v-2h-4l-2%201m160-1l-1%202c0%202-8%209-11%2011l-8%202-5%201h-6c-5-1-6%200-6%201%200%202%200%202%202%201h3c4%202%2015%200%2015-2h1c1%201%201%201%202-1h1c0%201%203%202%206%201%202%200%202-1%201-1-1-1-1-1%201-2l1-2%202-4%202-4%201-2%201-1h-2M61%20177c-2%201-1%202%201%202%207%200%2011%208%207%2012-1%201-1%201%201%201%203-1%204-3%204-7%200-5%202-2%202%204%200%203%200%203%202%202v-6c-1-1%200-1%201-1%202%200%202%200%200-2l-3-1-1-1v-3h-3v2l-5-1c-4-2-5-2-6-1m181%206l-1%203h-1c-2%200-6%204-6%208%201%202%200%204-1%205l-2%202h2l2-2%202-1%203-2%201-1-2-1c-3%200-2-1%201-3l2-3h2c3%202%204-2%202-6-2-3-1-3-4%201m85-1l-1%201%201%201h1l-1%201c-2%200-3%203-1%205v6l3%206c2%200%203-3%203-8l1-4%201-1c1-1%201-1-1-1h-1c1-2-3-7-5-6m-98%2010l-6%203c-3%201-4%202-5%206-3%2011-11%2014-23%2010-8-3-8-3-3%202l5%205v14c1%200%206-8%206-10h1c0%201%201%201%202-1v3l-1%204-1%202h-1c-1-1-1%200-2%203l-1%205c-1-1-3%202-2%202l-2%202h-3c-1%202-1%200-1-3%200-1-1-1-2%201h-2l1-2%201-4%202-6c5-9-7-21-18-18-8%202-15%2010-14%2015v2l-2-2c0-2%200-2-3%201-1%201-3%203-2%204l-1%203c-1%202%200%203%206%201%203-1%206-6%204-8l3-6h1l1-2%201-3%203-2c2-2%206-2%209%200l4%202c3%202%208%2011%206%2013l-1%204c0%203-1%204-6%2010l-7%207h-2c-1-1-1-1-1%201v2c-1-1-1%200-1%201l-1%201c-1-2-5-2-5-1l-2%204c-2%202-2%203-1%205h1v-2c2%200%201%204-1%207l-2%203-1%202-2%201c-1%201-1%200-1-1l-1-2v2l-1%201c-1-1-1%200-1%203l-3%203-1%201-1%201h-1l-1%201h-1l-1%201c-1-1-1%200-1%201l-1%201h-1%2012l-1-1v-1l1-1v1h1l1%201v2l1-1h4l1-1v-1c1%201%202-5%200-7v-1l1-2c-1-4%203-5%204-2l1%201%201-2v2c-3%204-2%204%201%202l3-2%205%201c11%202%2017%205%2017%209%200%202%200%202-1%201-1-2-1-2-1%200%200%204%202%204%203%201s3-4%205-2l-1%201v2h13c3%202%207%201%209-1%201-1%202-2%201-3h1l1-1-2-2-2%201c2%202%200%204-2%203-2%200-3%201-2%202h-2l-2-3c0-1-5-7-5-5l-1-1c-1-2-2-2-2-1s-1%201-1-1l-2-1-2%202v-3c3-2%202-2-1-1l-3-1-2-2h-2v-1l-1-1h-1l-1-3h-4l-1-1-1-1-1-2c-1-1-2-3-1-4h3c0-2%203-3%205%200h6v-1l-2-5c-1-4%202-4%204-1l2%201c2%200%201-2-1-3l-1-1%201-1c-1-1%200-1%200%200l2-1%201-2c2%200%204-5%203-5v-1c3%200%205%200%203-1l-1-1%202-1%202-1%202-3%202-6%201-4v-1h1c1%201%201%200%201-2-1-3-1-3%201-3l2-1h2l1-1c0-2%204-5%204-4l3-1v-2c-2%200%200-8%202-10h-3M1%20204c0%203%201%206%204%2010%204%209%206%2017%201%2012H4l-1-1-1-1-1%2017v15l4%204c4%203%205%204%205%201h1l2%201v-1c0-2%200-2%202-2l3-1h-2l-1-1-1-1-2-2v-1l-2-4v-8l1-4a307%20307%200%20012-28c0-2-1-3-2-3v-1c1-1%201-1-1-1l-2-1-3-1-2-1-1-1-1%204M0%20366c0%203%200%205%201%204l2-2v2c3%200%204%200%204%202l2%201%202%201%202%201%201%201c-1%201%204%203%206%202l1%201c0%208%201%2012%204%2010%202%200%203%203%204%208l2%203c1%200%201-1-1-7l-2-6%205-2%204-3c-1-3-31-22-35-22-2%200-2%201-2%206m38-5l-1%202-1%201c1%201%200%202-1%204-3%202-3%204%200%204h1v1c2-1%204%202%204%204l-2%201-1%202%203%201%202-1-1-1v-4l-1-4h-1l2-1%201-1%202-3h3l2-1-1-1-1-1-1-1-1%202-1%201c-2%200-2-2-1-3%203-1%201-2-2-2s-4%200-3%201m26%201l1%203%201%202h-1c-2-2-3-1-3%201%200%201%200%202%202%201l1%202-1%203-1%201-1%204%201%204a124%20124%200%200017-18c2-2%203-5%201-5l-1%201h-1l-7-1c-7%200-8%200-8%202m48-1l-2%202c0%203%200%203-1%202h-2v1l3%201h-3l-2%201-1%201c-1%201-1%201%201%201l2%201-1%202h-1c2%201%201%202-1%201-1%200-2%200-1%201%202%200%203%202%201%202v2l-1%201v1l-1%201h-1v2l-1%202-1%201v2l-1%201h-1l-2%205v1l-1%201-1%201v1c-1%201%200%201%201%201l5-2%207-4%207-5c2-2%203-3%204-2l-1-1%201-1h2l1-1v-1l1%202h2l1%201-9%2011-4%203h9c8%200%209%200%2010-2l2-2h2c1-1%201-1%201%201-1%203-1%203%202%203l4-1c2-2%204-2%202%200-1%201-1%201%203%201%203%200%205-1%205-2%200-2%200-2%201-1v2l11%201c12%200%2013%200%2014-2l3-3%201-3c0-3%200-3%202-3l1-1c0-2%200-3%202-3v2c0%202%200%202%201%201h2c2%200%202%200%200%202l-1%203v1c-1%201-1%201%201%201%201%200%202%200%201-2l1-2%201%201%201%202c3%201%201%204-1%203l-2%201-1%201h-1l2%201%202-1v-1l1%201c0%202%2019%201%2020-1h4c0%202%201%202%2017%202h17l3-3c1-2%203-3%203-2l1-1%202-3%209-11%204-6%202-3h1c1%201%201%201%202-1l1-2v-1l1-1c2%201%202%201%201-1%200-2%200-2%201-1h2l-1-1-1-1h2l1-1h-19a351%20351%200%2000-63%201l-2%202h-2l-2-3c1-1-3-1-16-1-12%200-16%201-17%202h-1l-1%201h-1l-2%201-1%201-1%201c0%202-5%203-6%202s-1-1-1%201h-7c0%202-2%201-2-1h-2l-1-2v-1l-1-2-1%202-1%202v-1l-1-4c-2-2-2-2-3%200l-2%203%202-1c2-2%202-2%202%203l-1%204h-5l2-1v-2l-2-2a1414%201414%200%2000-2-5c0-1-1-1-2%201-2%201-2%201-1-1l-2%201-2%201v-1l-1-1h-5m179%208l-5%208-1%201c1%201-2%204-4%204v1l-1%201v1l-2%201c-2%200-2%200-1%201s1%201-1%201v2l-1%201-1%201-2%202v1l-2%201h-1c1%201%201%201-1%202-1%202%203%202%2065%202h67v-6a679%20679%200%20010-25v-9H295l-4%209M2%20381v11l1-1c1-1%201-1%201%201-1%202%201%204%203%203v1c0%202%202%201%208-2%209-4%209-4%206-4-5%200-6%200-5-2l-1-1-2%202-1%201h-2c-1%201-1%200-1-1l-1-3v2c0%201%200%202-2%202s-2-1-2-4v-3l-1-2H2'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE90lEQVQ4y1WVaVCVZRiGv3M4dQ47SAlBKCgH9bDEkKE2KcqWHZQQdECQZHVDDJRUBJRdoAxwEBRQBBVwwRRyo5F0FBSRRZQIHPFXM9FMOvZH+3X1ng/E6cczz7vez3Lf7/dJkiTx1nQ6HVlZWURGricxMYnY2Dj0wcFojDXyvkKpQPWeCmNj48k7CgmlkRK1Wj2NIRkufbF0KYsXLyYqKop169ZhZGQkH7K0tCQkJITi4mK0rq7Tl4xNjDExMZHPGeZqjRoTUxNUKhVSyo4dFBQUUl9/km1bt+Lk5CQfUiqVuLi4yEDLly+nrq6O8PBwZk/tqzUaNMJMzUwxNTXFysoSa2trJJ3ODd9lvkRERHCqsZHk5O2YmZvL5cbGxk5ntSp4FcGifP+AAGxtbeU1I5URCoVCztbQBsNc8vP3l7MyWGlJKZ2dnWzevAUPDw/y8/LJFD01lBMXF8+GmBi8vb2Jjo7+X/lvwc3MzJACAwPZsCEGLy8vXEV5zc0ttLf/zFd6vZzh06dPGR0dY2joMf0DA3R3dzMwMEh19VHS0tI4f/4CYaIVCsUUKX5+fqJPWoIE8KcLFwpiorlwoZWengcy2Pj4cy5dukRKSgqXL7cxMfEXf794yatX/8h7b978y4uXL0lKSpoErKmpFYTUs2nTZvbvP0B5eQWZmdnU1tbSJgDu3LlLbk4uS5YsIT+/gOEnw9y6dZtz587T86CXPycmeP36DX19/XKbJEdHR/z9A0gSusvO3s+xYzXyxePH6+USm5qaqT9RT1tbu5zh+LNxrly5yv37PaKKXvbt2ycnkpGRgVarRYoRjQ4MChIWSIBgcO/evZSVlVFdVU1XVxeFQlKHDv3I6dNn5EAtLWdFkCYKxLio6CD+fv64ubnhOMtxsuSEhARWrFiBu7u7TL8hmqGEI0eqWB8ZJURdQmFhEfHxCawX/fXxWYS9vT2enp74+vpiZ2c3zbgs9LVr18qpLvLxITU1TRZ4R8cvMlD6rnT6+wc4fPgwesG6AThRJPAWwCDod2DKScCwsDU0NjRQVVUltBaHbsF8loqnaCAhNyeH3Nwc+X1XCLLy8/KEVkuEvLTMnTsHCwtzGcx25sx3sum4eZvK6joior5BvyqU2XNc+cDWgaCVq8k+UEBoWATxScnUnTxDdU09x4VvOH2Wax2dNJ45x6HySppaWqmpa6Ci8ijSlQx3Tmy0oCpSzfVMHRdTZ1MRruTXXC9+SnPm+r4FXExzojHRhlv5n9GZt5AbWZ50lXzOYGUgI7WrGTsRyh9no4T/GulRusSzgzMZL7bjt/2mjOZZ8bzYlpEcC37PtRDeUqxZM5ZvxZA4O7RLkv3gTon+byX6dkzag+0SD4WXBvaoeFzgwMj38xkt82C4aDbDJVpGK7yFd2Ws/BNGSsW83Isn2WY82i0A9yoZnPIGe5yhnB5Lvbs1PM40pkdEvCui9KYr6dttxMPvVAxlauhKkegWmdxLFV7YvZ1K7oi1vj1qutMU8lqX2L+/y0geS1vioyk8kEFrcwPFeVncaG8lZOUKQvX+rBZep52FPmAZ85ztmT/HHo1SIuTL5SRtjEQtmLUxfx+7GSa4Otnh7GCDlF9wkMZTTdzouMnVax2UlP4gGNajnbcAJ2cXdG4ehK4Jx95hlvhUmfGR/cdsS94hfgtTGlSqMLe0YobNh1jNsOE/paZE1nl5Y8UAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/c370cac4ebfe0b74881682593e7ee256/3ddd4/cover.png","srcSet":"/static/c370cac4ebfe0b74881682593e7ee256/078a8/cover.png 163w,\n/static/c370cac4ebfe0b74881682593e7ee256/e56da/cover.png 327w,\n/static/c370cac4ebfe0b74881682593e7ee256/3ddd4/cover.png 653w,\n/static/c370cac4ebfe0b74881682593e7ee256/c5cc7/cover.png 980w,\n/static/c370cac4ebfe0b74881682593e7ee256/6050d/cover.png 1200w","srcWebp":"/static/c370cac4ebfe0b74881682593e7ee256/0acdf/cover.webp","srcSetWebp":"/static/c370cac4ebfe0b74881682593e7ee256/ac59e/cover.webp 163w,\n/static/c370cac4ebfe0b74881682593e7ee256/7660b/cover.webp 327w,\n/static/c370cac4ebfe0b74881682593e7ee256/0acdf/cover.webp 653w,\n/static/c370cac4ebfe0b74881682593e7ee256/75470/cover.webp 980w,\n/static/c370cac4ebfe0b74881682593e7ee256/9000d/cover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2016v16h3a153%20153%200%200129%204h1l6%201%205%202c0%202%203%200%209-6l16-13%2010-3c2%200%202%200%200-3v-3c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1%200-1h3l-3-2-1-2c2%200%201-2-2-2h-2l2-1-38-1H0v16M91%202l1%205v4h1c0-2%206-4%2011-5h2a131%20131%200%200172%2010l6%203%2023%2018c3%204%205%205%207%206a78%2078%200%200111%202l10%204c17%209%2030%2024%2034%2041l1%208h8c9%200%2010%201%2012%208l1%203%201%202c0%201%205%202%207%200l7-2a377%20377%200%200011%200l5%201%205%201-2-2c-1-1-3-2-4-1l-1-1%201-1v-1c-1-1%200-6%202-7s3-1%207%203c6%206%2012%209%2022%2012l9%202c2%200%203%204%203%209%200%204%200%205%205%208l8%207%207%208c3%203%204%204%205%208%200%202%200%203-1%202l-3-1-6-5-4-3%201%202%202%205%202%203h3l1%201h3v12l-1%208-1-1v-1l-1-3-1-6-2-5-1-4v5l1%206v1l-1%204c-1%204-3%205-3%202l-1-3-1-1-1-6c-2-5-2-7-1-12v-6l-2%202-1%203-1%204-1%201-4%203c-2%202-2%202%200%202%202-1%202-1%202%206v20c-1%202-2-1-1-3l-1-1-1-1%201-1v-2l-1-1-4-4-2-3v6l1%207%201%207c0%205%200%207-1%206-2-1-2-8-1-10v-2c-1-1-1-1-1%201h-1l-2-1v-5l-1-5%201-5%202-3c-1-1-4%201-4%204s-2%203-7-2c-4-3-4-3-4-1v5c0%204-1%204-2%203-2-2-2-2-1-3l1-3h-2c-1%201-1%201-1-1%200-1%200-2-1-1l-1-1c1-1%200-1-1-1l-2%201-2%201c-2-1-2-1-2%202l-1%203-2%203c0%202-1%204-3%204v-1l1-2-3%202c-1%201-2%203-2%209l-1%208v12c1-1%201%200%201%201l-1%201h-1l-1%207-1-10-1-1v-2l-1-2c-1%200-4-6-3-7v-4c-1-2-1-2-1%202-1%206-3%206-4%202-1-6-2-4-1%202%200%207-1%2010-3%206l-1-2c-2%201-2-6%200-8l1-2h-4l-3%201h-2c-2%202-6%200-6-2l2-2%204-2%203-2%201-1%201-1c4%200%206-1%207-2%202-2%202-2%204-1%201%201%201%201%201-1s0-2%201-1%201%201%201-1l2-2h1l2-1h3l4-2c3-1%204-3%203-5l2-1c0%201%201%201%200%200l1-1c3%201%206%200%205-1v-1c1%201%202%200%203-1s1-1%201%202l1%203%201-1v-2l1-2v2l1-1c1-2%201-2%202-1l2%201%201%201h2l1%201%201%201h1l3%201c3%200%204%200%205%202l1%203v-3c0-3%201-4%203-3%201%201%201%201%201-1%200-3-1-4-2-2-2%202-9%201-15-1-4-2-8-3-10-2-5%201-16%206-21%2010a117%20117%200%2001-21%209l-2%201-25%2013-3%202h-2l-2%201h-1c-2%200-2%200-1%201l-1%202-2-2-1%201c-1%201-1%201-2-3l-2-4-3%203c-4%204-6%205-6%204l-4%203-3%202-1%201-3%204a81%2081%200%2000-17%2024c-2%202-3%206-2%206l1%204c0%206%202%2011%204%2011%200-1%201-1%200%200l1%201c2%200%202-1-1-4l-3-4c0-2%200-2%202%201%203%204%205%205%205%201%201-2%201-2%202%200h2l-2-5-1-1c-1-2%200-2%201-1l2-1-5-1c-5%200-7-2-2-3s6-1%208-5%204-5%206-3l-1%201-3%205-2%205%203%201h3l1%201h-5c-2-1-2%200-1%204l1%201c0-2%200-2%201-1l1%203c-1%201%200%202%201%202%201%201%201%201-1%201-2-1-3%201%200%205%201%201%202%202%204%201%203-1%204%200%203%204l4%201h4l-3-2c-4-3-7-14-8-24%200-12%200-12-3-11-6%202-8%202-7%200l2-1%201-1c-1-1%203-5%205-4l2-1c1-3%204-2%203%200-1%203%201%202%202-2%203-4%203-4%202%202v8c2%203%204%204%204%202l-1-2-1-2c0-1%200-2-1-1v-3h1c0%201%201%202%202%201%203%200%205-5%205-10%200-4%205-11%205-7l-2%207c-2%205-2%208%200%2029%201%2011%202%2014%203%2012h2l3%202h3c2-3%202-2%204%200%202%203%202%203-3%203l-6-1c-3-2-4%200-2%201%202%202%2019%202%2021%201h1c1%201%201%200%201-1%200-4%202-8%203-7l1%205c0%204%200%205%201%202%200-4%202-4%203%200%200%204%201%205%201%202%200-2%201-3%202-3l1-3%201-2c1-1%201%200%201%201l1%205c1%203%201%203%203%202%204-2%205-3%206-7v-3l2%203%201%206%202%204c3%202%203%202%204-3l1-4%202%205%203%204h2l2-3%201-3%201%203c1%205%202%206%205%206%205-1%207-2%208-5l1-2%201%203c1%203%202%204%203%203l2%201-2%202c-3%200-2%201%203%202l8%201c4%200%205%200%205-2h-1l-3%201c-3%200-3%200-3-3s0-4-2-4c-2%201-4%202-2%202l1%202c0%201-1%201-2-1-3-4-3-3-1-9%201-6%203-6%204%200%201%205%202%205%205-1%203-9%205-8%206%204%200%206%202%2011%203%209l2-6%203-9%201%206v6l5-1c6-3%2024-3%2026-1%201%202%201%202%201%200V0H245C98%200%2090%200%2091%202m1%2012v11l-1%204v2l-1%202-3%2010-2%205-6%2012c-5%2011-10%2016-11%2013h-1l-2-2v-2h2l-1-1-2-2h2v-1c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1-1-2l2-3c-1-1%200-2%202-2%201%200%202%200%201%201l-1%202h2l2-2%201-1-1-1h-2v-1c2%200%205-3%203-3v-2c-2%201-3-1-2-3h2v-3l1-1%202%203c1%201%201%201%201-1v-2h2l-2-1c-2-1-2-3%200-4l-1-1v-2l1-1v-5l1-1%201-1v-1c-3%200-2-2%200-2l2-1h-2l-2-2h1l2-1c-2-2-5-1-5%202l-1%203v1l-1%201-1-2-2-1%201%203v1h-2c1%201-2%203-3%203l-1%201c-1%202-5%205-6%204l-1%201c1%201-3%204-5%205-2%200-3%201-1%201s7%203%2012%207l2%202-3%204a431%20431%200%2000-7%209v-3l-1%201-2%201c-1%201-2%200-2-1h-1c-1%201-1%201-2-1-1-3-2-3-3-3-3%201-3%200-3-2v-9l-1%203-1%203v5l-2-10c0-2%200-3-1-1l-3%204-2%203c0%202-2%201-3-2l-1-2%201%202c0%202%200%203-1%202-1%200-2-1-1-2%200-2%200-2-1-1l-1-5v-2c-1%202-2%202-3%202l-1%201%201%201c1-1%201%202-1%204h-2l-1-1c-5%200-7%200-10-3s-5-3-4%200h1l1%201%202%201c1%201%200%201-2%201-3%200-4%200-4-2-1-2-1-2-2-1v4c-1%200-2%202-2%207l1%208%206-2c10-2%2031-2%2038%201l5%202h1l16%207c7%204%207%205%207%203l1-6c2%200%202%200%201-1l2-6%203-5%207%207c9%2010%2013%2013%2014%2017%201%203%203%204%203%202a289%20289%200%200150-36l15-4h19l1%201a2298%202298%200%2001-34%209l-2%201-15%208h-1l-1%201c1%201-5%204-6%203v1l-1%201h-1c1%201-3%203-4%202l-1%202c1%200%201%201%200%200l-1%202-1%202h-2l-1%201v1l-1%201c1%201-4%204-6%204-4%200-1%201%204%202%2011%201%2014%2014%204%2019l-2%202%2014%209c4%201%2013%200%2014-2l3-1h5l6-1%204-2%201-2v-1l-4-6c-5-8-7-11-9-10v-1l-2-2-1-2-3-4-5-2h-1l-2-3-5-2h-5c-4%201-2-2%202-4%205-2%2014-1%2020%202l19%2015c4%205%2020%2013%2024%2011l3%201c1%202%203%203%203%201h2v1c-2%200-2%200%200%201%204%202%205-1%201-3-3-2-3-3-1-7%200-2%200-2-2-2-1%201-2%201-2-1l11-1h9c-3%200-4-2-2-2l10-2h-6l-1-1v-2c2-2%201-4%200-4-3%200-3%200-1-2v-1h-1l-1-1v-1l-1-1c-1%200-1-1%201-1v-2l-2%201h-1l2-2v-2c1-1%200-4-1-4v2c0%202%200%202-1%201s-2-2-1-3l-1-1h-1c1-1%201-1%200%200l-2-1c0-1%200-2-1-1v-1l-1-1h-1c0-3-1-5-2-4h-1l-1-2c-1%201-3-3-2-4l-1-1h-2l-1-1c0-2-3-4-4-4-2%202-1-1%201-3l1-2h-4c-1%201-1%201%200%200l-1-1v-1l-1-2h-2v-1h-1l-1-1c1-3-1-2-2%200s-2%202-3%200l-1-2%201-1h-2l-2-1-3-2-3-2v-3l-1%202v2l-2-2c-2-2-3-2-2%201h-3c0-2%200-2-1-1s-1%201-1-1l-1-2-2-1-1-1c0%203-2%202-3-1%200-2%200-2-1%200h-8c-3%200-4-1-4-2-1-1-1-1-3%201s-2%202-3%200-2-2-2%200h-1c0-2-4-4-4-2l2%201c1%201%201%201-1%201l-2%201-1-1-2-3v1c0%202-3%202-4%200h-2l-1%202-1%201c-1%202-3%201-3-1v-1l-2%201h-2c1%201%200%202-2%202l-3-3-1-2v1c0%202-3%205-4%203-1-1-1-1-1%201l-1-2c-1-4-1-4-2-2m125%2036l4%209a74%2074%200%20018%2024l1%206v1l1%208v6c1-2%204-3%205-1l3%202h12l-3-1-5-1c0-1-1-2-2-1h-1v-2l3-1-2-1h-2l9-1c6%200%208%200%207-1v-1l1-1c-1-2%204-2%204%200h1l3-3%203-1h-3l-3-1-2-3c-2-2-2-2-1-3s1-1-1-1l-1-2-1-1v-1l-1-1c-1%200-5-7-5-10h-1c-1%201-1%200-4-2l-4-4s-2%200-3-2l-20-9M17%2070l-9%203-7%201v6c0%204%200%206%202%207l1%202%202%202c2%200%204%201%205%203%203%202%207%202%207-1l1-1v-2l1-2%201-1v-1l1-1v-2l1-2%201-1h3l3%201-4%206-4%209-2%202h-3l1%201%202%202%201%201h2c0%201%201%202%203%202%202%201%202%201%202%203-1%202-1%202%201%202l3%202%201%201%201-1v-1h2v-1l2-1h2l2-3v-1l-2%201h-1v-1l1-1%201-3c2-1%202-1%202%201v1h1l2%201%202-2h2c2%201-1%205-4%204v2l-1%201c1%201-3%205-5%205-4%200-2%204%202%204l2%202%201%201%201%201v1l1%202c-1%201%200%202%201%201v1l-1%202%202-1%202-1h1c2%200%203%202%202%205-2%204-9%203-7-1l-1-1h-1l-1-2c0%201-2%200-3-2l-2-1c-1%201-1%201-3-1l-2-1-4-3c-2-2-3-3-4-2h-2v-3l1%201h1v-2l-2-1v-1l-1-1-4-1-4-2-2%204-7%2010-5%207c0%203%201%204%206%202%203-2%203-2%203%200l2%201%201%201h-2l-1%201-1%201H7l-2%202c-5%202-5%203%200%204l3%201h4l3%201%2011%202%2014%204c5%201%206%202%205%204l1%201h2c0%201%207%200%2011-2%202-2%206-3%209-4l3-2%202-1%202-1h-3l2-2h3l1%201%201%202%201%203c0%202%202%205%205%205l3%202c2%201%202%201%202-1l-1-2-2-3h-1l-1-2v-1l-4-2c-3-3-3-4-3-9%201-5%200-11-2-16l1-2%203%207c1%206%204%209%202%204%200-3%202-4%205-1%201%201%203%202%203%200v-1l1%201c-1%201%200%202%201%203l2%201%201-2%201%204c-1%204%201%205%202%202v-1l-1-1%203-2h4l-4-1c-3-1-15-12-15-14s0-3-1-2l-1-1-1-2-2-1-1-3c2-1%203%200%204%201%200%203%203%205%204%204l-1-1-2-3-2-4-5-6c-4-7-9-12-11-11l-1-1-7-7-8-7h-3l-1-1v1c1%201%201%201-1%201s-3-1-3-2h-1l-3%201c-3%200-3%200-2-1s1-1-2-1h-7c0%201-1%202-2%201h-4l-2-1-2%201m86%2023l-1%201h-3l-1%201-1%201h-4l3%205%206%204v-2c-1%200-2-1-1-2h2c1%201%202%201%203-1l4-3c2%200%206%205%207%209l1%202v-2h2v-1c-1-1-1-2%201-3l1-4-1-3h-1l-1-1-7-1h-9M1%20104c0%2013%200%2013%207%205%204-5%203-5%205-3%202%201%202%201%202-1%200-1%200-2-2-1v-4c-2%201-8-3-8-4H4c-1%201-1%201-2-1s-1%200-1%209m202%2023c-10%203-15%2013-12%2027%200%204%202%207%202%204l1-1c1%201%206-1%206-2l1-1%201-1c-1-2%200-2%202-1h1l1-1%201%201v1l2-1h3v1h2l3%201c1%201%201%201%201-1-1-2%200-2%201-2%201%201%201%200%201-1%200-2%200-2%201%200l2%203%201%201c0%201%201%202%202%201v4c1-1%201%200%201%201%200%205%202-1%202-7%200-4%200-6%201-4%201%203%202%204%202%200-1-5-3-9-4-8v-1l-1-1-2-1-1-2h-1v-1h-1v-1l-1-1h-1l-1-1-3-1-8-2c-5%200-7-1-2-1l4-1h-7m-120%204l1%203%201%205c0%204%202%208%204%206l-1-2-1-1h1l1-1v-1h1v2c0%201%200%202%201%201%200-2%203-1%203%201h2c1-1%202%200%200%202v1h1l1-1c1%200%202%201%201%202l1%205c1%203%202%202%201-1l2-1%202%201c0%206%204%2013%205%2011l-1-6-1-5%202%203c0%201%201%202%202%201v1l1%204%201%202h2l1%202%202%201c2-1%202-1%201%201l1%202c2-1%201%201-1%203v3l2%204c0%202%200%202-7-7l-5-4-1-1c0-2%200-3-1-2l-1%202c1%201-3%202-5%200-2-1-3-1-7%201-5%202-6%202-9-1l-2-2%202%201c2%200%202%200%201-2l-4-4-5-4c-2-2-10-3-10-2l-1%201-2%201h4l1%201%204%201%204%201c2%201%202%201%200%203l-4%206c-3%204-3%204-3%202l-1-2v2l-1%203-1-1v-1l-1-3c0-4-1-2-1%202%200%206-2%205-2-1%200-5-1-6-1-2l-1%202v2c1%202%201%204-1%203v-2l-1-1v-1l-1-2h-1l1-1%201-1-1-1c-2%201-1-4%201-6s1-2-2-1l-2%204c-1%202-2%202-4%202-3%200-4%200-3-1l-1-2c-1-1-1%200-1%203l-1%201h-2l-4%201c-1%200-2%200-1-1l1-1c0-2-3%200-3%202h-2l-1-1v-1l-2-1c-2-2-2-2-4-1-1%202-1%202-2%201h-1l-5-1h-1l-1%201v-3h-1l-2-1c-2%200-2%200-2-2%200-4-2-5-2-1-1%203-1%203-2%202H7l-1-2v-3l-1%203-1%202-1-3-1-1-1%2014v13l2-1%203-1%201-1c0-1%209-2%2012-1%204%201%203%202-1%203l-4%201-1%201h-1a1075%201075%200%2001-5%202c1%201-3%204-3%203v2l-1%202H1l2%201%209%206c5%205%208%206%207%204v-3l1-4%201-1c1%201%203%200%205-2l4-2%204-1c8-5%2030-8%2034-5%202%203%200%204-4%205h-4l-10%201c-12%202-20%205-28%2013l-2%203-2%201v1c1%201%201%201-1%201s-2%200-1%201v4l1%201-1%2019%201%201c1%200%203%201%205%204%203%204%2013%2011%2015%2011%203%200%203-2-1-6-3-3-3-4-3-8l2-6%201-2c1-6%206-12%2010-11v-3c2-1%203-1%203%201h-2c1%202-3%206-5%205v1c0%202%200%202-2%201v1c1%201-1%207-2%207l-1%203c0%203%203%2011%204%2011v2c0%202%200%202%203%200%202%200%203-1%203-2h7l4-1c3-1%204-1%203-3s-1-2%201-3h3l4-1c2-1%203-8%201-9l-1-2-1-3c-2-3%201-4%203-2l3%206c1%204%201%204-1%205v2c3%201%206-2%205-5%200-1%200-2%203-2%202-1%203-2%203-4%201-2%200-3-2%200-3%203-2-3%201-8l2-4%2012-12c2-2%203-2%204-1h7c1-1%208%200%207%201l2%201c2%200%202%200%201-1-3-2%201-1%204%201s3%202%201%203c-1%201-1%201%202%201l2%201%201%201%201%201v1l1%202v2c-1%201-1%201%201%201s3-2%201-4v-2c2-2%203-1%204%204l1%204%201%202c0%201%200%202-1%201l-2%201%201%201%201%201c1%201-1%201-3%201s-4%203-2%204v1l3%201c1%200%202%202%201%203l-1%201v-1l-1-1-2-1c-1%200-2%201-2%203%200%203%200%203%201%202%200-2%201-2%201-1h2l2%201-2%201-4%202c-3%204-14%2011-12%207h-1l-2-1-3%201h-2v-1l-1-1h-3l-3-1v-5c0-3%200-3-1-1-2%203-5%203-4%201%200-2%200-2-2%200-3%203-10%206-11%205l-1%201-1%202-2%201-2%201-3%202c-1%201-1%201-2-1-1-1-1-1-2%202l-2%202h-1l-2%202-2%201-2%201c-2%200-4%201-3%203%200%202-1%204-2%202h-1l-7%204-2%201c-2%202-4%203-4%201l-1-3v2c0%202%200%203-2%204l-3%201c-4%202-5%201-6-3%200-3%200-4-1-3-2%201-1%202%200%203v6l-1-1c-1-1-1-1%200%200l-1%202-3%202c-3%203-8%204-10%202-1-1-1-1-1%201v2h-1l-5%203-5%203h4l6-1h4l3%201%202-1h2v-4l1-1h1l1-1v2h3v-2l1-1%201%202c1%202%201%202%202%201h2l2%201c2%200%203%201%201%203l2-1h3v1c-1%201%205%201%2014%201%2014%200%2018-1%2014-3l-2-2h-1l-1-1%201-1h-1v-1l-1-1-1%201-1%201v-1l-1-2-1%201-4-1c-4-2-5-3-4-5%200-2%200-2-1-1-2%201-3%201-3-1l1-1%203-1c1-2%202-2%202-1l1%201c1-2%2024%209%2030%2015l4%204h11c11-1%2014-2%2027-8%209-4%2020-16%2018-18l1-1%203-5%203-5%201-1-1-1-1-2c0-1%200-2-2-1v1l-2%201v1c1%201%201%201-1%201-3-1-5%200-3%202s1%208-1%208l-2-5h-1l-1-1-1-2c-2-1-3-10-1-13%203-6%206-3%206%206%200%202%200%203%201%202h1c2%203%202%200-1-8-4-12-4-17-1-21%202-3%203-5%201-4-1%201-2-1-1-2h1l1%201%201-1v-1c1%201%203%200%204-1l8-4%205-2-5%201h-13l6-3a140%20140%200%20008-1l1-1%201-2%201-3c0-3%200-3-1-1-2%205-8%208-10%204h-1c0%202-2%203-4%201h-1l-3%201h-4l-6%201c-7%200-7-1-8-11%200-4-1-4-3-1-1%202-1%202%200%200l1-7h1c1%202%206%200%206-3h-1c-1%202-4%203-4%201l1-1%201-2v-2l-2%202-3%202%201-2c4-3%204-3%200-7l-5-6-4-5-2-4v-3l2%202c3%203%203%202%201-3l-2-3c0%201-1%201-1-1-2-1-2-1-2%202l-1%204-1-3-1-2c-1%201-5-4-5-5h-1l-1-2v-2l-1%201h-3l-7-1c-3%201-3%201-5-4s-3-5-3-2m-27%201v1h-1v1l-2%201%201%201h1l2%202h3l2%201c1-1%201%200%201%202l1%201h3l2-2c2%200%203%200%202-2%200-2-1-2-3-2h-2l-2-2-1-1-5-3-2%202m70%206v2l-1%201c-1-1-1%200-1%203%201%205%202%206%204%207l3%201%202-1c-1-1%200-1%202-1%201%200%202%200%201%201l1%201c2-1%201-2-1-3-2%200-3-1-1-2h1v-1c0-4%202-4%203%200%201%202%201%202%202%201l-1-3-1-4-3-3h-2c2%203%202%206%200%206-3%200-6-3-5-5%200-2-1-3-3%200m165%203l-13%2021c-1%205-3%207-3%204%200-1-1-2-2-1l-2-2-1%201-1%202-2%203h-1c0-3-1-2-1%200l-2%203c-2%202-1%204%201%202l3-1v1c-3%202%201%201%204-1l4-3h1l4-1c3-2%203-2%201-3-1-1-1-1%201-5l1-4%201-1%202-2c0-3%205-8%205-7l1-3%201-3%202-2-4%202m-127%208l-2%205-1-1v-2l-1%202-1%201-1%201-1%203c-1%203-1%203%201%203v2h2l1%201v2h1c2%200%202%200%201%201v4l1%201%202%205%203%206v2l-2%203%201%202h2v7l-2%201%201%201%202%201%2011%201%2016-1h2l-2%202c-2%202-4%202-14%202-13%200-20%201-21%202l-3%201-2%201-3%203-3%203-1%202c-4%202-5%2011-3%2015%201%201%201%201%201-1s8-15%2010-15h2l4-4%207-5c11-1%2015-1%2021%201l6%202%201-2%202-2v2c2%204%206%202%209-4l2-4-6-1c-12-1-17-2-17-3l-1-1c-2%203-15-10-19-18-5-10-8-24-5-26v-3c-1-2-1-2-1%202m18-3c-1%202%200%2012%201%2013l1%202c-1%201%201%205%202%204l1%201c-2%201%201%204%203%203h1l-1%201v1c1%201%202%202%203%201l1%202%201%201%201%201%203%201h1c-1%201-1%201%202%201h6l1-1%201%201h2c3-1%200-3-5-3l-5-2-3-1-3-1-1-1-1-1-3-3-3-3-2-3v-1l2-1h-2c-2%200-3-2-3-10l-1-2m-8%2012l2%206c0%208%201%209%202%206%202-1%202-1%202%201%200%201%200%202-1%201l-1%201v2l-1%201%204%201c2-1%203%200%203%201h2l1%202c1-1%202%200%202%201%201%201%201%202%202%201l2%201%202%201h1l1%201c2%200%201-3-3-5l-6-4-4-2-1-1c0-1%200-3-2-5l-2-5c-1-4-3-7-4-7l-1%202m-98%2010c-1%203%200%205%202%204l1%201%202%203%201%203%201%201c1%200%201%206-1%207v1c2%200%203%202%201%202v2l2%202%201%201v4c1%201%201%201%201-1s0-2%203-1c1%201%202%201%202-1l1-1c1%201%207-1%209-3h4l2-1%201%201c-1%201%204%204%207%204%203-1%204-3%201-4l-3-3h-1l-1-1%201-3%202%201%201%202%202%202%201%202h3l1%201v-2c-2-3-2-5-1-7v-2l-2-2h-3v-2h-2l-1-1v-2l-2-2-2-2-1-1-2%201c-2%202-2%202-3%201%200-2-2%200-1%203%200%202%200%202-2%202l-3%201c-2%202-4%201-4-1%201-2-2-4-3-4h-3v-1l-1-1h-1l-3-1c-2%200-2%200-1-1v-2h-4l-2%201m160-1l-1%202c0%202-8%209-11%2011l-8%202-5%201h-6c-5-1-6%200-6%201%200%202%200%202%202%201h3c4%202%2015%200%2015-2h1c1%201%201%201%202-1h1c0%201%203%202%206%201%202%200%202-1%201-1-1-1-1-1%201-2l1-2%202-4%202-4%201-2%201-1h-2M61%20177c-2%201-1%202%201%202%207%200%2011%208%207%2012-1%201-1%201%201%201%203-1%204-3%204-7%200-5%202-2%202%204%200%203%200%203%202%202v-6c-1-1%200-1%201-1%202%200%202%200%200-2l-3-1-1-1v-3h-3v2l-5-1c-4-2-5-2-6-1m181%206l-1%203h-1c-2%200-6%204-6%208%201%202%200%204-1%205l-2%202h2l2-2%202-1%203-2%201-1-2-1c-3%200-2-1%201-3l2-3h2c3%202%204-2%202-6-2-3-1-3-4%201m85-1l-1%201%201%201h1l-1%201c-2%200-3%203-1%205v6l3%206c2%200%203-3%203-8l1-4%201-1c1-1%201-1-1-1h-1c1-2-3-7-5-6m-98%2010l-6%203c-3%201-4%202-5%206-3%2011-11%2014-23%2010-8-3-8-3-3%202l5%205v14c1%200%206-8%206-10h1c0%201%201%201%202-1v3l-1%204-1%202h-1c-1-1-1%200-2%203l-1%205c-1-1-3%202-2%202l-2%202h-3c-1%202-1%200-1-3%200-1-1-1-2%201h-2l1-2%201-4%202-6c5-9-7-21-18-18-8%202-15%2010-14%2015v2l-2-2c0-2%200-2-3%201-1%201-3%203-2%204l-1%203c-1%202%200%203%206%201%203-1%206-6%204-8l3-6h1l1-2%201-3%203-2c2-2%206-2%209%200l4%202c3%202%208%2011%206%2013l-1%204c0%203-1%204-6%2010l-7%207h-2c-1-1-1-1-1%201v2c-1-1-1%200-1%201l-1%201c-1-2-5-2-5-1l-2%204c-2%202-2%203-1%205h1v-2c2%200%201%204-1%207l-2%203-1%202-2%201c-1%201-1%200-1-1l-1-2v2l-1%201c-1-1-1%200-1%203l-3%203-1%201-1%201h-1l-1%201h-1l-1%201c-1-1-1%200-1%201l-1%201h-1%2012l-1-1v-1l1-1v1h1l1%201v2l1-1h4l1-1v-1c1%201%202-5%200-7v-1l1-2c-1-4%203-5%204-2l1%201%201-2v2c-3%204-2%204%201%202l3-2%205%201c11%202%2017%205%2017%209%200%202%200%202-1%201-1-2-1-2-1%200%200%204%202%204%203%201s3-4%205-2l-1%201v2h13c3%202%207%201%209-1%201-1%202-2%201-3h1l1-1-2-2-2%201c2%202%200%204-2%203-2%200-3%201-2%202h-2l-2-3c0-1-5-7-5-5l-1-1c-1-2-2-2-2-1s-1%201-1-1l-2-1-2%202v-3c3-2%202-2-1-1l-3-1-2-2h-2v-1l-1-1h-1l-1-3h-4l-1-1-1-1-1-2c-1-1-2-3-1-4h3c0-2%203-3%205%200h6v-1l-2-5c-1-4%202-4%204-1l2%201c2%200%201-2-1-3l-1-1%201-1c-1-1%200-1%200%200l2-1%201-2c2%200%204-5%203-5v-1c3%200%205%200%203-1l-1-1%202-1%202-1%202-3%202-6%201-4v-1h1c1%201%201%200%201-2-1-3-1-3%201-3l2-1h2l1-1c0-2%204-5%204-4l3-1v-2c-2%200%200-8%202-10h-3M1%20204c0%203%201%206%204%2010%204%209%206%2017%201%2012H4l-1-1-1-1-1%2017v15l4%204c4%203%205%204%205%201h1l2%201v-1c0-2%200-2%202-2l3-1h-2l-1-1-1-1-2-2v-1l-2-4v-8l1-4a307%20307%200%20012-28c0-2-1-3-2-3v-1c1-1%201-1-1-1l-2-1-3-1-2-1-1-1-1%204M0%20366c0%203%200%205%201%204l2-2v2c3%200%204%200%204%202l2%201%202%201%202%201%201%201c-1%201%204%203%206%202l1%201c0%208%201%2012%204%2010%202%200%203%203%204%208l2%203c1%200%201-1-1-7l-2-6%205-2%204-3c-1-3-31-22-35-22-2%200-2%201-2%206m38-5l-1%202-1%201c1%201%200%202-1%204-3%202-3%204%200%204h1v1c2-1%204%202%204%204l-2%201-1%202%203%201%202-1-1-1v-4l-1-4h-1l2-1%201-1%202-3h3l2-1-1-1-1-1-1-1-1%202-1%201c-2%200-2-2-1-3%203-1%201-2-2-2s-4%200-3%201m26%201l1%203%201%202h-1c-2-2-3-1-3%201%200%201%200%202%202%201l1%202-1%203-1%201-1%204%201%204a124%20124%200%200017-18c2-2%203-5%201-5l-1%201h-1l-7-1c-7%200-8%200-8%202m48-1l-2%202c0%203%200%203-1%202h-2v1l3%201h-3l-2%201-1%201c-1%201-1%201%201%201l2%201-1%202h-1c2%201%201%202-1%201-1%200-2%200-1%201%202%200%203%202%201%202v2l-1%201v1l-1%201h-1v2l-1%202-1%201v2l-1%201h-1l-2%205v1l-1%201-1%201v1c-1%201%200%201%201%201l5-2%207-4%207-5c2-2%203-3%204-2l-1-1%201-1h2l1-1v-1l1%202h2l1%201-9%2011-4%203h9c8%200%209%200%2010-2l2-2h2c1-1%201-1%201%201-1%203-1%203%202%203l4-1c2-2%204-2%202%200-1%201-1%201%203%201%203%200%205-1%205-2%200-2%200-2%201-1v2l11%201c12%200%2013%200%2014-2l3-3%201-3c0-3%200-3%202-3l1-1c0-2%200-3%202-3v2c0%202%200%202%201%201h2c2%200%202%200%200%202l-1%203v1c-1%201-1%201%201%201%201%200%202%200%201-2l1-2%201%201%201%202c3%201%201%204-1%203l-2%201-1%201h-1l2%201%202-1v-1l1%201c0%202%2019%201%2020-1h4c0%202%201%202%2017%202h17l3-3c1-2%203-3%203-2l1-1%202-3%209-11%204-6%202-3h1c1%201%201%201%202-1l1-2v-1l1-1c2%201%202%201%201-1%200-2%200-2%201-1h2l-1-1-1-1h2l1-1h-19a351%20351%200%2000-63%201l-2%202h-2l-2-3c1-1-3-1-16-1-12%200-16%201-17%202h-1l-1%201h-1l-2%201-1%201-1%201c0%202-5%203-6%202s-1-1-1%201h-7c0%202-2%201-2-1h-2l-1-2v-1l-1-2-1%202-1%202v-1l-1-4c-2-2-2-2-3%200l-2%203%202-1c2-2%202-2%202%203l-1%204h-5l2-1v-2l-2-2a1414%201414%200%2000-2-5c0-1-1-1-2%201-2%201-2%201-1-1l-2%201-2%201v-1l-1-1h-5m179%208l-5%208-1%201c1%201-2%204-4%204v1l-1%201v1l-2%201c-2%200-2%200-1%201s1%201-1%201v2l-1%201-1%201-2%202v1l-2%201h-1c1%201%201%201-1%202-1%202%203%202%2065%202h67v-6a679%20679%200%20010-25v-9H295l-4%209M2%20381v11l1-1c1-1%201-1%201%201-1%202%201%204%203%203v1c0%202%202%201%208-2%209-4%209-4%206-4-5%200-6%200-5-2l-1-1-2%202-1%201h-2c-1%201-1%200-1-1l-1-3v2c0%201%200%202-2%202s-2-1-2-4v-3l-1-2H2'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE90lEQVQ4y1WVaVCVZRiGv3M4dQ47SAlBKCgH9bDEkKE2KcqWHZQQdECQZHVDDJRUBJRdoAxwEBRQBBVwwRRyo5F0FBSRRZQIHPFXM9FMOvZH+3X1ng/E6cczz7vez3Lf7/dJkiTx1nQ6HVlZWURGricxMYnY2Dj0wcFojDXyvkKpQPWeCmNj48k7CgmlkRK1Wj2NIRkufbF0KYsXLyYqKop169ZhZGQkH7K0tCQkJITi4mK0rq7Tl4xNjDExMZHPGeZqjRoTUxNUKhVSyo4dFBQUUl9/km1bt+Lk5CQfUiqVuLi4yEDLly+nrq6O8PBwZk/tqzUaNMJMzUwxNTXFysoSa2trJJ3ODd9lvkRERHCqsZHk5O2YmZvL5cbGxk5ntSp4FcGifP+AAGxtbeU1I5URCoVCztbQBsNc8vP3l7MyWGlJKZ2dnWzevAUPDw/y8/LJFD01lBMXF8+GmBi8vb2Jjo7+X/lvwc3MzJACAwPZsCEGLy8vXEV5zc0ttLf/zFd6vZzh06dPGR0dY2joMf0DA3R3dzMwMEh19VHS0tI4f/4CYaIVCsUUKX5+fqJPWoIE8KcLFwpiorlwoZWengcy2Pj4cy5dukRKSgqXL7cxMfEXf794yatX/8h7b978y4uXL0lKSpoErKmpFYTUs2nTZvbvP0B5eQWZmdnU1tbSJgDu3LlLbk4uS5YsIT+/gOEnw9y6dZtz587T86CXPycmeP36DX19/XKbJEdHR/z9A0gSusvO3s+xYzXyxePH6+USm5qaqT9RT1tbu5zh+LNxrly5yv37PaKKXvbt2ycnkpGRgVarRYoRjQ4MChIWSIBgcO/evZSVlVFdVU1XVxeFQlKHDv3I6dNn5EAtLWdFkCYKxLio6CD+fv64ubnhOMtxsuSEhARWrFiBu7u7TL8hmqGEI0eqWB8ZJURdQmFhEfHxCawX/fXxWYS9vT2enp74+vpiZ2c3zbgs9LVr18qpLvLxITU1TRZ4R8cvMlD6rnT6+wc4fPgwesG6AThRJPAWwCDod2DKScCwsDU0NjRQVVUltBaHbsF8loqnaCAhNyeH3Nwc+X1XCLLy8/KEVkuEvLTMnTsHCwtzGcx25sx3sum4eZvK6joior5BvyqU2XNc+cDWgaCVq8k+UEBoWATxScnUnTxDdU09x4VvOH2Wax2dNJ45x6HySppaWqmpa6Ci8ijSlQx3Tmy0oCpSzfVMHRdTZ1MRruTXXC9+SnPm+r4FXExzojHRhlv5n9GZt5AbWZ50lXzOYGUgI7WrGTsRyh9no4T/GulRusSzgzMZL7bjt/2mjOZZ8bzYlpEcC37PtRDeUqxZM5ZvxZA4O7RLkv3gTon+byX6dkzag+0SD4WXBvaoeFzgwMj38xkt82C4aDbDJVpGK7yFd2Ws/BNGSsW83Isn2WY82i0A9yoZnPIGe5yhnB5Lvbs1PM40pkdEvCui9KYr6dttxMPvVAxlauhKkegWmdxLFV7YvZ1K7oi1vj1qutMU8lqX2L+/y0geS1vioyk8kEFrcwPFeVncaG8lZOUKQvX+rBZep52FPmAZ85ztmT/HHo1SIuTL5SRtjEQtmLUxfx+7GSa4Otnh7GCDlF9wkMZTTdzouMnVax2UlP4gGNajnbcAJ2cXdG4ehK4Jx95hlvhUmfGR/cdsS94hfgtTGlSqMLe0YobNh1jNsOE/paZE1nl5Y8UAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/c370cac4ebfe0b74881682593e7ee256/502b1/cover.png","srcSet":"/static/c370cac4ebfe0b74881682593e7ee256/f2e6d/cover.png 114w,\n/static/c370cac4ebfe0b74881682593e7ee256/4ddba/cover.png 229w,\n/static/c370cac4ebfe0b74881682593e7ee256/502b1/cover.png 457w,\n/static/c370cac4ebfe0b74881682593e7ee256/7ddc2/cover.png 686w,\n/static/c370cac4ebfe0b74881682593e7ee256/435bf/cover.png 914w,\n/static/c370cac4ebfe0b74881682593e7ee256/6050d/cover.png 1200w","srcWebp":"/static/c370cac4ebfe0b74881682593e7ee256/15384/cover.webp","srcSetWebp":"/static/c370cac4ebfe0b74881682593e7ee256/31fce/cover.webp 114w,\n/static/c370cac4ebfe0b74881682593e7ee256/e3e25/cover.webp 229w,\n/static/c370cac4ebfe0b74881682593e7ee256/15384/cover.webp 457w,\n/static/c370cac4ebfe0b74881682593e7ee256/0258d/cover.webp 686w,\n/static/c370cac4ebfe0b74881682593e7ee256/64ea2/cover.webp 914w,\n/static/c370cac4ebfe0b74881682593e7ee256/9000d/cover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2016v16h3a153%20153%200%200129%204h1l6%201%205%202c0%202%203%200%209-6l16-13%2010-3c2%200%202%200%200-3v-3c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1%200-1h3l-3-2-1-2c2%200%201-2-2-2h-2l2-1-38-1H0v16M91%202l1%205v4h1c0-2%206-4%2011-5h2a131%20131%200%200172%2010l6%203%2023%2018c3%204%205%205%207%206a78%2078%200%200111%202l10%204c17%209%2030%2024%2034%2041l1%208h8c9%200%2010%201%2012%208l1%203%201%202c0%201%205%202%207%200l7-2a377%20377%200%200011%200l5%201%205%201-2-2c-1-1-3-2-4-1l-1-1%201-1v-1c-1-1%200-6%202-7s3-1%207%203c6%206%2012%209%2022%2012l9%202c2%200%203%204%203%209%200%204%200%205%205%208l8%207%207%208c3%203%204%204%205%208%200%202%200%203-1%202l-3-1-6-5-4-3%201%202%202%205%202%203h3l1%201h3v12l-1%208-1-1v-1l-1-3-1-6-2-5-1-4v5l1%206v1l-1%204c-1%204-3%205-3%202l-1-3-1-1-1-6c-2-5-2-7-1-12v-6l-2%202-1%203-1%204-1%201-4%203c-2%202-2%202%200%202%202-1%202-1%202%206v20c-1%202-2-1-1-3l-1-1-1-1%201-1v-2l-1-1-4-4-2-3v6l1%207%201%207c0%205%200%207-1%206-2-1-2-8-1-10v-2c-1-1-1-1-1%201h-1l-2-1v-5l-1-5%201-5%202-3c-1-1-4%201-4%204s-2%203-7-2c-4-3-4-3-4-1v5c0%204-1%204-2%203-2-2-2-2-1-3l1-3h-2c-1%201-1%201-1-1%200-1%200-2-1-1l-1-1c1-1%200-1-1-1l-2%201-2%201c-2-1-2-1-2%202l-1%203-2%203c0%202-1%204-3%204v-1l1-2-3%202c-1%201-2%203-2%209l-1%208v12c1-1%201%200%201%201l-1%201h-1l-1%207-1-10-1-1v-2l-1-2c-1%200-4-6-3-7v-4c-1-2-1-2-1%202-1%206-3%206-4%202-1-6-2-4-1%202%200%207-1%2010-3%206l-1-2c-2%201-2-6%200-8l1-2h-4l-3%201h-2c-2%202-6%200-6-2l2-2%204-2%203-2%201-1%201-1c4%200%206-1%207-2%202-2%202-2%204-1%201%201%201%201%201-1s0-2%201-1%201%201%201-1l2-2h1l2-1h3l4-2c3-1%204-3%203-5l2-1c0%201%201%201%200%200l1-1c3%201%206%200%205-1v-1c1%201%202%200%203-1s1-1%201%202l1%203%201-1v-2l1-2v2l1-1c1-2%201-2%202-1l2%201%201%201h2l1%201%201%201h1l3%201c3%200%204%200%205%202l1%203v-3c0-3%201-4%203-3%201%201%201%201%201-1%200-3-1-4-2-2-2%202-9%201-15-1-4-2-8-3-10-2-5%201-16%206-21%2010a117%20117%200%2001-21%209l-2%201-25%2013-3%202h-2l-2%201h-1c-2%200-2%200-1%201l-1%202-2-2-1%201c-1%201-1%201-2-3l-2-4-3%203c-4%204-6%205-6%204l-4%203-3%202-1%201-3%204a81%2081%200%2000-17%2024c-2%202-3%206-2%206l1%204c0%206%202%2011%204%2011%200-1%201-1%200%200l1%201c2%200%202-1-1-4l-3-4c0-2%200-2%202%201%203%204%205%205%205%201%201-2%201-2%202%200h2l-2-5-1-1c-1-2%200-2%201-1l2-1-5-1c-5%200-7-2-2-3s6-1%208-5%204-5%206-3l-1%201-3%205-2%205%203%201h3l1%201h-5c-2-1-2%200-1%204l1%201c0-2%200-2%201-1l1%203c-1%201%200%202%201%202%201%201%201%201-1%201-2-1-3%201%200%205%201%201%202%202%204%201%203-1%204%200%203%204l4%201h4l-3-2c-4-3-7-14-8-24%200-12%200-12-3-11-6%202-8%202-7%200l2-1%201-1c-1-1%203-5%205-4l2-1c1-3%204-2%203%200-1%203%201%202%202-2%203-4%203-4%202%202v8c2%203%204%204%204%202l-1-2-1-2c0-1%200-2-1-1v-3h1c0%201%201%202%202%201%203%200%205-5%205-10%200-4%205-11%205-7l-2%207c-2%205-2%208%200%2029%201%2011%202%2014%203%2012h2l3%202h3c2-3%202-2%204%200%202%203%202%203-3%203l-6-1c-3-2-4%200-2%201%202%202%2019%202%2021%201h1c1%201%201%200%201-1%200-4%202-8%203-7l1%205c0%204%200%205%201%202%200-4%202-4%203%200%200%204%201%205%201%202%200-2%201-3%202-3l1-3%201-2c1-1%201%200%201%201l1%205c1%203%201%203%203%202%204-2%205-3%206-7v-3l2%203%201%206%202%204c3%202%203%202%204-3l1-4%202%205%203%204h2l2-3%201-3%201%203c1%205%202%206%205%206%205-1%207-2%208-5l1-2%201%203c1%203%202%204%203%203l2%201-2%202c-3%200-2%201%203%202l8%201c4%200%205%200%205-2h-1l-3%201c-3%200-3%200-3-3s0-4-2-4c-2%201-4%202-2%202l1%202c0%201-1%201-2-1-3-4-3-3-1-9%201-6%203-6%204%200%201%205%202%205%205-1%203-9%205-8%206%204%200%206%202%2011%203%209l2-6%203-9%201%206v6l5-1c6-3%2024-3%2026-1%201%202%201%202%201%200V0H245C98%200%2090%200%2091%202m1%2012v11l-1%204v2l-1%202-3%2010-2%205-6%2012c-5%2011-10%2016-11%2013h-1l-2-2v-2h2l-1-1-2-2h2v-1c-1-1-1-1%201-1s2%200%201-1c-2-1-2-1-1-2l2-3c-1-1%200-2%202-2%201%200%202%200%201%201l-1%202h2l2-2%201-1-1-1h-2v-1c2%200%205-3%203-3v-2c-2%201-3-1-2-3h2v-3l1-1%202%203c1%201%201%201%201-1v-2h2l-2-1c-2-1-2-3%200-4l-1-1v-2l1-1v-5l1-1%201-1v-1c-3%200-2-2%200-2l2-1h-2l-2-2h1l2-1c-2-2-5-1-5%202l-1%203v1l-1%201-1-2-2-1%201%203v1h-2c1%201-2%203-3%203l-1%201c-1%202-5%205-6%204l-1%201c1%201-3%204-5%205-2%200-3%201-1%201s7%203%2012%207l2%202-3%204a431%20431%200%2000-7%209v-3l-1%201-2%201c-1%201-2%200-2-1h-1c-1%201-1%201-2-1-1-3-2-3-3-3-3%201-3%200-3-2v-9l-1%203-1%203v5l-2-10c0-2%200-3-1-1l-3%204-2%203c0%202-2%201-3-2l-1-2%201%202c0%202%200%203-1%202-1%200-2-1-1-2%200-2%200-2-1-1l-1-5v-2c-1%202-2%202-3%202l-1%201%201%201c1-1%201%202-1%204h-2l-1-1c-5%200-7%200-10-3s-5-3-4%200h1l1%201%202%201c1%201%200%201-2%201-3%200-4%200-4-2-1-2-1-2-2-1v4c-1%200-2%202-2%207l1%208%206-2c10-2%2031-2%2038%201l5%202h1l16%207c7%204%207%205%207%203l1-6c2%200%202%200%201-1l2-6%203-5%207%207c9%2010%2013%2013%2014%2017%201%203%203%204%203%202a289%20289%200%200150-36l15-4h19l1%201a2298%202298%200%2001-34%209l-2%201-15%208h-1l-1%201c1%201-5%204-6%203v1l-1%201h-1c1%201-3%203-4%202l-1%202c1%200%201%201%200%200l-1%202-1%202h-2l-1%201v1l-1%201c1%201-4%204-6%204-4%200-1%201%204%202%2011%201%2014%2014%204%2019l-2%202%2014%209c4%201%2013%200%2014-2l3-1h5l6-1%204-2%201-2v-1l-4-6c-5-8-7-11-9-10v-1l-2-2-1-2-3-4-5-2h-1l-2-3-5-2h-5c-4%201-2-2%202-4%205-2%2014-1%2020%202l19%2015c4%205%2020%2013%2024%2011l3%201c1%202%203%203%203%201h2v1c-2%200-2%200%200%201%204%202%205-1%201-3-3-2-3-3-1-7%200-2%200-2-2-2-1%201-2%201-2-1l11-1h9c-3%200-4-2-2-2l10-2h-6l-1-1v-2c2-2%201-4%200-4-3%200-3%200-1-2v-1h-1l-1-1v-1l-1-1c-1%200-1-1%201-1v-2l-2%201h-1l2-2v-2c1-1%200-4-1-4v2c0%202%200%202-1%201s-2-2-1-3l-1-1h-1c1-1%201-1%200%200l-2-1c0-1%200-2-1-1v-1l-1-1h-1c0-3-1-5-2-4h-1l-1-2c-1%201-3-3-2-4l-1-1h-2l-1-1c0-2-3-4-4-4-2%202-1-1%201-3l1-2h-4c-1%201-1%201%200%200l-1-1v-1l-1-2h-2v-1h-1l-1-1c1-3-1-2-2%200s-2%202-3%200l-1-2%201-1h-2l-2-1-3-2-3-2v-3l-1%202v2l-2-2c-2-2-3-2-2%201h-3c0-2%200-2-1-1s-1%201-1-1l-1-2-2-1-1-1c0%203-2%202-3-1%200-2%200-2-1%200h-8c-3%200-4-1-4-2-1-1-1-1-3%201s-2%202-3%200-2-2-2%200h-1c0-2-4-4-4-2l2%201c1%201%201%201-1%201l-2%201-1-1-2-3v1c0%202-3%202-4%200h-2l-1%202-1%201c-1%202-3%201-3-1v-1l-2%201h-2c1%201%200%202-2%202l-3-3-1-2v1c0%202-3%205-4%203-1-1-1-1-1%201l-1-2c-1-4-1-4-2-2m125%2036l4%209a74%2074%200%20018%2024l1%206v1l1%208v6c1-2%204-3%205-1l3%202h12l-3-1-5-1c0-1-1-2-2-1h-1v-2l3-1-2-1h-2l9-1c6%200%208%200%207-1v-1l1-1c-1-2%204-2%204%200h1l3-3%203-1h-3l-3-1-2-3c-2-2-2-2-1-3s1-1-1-1l-1-2-1-1v-1l-1-1c-1%200-5-7-5-10h-1c-1%201-1%200-4-2l-4-4s-2%200-3-2l-20-9M17%2070l-9%203-7%201v6c0%204%200%206%202%207l1%202%202%202c2%200%204%201%205%203%203%202%207%202%207-1l1-1v-2l1-2%201-1v-1l1-1v-2l1-2%201-1h3l3%201-4%206-4%209-2%202h-3l1%201%202%202%201%201h2c0%201%201%202%203%202%202%201%202%201%202%203-1%202-1%202%201%202l3%202%201%201%201-1v-1h2v-1l2-1h2l2-3v-1l-2%201h-1v-1l1-1%201-3c2-1%202-1%202%201v1h1l2%201%202-2h2c2%201-1%205-4%204v2l-1%201c1%201-3%205-5%205-4%200-2%204%202%204l2%202%201%201%201%201v1l1%202c-1%201%200%202%201%201v1l-1%202%202-1%202-1h1c2%200%203%202%202%205-2%204-9%203-7-1l-1-1h-1l-1-2c0%201-2%200-3-2l-2-1c-1%201-1%201-3-1l-2-1-4-3c-2-2-3-3-4-2h-2v-3l1%201h1v-2l-2-1v-1l-1-1-4-1-4-2-2%204-7%2010-5%207c0%203%201%204%206%202%203-2%203-2%203%200l2%201%201%201h-2l-1%201-1%201H7l-2%202c-5%202-5%203%200%204l3%201h4l3%201%2011%202%2014%204c5%201%206%202%205%204l1%201h2c0%201%207%200%2011-2%202-2%206-3%209-4l3-2%202-1%202-1h-3l2-2h3l1%201%201%202%201%203c0%202%202%205%205%205l3%202c2%201%202%201%202-1l-1-2-2-3h-1l-1-2v-1l-4-2c-3-3-3-4-3-9%201-5%200-11-2-16l1-2%203%207c1%206%204%209%202%204%200-3%202-4%205-1%201%201%203%202%203%200v-1l1%201c-1%201%200%202%201%203l2%201%201-2%201%204c-1%204%201%205%202%202v-1l-1-1%203-2h4l-4-1c-3-1-15-12-15-14s0-3-1-2l-1-1-1-2-2-1-1-3c2-1%203%200%204%201%200%203%203%205%204%204l-1-1-2-3-2-4-5-6c-4-7-9-12-11-11l-1-1-7-7-8-7h-3l-1-1v1c1%201%201%201-1%201s-3-1-3-2h-1l-3%201c-3%200-3%200-2-1s1-1-2-1h-7c0%201-1%202-2%201h-4l-2-1-2%201m86%2023l-1%201h-3l-1%201-1%201h-4l3%205%206%204v-2c-1%200-2-1-1-2h2c1%201%202%201%203-1l4-3c2%200%206%205%207%209l1%202v-2h2v-1c-1-1-1-2%201-3l1-4-1-3h-1l-1-1-7-1h-9M1%20104c0%2013%200%2013%207%205%204-5%203-5%205-3%202%201%202%201%202-1%200-1%200-2-2-1v-4c-2%201-8-3-8-4H4c-1%201-1%201-2-1s-1%200-1%209m202%2023c-10%203-15%2013-12%2027%200%204%202%207%202%204l1-1c1%201%206-1%206-2l1-1%201-1c-1-2%200-2%202-1h1l1-1%201%201v1l2-1h3v1h2l3%201c1%201%201%201%201-1-1-2%200-2%201-2%201%201%201%200%201-1%200-2%200-2%201%200l2%203%201%201c0%201%201%202%202%201v4c1-1%201%200%201%201%200%205%202-1%202-7%200-4%200-6%201-4%201%203%202%204%202%200-1-5-3-9-4-8v-1l-1-1-2-1-1-2h-1v-1h-1v-1l-1-1h-1l-1-1-3-1-8-2c-5%200-7-1-2-1l4-1h-7m-120%204l1%203%201%205c0%204%202%208%204%206l-1-2-1-1h1l1-1v-1h1v2c0%201%200%202%201%201%200-2%203-1%203%201h2c1-1%202%200%200%202v1h1l1-1c1%200%202%201%201%202l1%205c1%203%202%202%201-1l2-1%202%201c0%206%204%2013%205%2011l-1-6-1-5%202%203c0%201%201%202%202%201v1l1%204%201%202h2l1%202%202%201c2-1%202-1%201%201l1%202c2-1%201%201-1%203v3l2%204c0%202%200%202-7-7l-5-4-1-1c0-2%200-3-1-2l-1%202c1%201-3%202-5%200-2-1-3-1-7%201-5%202-6%202-9-1l-2-2%202%201c2%200%202%200%201-2l-4-4-5-4c-2-2-10-3-10-2l-1%201-2%201h4l1%201%204%201%204%201c2%201%202%201%200%203l-4%206c-3%204-3%204-3%202l-1-2v2l-1%203-1-1v-1l-1-3c0-4-1-2-1%202%200%206-2%205-2-1%200-5-1-6-1-2l-1%202v2c1%202%201%204-1%203v-2l-1-1v-1l-1-2h-1l1-1%201-1-1-1c-2%201-1-4%201-6s1-2-2-1l-2%204c-1%202-2%202-4%202-3%200-4%200-3-1l-1-2c-1-1-1%200-1%203l-1%201h-2l-4%201c-1%200-2%200-1-1l1-1c0-2-3%200-3%202h-2l-1-1v-1l-2-1c-2-2-2-2-4-1-1%202-1%202-2%201h-1l-5-1h-1l-1%201v-3h-1l-2-1c-2%200-2%200-2-2%200-4-2-5-2-1-1%203-1%203-2%202H7l-1-2v-3l-1%203-1%202-1-3-1-1-1%2014v13l2-1%203-1%201-1c0-1%209-2%2012-1%204%201%203%202-1%203l-4%201-1%201h-1a1075%201075%200%2001-5%202c1%201-3%204-3%203v2l-1%202H1l2%201%209%206c5%205%208%206%207%204v-3l1-4%201-1c1%201%203%200%205-2l4-2%204-1c8-5%2030-8%2034-5%202%203%200%204-4%205h-4l-10%201c-12%202-20%205-28%2013l-2%203-2%201v1c1%201%201%201-1%201s-2%200-1%201v4l1%201-1%2019%201%201c1%200%203%201%205%204%203%204%2013%2011%2015%2011%203%200%203-2-1-6-3-3-3-4-3-8l2-6%201-2c1-6%206-12%2010-11v-3c2-1%203-1%203%201h-2c1%202-3%206-5%205v1c0%202%200%202-2%201v1c1%201-1%207-2%207l-1%203c0%203%203%2011%204%2011v2c0%202%200%202%203%200%202%200%203-1%203-2h7l4-1c3-1%204-1%203-3s-1-2%201-3h3l4-1c2-1%203-8%201-9l-1-2-1-3c-2-3%201-4%203-2l3%206c1%204%201%204-1%205v2c3%201%206-2%205-5%200-1%200-2%203-2%202-1%203-2%203-4%201-2%200-3-2%200-3%203-2-3%201-8l2-4%2012-12c2-2%203-2%204-1h7c1-1%208%200%207%201l2%201c2%200%202%200%201-1-3-2%201-1%204%201s3%202%201%203c-1%201-1%201%202%201l2%201%201%201%201%201v1l1%202v2c-1%201-1%201%201%201s3-2%201-4v-2c2-2%203-1%204%204l1%204%201%202c0%201%200%202-1%201l-2%201%201%201%201%201c1%201-1%201-3%201s-4%203-2%204v1l3%201c1%200%202%202%201%203l-1%201v-1l-1-1-2-1c-1%200-2%201-2%203%200%203%200%203%201%202%200-2%201-2%201-1h2l2%201-2%201-4%202c-3%204-14%2011-12%207h-1l-2-1-3%201h-2v-1l-1-1h-3l-3-1v-5c0-3%200-3-1-1-2%203-5%203-4%201%200-2%200-2-2%200-3%203-10%206-11%205l-1%201-1%202-2%201-2%201-3%202c-1%201-1%201-2-1-1-1-1-1-2%202l-2%202h-1l-2%202-2%201-2%201c-2%200-4%201-3%203%200%202-1%204-2%202h-1l-7%204-2%201c-2%202-4%203-4%201l-1-3v2c0%202%200%203-2%204l-3%201c-4%202-5%201-6-3%200-3%200-4-1-3-2%201-1%202%200%203v6l-1-1c-1-1-1-1%200%200l-1%202-3%202c-3%203-8%204-10%202-1-1-1-1-1%201v2h-1l-5%203-5%203h4l6-1h4l3%201%202-1h2v-4l1-1h1l1-1v2h3v-2l1-1%201%202c1%202%201%202%202%201h2l2%201c2%200%203%201%201%203l2-1h3v1c-1%201%205%201%2014%201%2014%200%2018-1%2014-3l-2-2h-1l-1-1%201-1h-1v-1l-1-1-1%201-1%201v-1l-1-2-1%201-4-1c-4-2-5-3-4-5%200-2%200-2-1-1-2%201-3%201-3-1l1-1%203-1c1-2%202-2%202-1l1%201c1-2%2024%209%2030%2015l4%204h11c11-1%2014-2%2027-8%209-4%2020-16%2018-18l1-1%203-5%203-5%201-1-1-1-1-2c0-1%200-2-2-1v1l-2%201v1c1%201%201%201-1%201-3-1-5%200-3%202s1%208-1%208l-2-5h-1l-1-1-1-2c-2-1-3-10-1-13%203-6%206-3%206%206%200%202%200%203%201%202h1c2%203%202%200-1-8-4-12-4-17-1-21%202-3%203-5%201-4-1%201-2-1-1-2h1l1%201%201-1v-1c1%201%203%200%204-1l8-4%205-2-5%201h-13l6-3a140%20140%200%20008-1l1-1%201-2%201-3c0-3%200-3-1-1-2%205-8%208-10%204h-1c0%202-2%203-4%201h-1l-3%201h-4l-6%201c-7%200-7-1-8-11%200-4-1-4-3-1-1%202-1%202%200%200l1-7h1c1%202%206%200%206-3h-1c-1%202-4%203-4%201l1-1%201-2v-2l-2%202-3%202%201-2c4-3%204-3%200-7l-5-6-4-5-2-4v-3l2%202c3%203%203%202%201-3l-2-3c0%201-1%201-1-1-2-1-2-1-2%202l-1%204-1-3-1-2c-1%201-5-4-5-5h-1l-1-2v-2l-1%201h-3l-7-1c-3%201-3%201-5-4s-3-5-3-2m-27%201v1h-1v1l-2%201%201%201h1l2%202h3l2%201c1-1%201%200%201%202l1%201h3l2-2c2%200%203%200%202-2%200-2-1-2-3-2h-2l-2-2-1-1-5-3-2%202m70%206v2l-1%201c-1-1-1%200-1%203%201%205%202%206%204%207l3%201%202-1c-1-1%200-1%202-1%201%200%202%200%201%201l1%201c2-1%201-2-1-3-2%200-3-1-1-2h1v-1c0-4%202-4%203%200%201%202%201%202%202%201l-1-3-1-4-3-3h-2c2%203%202%206%200%206-3%200-6-3-5-5%200-2-1-3-3%200m165%203l-13%2021c-1%205-3%207-3%204%200-1-1-2-2-1l-2-2-1%201-1%202-2%203h-1c0-3-1-2-1%200l-2%203c-2%202-1%204%201%202l3-1v1c-3%202%201%201%204-1l4-3h1l4-1c3-2%203-2%201-3-1-1-1-1%201-5l1-4%201-1%202-2c0-3%205-8%205-7l1-3%201-3%202-2-4%202m-127%208l-2%205-1-1v-2l-1%202-1%201-1%201-1%203c-1%203-1%203%201%203v2h2l1%201v2h1c2%200%202%200%201%201v4l1%201%202%205%203%206v2l-2%203%201%202h2v7l-2%201%201%201%202%201%2011%201%2016-1h2l-2%202c-2%202-4%202-14%202-13%200-20%201-21%202l-3%201-2%201-3%203-3%203-1%202c-4%202-5%2011-3%2015%201%201%201%201%201-1s8-15%2010-15h2l4-4%207-5c11-1%2015-1%2021%201l6%202%201-2%202-2v2c2%204%206%202%209-4l2-4-6-1c-12-1-17-2-17-3l-1-1c-2%203-15-10-19-18-5-10-8-24-5-26v-3c-1-2-1-2-1%202m18-3c-1%202%200%2012%201%2013l1%202c-1%201%201%205%202%204l1%201c-2%201%201%204%203%203h1l-1%201v1c1%201%202%202%203%201l1%202%201%201%201%201%203%201h1c-1%201-1%201%202%201h6l1-1%201%201h2c3-1%200-3-5-3l-5-2-3-1-3-1-1-1-1-1-3-3-3-3-2-3v-1l2-1h-2c-2%200-3-2-3-10l-1-2m-8%2012l2%206c0%208%201%209%202%206%202-1%202-1%202%201%200%201%200%202-1%201l-1%201v2l-1%201%204%201c2-1%203%200%203%201h2l1%202c1-1%202%200%202%201%201%201%201%202%202%201l2%201%202%201h1l1%201c2%200%201-3-3-5l-6-4-4-2-1-1c0-1%200-3-2-5l-2-5c-1-4-3-7-4-7l-1%202m-98%2010c-1%203%200%205%202%204l1%201%202%203%201%203%201%201c1%200%201%206-1%207v1c2%200%203%202%201%202v2l2%202%201%201v4c1%201%201%201%201-1s0-2%203-1c1%201%202%201%202-1l1-1c1%201%207-1%209-3h4l2-1%201%201c-1%201%204%204%207%204%203-1%204-3%201-4l-3-3h-1l-1-1%201-3%202%201%201%202%202%202%201%202h3l1%201v-2c-2-3-2-5-1-7v-2l-2-2h-3v-2h-2l-1-1v-2l-2-2-2-2-1-1-2%201c-2%202-2%202-3%201%200-2-2%200-1%203%200%202%200%202-2%202l-3%201c-2%202-4%201-4-1%201-2-2-4-3-4h-3v-1l-1-1h-1l-3-1c-2%200-2%200-1-1v-2h-4l-2%201m160-1l-1%202c0%202-8%209-11%2011l-8%202-5%201h-6c-5-1-6%200-6%201%200%202%200%202%202%201h3c4%202%2015%200%2015-2h1c1%201%201%201%202-1h1c0%201%203%202%206%201%202%200%202-1%201-1-1-1-1-1%201-2l1-2%202-4%202-4%201-2%201-1h-2M61%20177c-2%201-1%202%201%202%207%200%2011%208%207%2012-1%201-1%201%201%201%203-1%204-3%204-7%200-5%202-2%202%204%200%203%200%203%202%202v-6c-1-1%200-1%201-1%202%200%202%200%200-2l-3-1-1-1v-3h-3v2l-5-1c-4-2-5-2-6-1m181%206l-1%203h-1c-2%200-6%204-6%208%201%202%200%204-1%205l-2%202h2l2-2%202-1%203-2%201-1-2-1c-3%200-2-1%201-3l2-3h2c3%202%204-2%202-6-2-3-1-3-4%201m85-1l-1%201%201%201h1l-1%201c-2%200-3%203-1%205v6l3%206c2%200%203-3%203-8l1-4%201-1c1-1%201-1-1-1h-1c1-2-3-7-5-6m-98%2010l-6%203c-3%201-4%202-5%206-3%2011-11%2014-23%2010-8-3-8-3-3%202l5%205v14c1%200%206-8%206-10h1c0%201%201%201%202-1v3l-1%204-1%202h-1c-1-1-1%200-2%203l-1%205c-1-1-3%202-2%202l-2%202h-3c-1%202-1%200-1-3%200-1-1-1-2%201h-2l1-2%201-4%202-6c5-9-7-21-18-18-8%202-15%2010-14%2015v2l-2-2c0-2%200-2-3%201-1%201-3%203-2%204l-1%203c-1%202%200%203%206%201%203-1%206-6%204-8l3-6h1l1-2%201-3%203-2c2-2%206-2%209%200l4%202c3%202%208%2011%206%2013l-1%204c0%203-1%204-6%2010l-7%207h-2c-1-1-1-1-1%201v2c-1-1-1%200-1%201l-1%201c-1-2-5-2-5-1l-2%204c-2%202-2%203-1%205h1v-2c2%200%201%204-1%207l-2%203-1%202-2%201c-1%201-1%200-1-1l-1-2v2l-1%201c-1-1-1%200-1%203l-3%203-1%201-1%201h-1l-1%201h-1l-1%201c-1-1-1%200-1%201l-1%201h-1%2012l-1-1v-1l1-1v1h1l1%201v2l1-1h4l1-1v-1c1%201%202-5%200-7v-1l1-2c-1-4%203-5%204-2l1%201%201-2v2c-3%204-2%204%201%202l3-2%205%201c11%202%2017%205%2017%209%200%202%200%202-1%201-1-2-1-2-1%200%200%204%202%204%203%201s3-4%205-2l-1%201v2h13c3%202%207%201%209-1%201-1%202-2%201-3h1l1-1-2-2-2%201c2%202%200%204-2%203-2%200-3%201-2%202h-2l-2-3c0-1-5-7-5-5l-1-1c-1-2-2-2-2-1s-1%201-1-1l-2-1-2%202v-3c3-2%202-2-1-1l-3-1-2-2h-2v-1l-1-1h-1l-1-3h-4l-1-1-1-1-1-2c-1-1-2-3-1-4h3c0-2%203-3%205%200h6v-1l-2-5c-1-4%202-4%204-1l2%201c2%200%201-2-1-3l-1-1%201-1c-1-1%200-1%200%200l2-1%201-2c2%200%204-5%203-5v-1c3%200%205%200%203-1l-1-1%202-1%202-1%202-3%202-6%201-4v-1h1c1%201%201%200%201-2-1-3-1-3%201-3l2-1h2l1-1c0-2%204-5%204-4l3-1v-2c-2%200%200-8%202-10h-3M1%20204c0%203%201%206%204%2010%204%209%206%2017%201%2012H4l-1-1-1-1-1%2017v15l4%204c4%203%205%204%205%201h1l2%201v-1c0-2%200-2%202-2l3-1h-2l-1-1-1-1-2-2v-1l-2-4v-8l1-4a307%20307%200%20012-28c0-2-1-3-2-3v-1c1-1%201-1-1-1l-2-1-3-1-2-1-1-1-1%204M0%20366c0%203%200%205%201%204l2-2v2c3%200%204%200%204%202l2%201%202%201%202%201%201%201c-1%201%204%203%206%202l1%201c0%208%201%2012%204%2010%202%200%203%203%204%208l2%203c1%200%201-1-1-7l-2-6%205-2%204-3c-1-3-31-22-35-22-2%200-2%201-2%206m38-5l-1%202-1%201c1%201%200%202-1%204-3%202-3%204%200%204h1v1c2-1%204%202%204%204l-2%201-1%202%203%201%202-1-1-1v-4l-1-4h-1l2-1%201-1%202-3h3l2-1-1-1-1-1-1-1-1%202-1%201c-2%200-2-2-1-3%203-1%201-2-2-2s-4%200-3%201m26%201l1%203%201%202h-1c-2-2-3-1-3%201%200%201%200%202%202%201l1%202-1%203-1%201-1%204%201%204a124%20124%200%200017-18c2-2%203-5%201-5l-1%201h-1l-7-1c-7%200-8%200-8%202m48-1l-2%202c0%203%200%203-1%202h-2v1l3%201h-3l-2%201-1%201c-1%201-1%201%201%201l2%201-1%202h-1c2%201%201%202-1%201-1%200-2%200-1%201%202%200%203%202%201%202v2l-1%201v1l-1%201h-1v2l-1%202-1%201v2l-1%201h-1l-2%205v1l-1%201-1%201v1c-1%201%200%201%201%201l5-2%207-4%207-5c2-2%203-3%204-2l-1-1%201-1h2l1-1v-1l1%202h2l1%201-9%2011-4%203h9c8%200%209%200%2010-2l2-2h2c1-1%201-1%201%201-1%203-1%203%202%203l4-1c2-2%204-2%202%200-1%201-1%201%203%201%203%200%205-1%205-2%200-2%200-2%201-1v2l11%201c12%200%2013%200%2014-2l3-3%201-3c0-3%200-3%202-3l1-1c0-2%200-3%202-3v2c0%202%200%202%201%201h2c2%200%202%200%200%202l-1%203v1c-1%201-1%201%201%201%201%200%202%200%201-2l1-2%201%201%201%202c3%201%201%204-1%203l-2%201-1%201h-1l2%201%202-1v-1l1%201c0%202%2019%201%2020-1h4c0%202%201%202%2017%202h17l3-3c1-2%203-3%203-2l1-1%202-3%209-11%204-6%202-3h1c1%201%201%201%202-1l1-2v-1l1-1c2%201%202%201%201-1%200-2%200-2%201-1h2l-1-1-1-1h2l1-1h-19a351%20351%200%2000-63%201l-2%202h-2l-2-3c1-1-3-1-16-1-12%200-16%201-17%202h-1l-1%201h-1l-2%201-1%201-1%201c0%202-5%203-6%202s-1-1-1%201h-7c0%202-2%201-2-1h-2l-1-2v-1l-1-2-1%202-1%202v-1l-1-4c-2-2-2-2-3%200l-2%203%202-1c2-2%202-2%202%203l-1%204h-5l2-1v-2l-2-2a1414%201414%200%2000-2-5c0-1-1-1-2%201-2%201-2%201-1-1l-2%201-2%201v-1l-1-1h-5m179%208l-5%208-1%201c1%201-2%204-4%204v1l-1%201v1l-2%201c-2%200-2%200-1%201s1%201-1%201v2l-1%201-1%201-2%202v1l-2%201h-1c1%201%201%201-1%202-1%202%203%202%2065%202h67v-6a679%20679%200%20010-25v-9H295l-4%209M2%20381v11l1-1c1-1%201-1%201%201-1%202%201%204%203%203v1c0%202%202%201%208-2%209-4%209-4%206-4-5%200-6%200-5-2l-1-1-2%202-1%201h-2c-1%201-1%200-1-1l-1-3v2c0%201%200%202-2%202s-2-1-2-4v-3l-1-2H2'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/c370cac4ebfe0b74881682593e7ee256/6050d/cover.png"}}},{"id":"9462c0d5-d35a-5b1d-b248-1d7c0c42b923","slug":"/domain-driven-design-in-typescript","secret":false,"title":"Domain-Driven Design in TypeScript","author":"Luke Celitan","date":"September 8th, 2025","dateForSEO":"2025-09-08T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive deep-dive into Domain-Driven Design (DDD) with TypeScript, covering theory, practical implementation, advanced patterns, and real-world scenarios.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Domain-Driven Design in TypeScript\",\n  \"excerpt\": \"A comprehensive deep-dive into Domain-Driven Design (DDD) with TypeScript, covering theory, practical implementation, advanced patterns, and real-world scenarios.\",\n  \"date\": \"2025-09-08T00:00:00.000Z\",\n  \"hero\": \"ddd.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"the-definitive-guide-to-domain-driven-design-in-typescript-patterns-examples-and-best-practices\"\n  }, \"The Definitive Guide to Domain-Driven Design in TypeScript: Patterns, Examples, and Best Practices\"), mdx(\"h2\", {\n    \"id\": \"1-introduction\"\n  }, \"1. Introduction\"), mdx(\"p\", null, \"Domain-Driven Design (DDD) is more than a set of patterns\\u2014it\\u2019s a philosophy and a collaborative approach to building complex software. In TypeScript, DDD can help you create robust, maintainable, and expressive systems that truly reflect your business\\u2019s core logic. In this guide, I\\u2019ll take you on a deep technical journey through DDD, showing not just the theory, but how to implement it in TypeScript, with real-world scenarios, advanced patterns, and practical advice from the trenches.\"), mdx(\"h2\", {\n    \"id\": \"2-what-is-domain-driven-design\"\n  }, \"2. What is Domain-Driven Design?\"), mdx(\"p\", null, \"At its heart, DDD is about focusing on the domain\\u2014the sphere of knowledge and activity around which your business revolves. DDD is a way of thinking, a set of priorities, and a collection of patterns and practices that help teams tackle complexity by modeling software after the real-world problems it\\u2019s meant to solve.\"), mdx(\"p\", null, \"Key tenets of DDD include:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Knowledge Crunching:\"), \" Iteratively refining the domain model in close collaboration with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Ubiquitous Language:\"), \" Building a shared language that permeates code, tests, and conversations.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Model-Driven Design:\"), \" Ensuring the code and the domain model evolve together, avoiding the analysis/design divide.\")), mdx(\"p\", null, \"DDD is not just for large enterprises. Even in smaller TypeScript projects, the principles of DDD can help you avoid anemic models, clarify intent, and build systems that are easier to change and reason about.\"), mdx(\"h2\", {\n    \"id\": \"3-the-building-blocks-of-ddd\"\n  }, \"3. The Building Blocks of DDD\"), mdx(\"p\", null, \"Let\\u2019s start with the core building blocks. Each of these is both a conceptual tool and a practical pattern you\\u2019ll use in your TypeScript code.\"), mdx(\"h3\", {\n    \"id\": \"entities\"\n  }, \"Entities\"), mdx(\"p\", null, \"Entities are objects with a distinct identity that persists over time. Their identity matters more than their attributes.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Customer {\\n  constructor(\\n    public readonly id: string,\\n    public name: string,\\n    public email: string\\n  ) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use immutable IDs (UUIDs, database-generated, etc.).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Equality is based on identity, not attributes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Entities can change state, but their identity remains constant.\")), mdx(\"h3\", {\n    \"id\": \"value-objects\"\n  }, \"Value Objects\"), mdx(\"p\", null, \"Value Objects are defined only by their attributes. They are immutable and interchangeable if their values are equal.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Address {\\n  constructor(\\n    public readonly street: string,\\n    public readonly city: string,\\n    public readonly zip: string\\n  ) {}\\n\\n  equals(other: Address): boolean {\\n    return (\\n      this.street === other.street &&\\n      this.city === other.city &&\\n      this.zip === other.zip\\n    );\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make value objects immutable.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Implement equality checks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use value objects to encapsulate concepts like Money, DateRange, or EmailAddress.\")), mdx(\"h3\", {\n    \"id\": \"aggregates\"\n  }, \"Aggregates\"), mdx(\"p\", null, \"Aggregates are clusters of associated objects (entities and value objects) treated as a unit for data changes. Each aggregate has a root entity (the Aggregate Root) that enforces invariants and controls access.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Order {\\n  private items: OrderItem[] = [];\\n\\n  constructor(public readonly id: string, public customer: Customer) {}\\n\\n  addItem(item: OrderItem) {\\n    this.items.push(item);\\n  }\\n\\n  get total(): number {\\n    return this.items.reduce((sum, item) => sum + item.price, 0);\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Only allow external access through the aggregate root.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enforce invariants at the aggregate level.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep aggregates small and focused.\")), mdx(\"h3\", {\n    \"id\": \"repositories\"\n  }, \"Repositories\"), mdx(\"p\", null, \"Repositories abstract away the details of data storage and retrieval for aggregates.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface OrderRepository {\\n  findById(id: string): Promise<Order | null>;\\n  save(order: Order): Promise<void>;\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Repositories work with aggregates, not entities or value objects directly.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep repository interfaces simple and intention-revealing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use dependency injection for testability.\")), mdx(\"h3\", {\n    \"id\": \"services\"\n  }, \"Services\"), mdx(\"p\", null, \"Services encapsulate domain operations that don\\u2019t naturally fit on an entity or value object.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class PaymentService {\\n  processPayment(order: Order, paymentDetails: PaymentDetails): PaymentResult {\\n    // ...\\n  }\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use domain services for operations involving multiple aggregates or domain concepts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep services stateless when possible.\")), mdx(\"h3\", {\n    \"id\": \"modules\"\n  }, \"Modules\"), mdx(\"p\", null, \"Modules group related concepts to reduce cognitive load and clarify boundaries. In TypeScript, use folders, namespaces, or ES modules.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"4-modeling-the-domain-in-typescript\"\n  }, \"4. Modeling the Domain in TypeScript\"), mdx(\"p\", null, \"TypeScript\\u2019s type system is a powerful ally for DDD. You can use interfaces, classes, and type guards to model the domain, enforce invariants, and prevent invalid states.\"), mdx(\"h3\", {\n    \"id\": \"example-shipping-domain\"\n  }, \"Example: Shipping Domain\"), mdx(\"p\", null, \"Let\\u2019s model a simplified shipping domain: Cargo, Voyage, Booking, and Location.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Value Object\\nclass Location {\\n  constructor(\\n    public readonly code: string, // e.g., 'NYC', 'LON'\\n    public readonly name: string\\n  ) {}\\n}\\n\\n// Entity\\nclass Cargo {\\n  private bookings: Booking[] = [];\\n\\n  constructor(\\n    public readonly id: string,\\n    public origin: Location,\\n    public destination: Location\\n  ) {}\\n\\n  book(voyage: Voyage) {\\n    this.bookings.push(new Booking(this, voyage));\\n  }\\n}\\n\\n// Entity\\nclass Voyage {\\n  constructor(\\n    public readonly id: string,\\n    public readonly schedule: VoyageSchedule\\n  ) {}\\n}\\n\\n// Value Object\\nclass VoyageSchedule {\\n  constructor(\\n    public readonly departure: Location,\\n    public readonly arrival: Location,\\n    public readonly departureDate: Date,\\n    public readonly arrivalDate: Date\\n  ) {}\\n}\\n\\n// Aggregate Root\\nclass Booking {\\n  constructor(\\n    public readonly cargo: Cargo,\\n    public readonly voyage: Voyage\\n  ) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"TypeScript Patterns for DDD:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"readonly\"), \" for immutability.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use interfaces for contracts (e.g., repositories, services).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use type guards to enforce invariants at runtime.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"5-ubiquitous-language-and-knowledge-crunching\"\n  }, \"5. Ubiquitous Language and Knowledge Crunching\"), mdx(\"p\", null, \"A Ubiquitous Language is a shared vocabulary that connects code, tests, and conversations. It\\u2019s the backbone of DDD. In TypeScript, this means naming classes, methods, and variables after domain concepts, and refactoring relentlessly to keep the language consistent.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// Instead of ambiguous names:\\nconst x = new Booking(y, z);\\n\\n// Use domain terms:\\nconst booking = new Booking(cargo, voyage);\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Knowledge Crunching:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Work closely with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use code, diagrams, and conversations to refine the model.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Expect the model to evolve as you learn more.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"6-layered-architecture-in-typescript\"\n  }, \"6. Layered Architecture in TypeScript\"), mdx(\"p\", null, \"A layered architecture separates concerns and keeps the domain model isolated from infrastructure and UI. A typical structure:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"UI Layer:\"), \" Handles user interaction.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Application Layer:\"), \" Orchestrates use cases, coordinates aggregates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Domain Layer:\"), \" Contains entities, value objects, aggregates, services.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Infrastructure Layer:\"), \" Handles persistence, messaging, external APIs.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example Folder Structure:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"src/\\n  domain/\\n    entities/\\n    value-objects/\\n    services/\\n    repositories/\\n  application/\\n    use-cases/\\n  infrastructure/\\n    orm/\\n    api/\\n  ui/\\n    web/\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Dependency Rule:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Domain layer depends on nothing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Application depends on domain.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Infrastructure depends on domain and application.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UI depends on application.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"7-aggregates-factories-and-repositories-advanced-implementation\"\n  }, \"7. Aggregates, Factories, and Repositories: Advanced Implementation\"), mdx(\"h3\", {\n    \"id\": \"aggregates-1\"\n  }, \"Aggregates\"), mdx(\"p\", null, \"Aggregates enforce invariants and transactional consistency. In TypeScript, you can use private fields and methods to encapsulate rules.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class BankAccount {\\n  private balance: number;\\n  private transactions: Transaction[] = [];\\n\\n  constructor(public readonly id: string, initialBalance: number) {\\n    this.balance = initialBalance;\\n  }\\n\\n  deposit(amount: number) {\\n    if (amount <= 0) throw new Error('Amount must be positive');\\n    this.balance += amount;\\n    this.transactions.push(new Transaction('deposit', amount));\\n  }\\n\\n  withdraw(amount: number) {\\n    if (amount <= 0) throw new Error('Amount must be positive');\\n    if (amount > this.balance) throw new Error('Insufficient funds');\\n    this.balance -= amount;\\n    this.transactions.push(new Transaction('withdraw', amount));\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"factories\"\n  }, \"Factories\"), mdx(\"p\", null, \"Factories encapsulate complex creation logic, especially for aggregates.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class BankAccountFactory {\\n  static openAccount(id: string, initialBalance: number): BankAccount {\\n    if (initialBalance < 0) throw new Error('Initial balance must be non-negative');\\n    return new BankAccount(id, initialBalance);\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"repositories-1\"\n  }, \"Repositories\"), mdx(\"p\", null, \"Repositories abstract persistence. In TypeScript, use interfaces and dependency injection.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface BankAccountRepository {\\n  findById(id: string): Promise<BankAccount | null>;\\n  save(account: BankAccount): Promise<void>;\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"8-strategic-design\"\n  }, \"8. Strategic Design\"), mdx(\"p\", null, \"Strategic design is about managing complexity at scale. It\\u2019s where DDD really shines in large systems.\"), mdx(\"h3\", {\n    \"id\": \"bounded-contexts\"\n  }, \"Bounded Contexts\"), mdx(\"p\", null, \"A Bounded Context is an explicit boundary within which a particular domain model applies. Different teams or subsystems may have different models for the same concept.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"In a shipping company, the term \\u201CCustomer\\u201D might mean a paying client in the booking context, but a recipient in the delivery context.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Best Practices:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make context boundaries explicit in code and documentation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate contexts via translation layers, APIs, or events.\")), mdx(\"h3\", {\n    \"id\": \"context-maps\"\n  }, \"Context Maps\"), mdx(\"p\", null, \"A Context Map documents the relationships between bounded contexts: shared kernel, customer/supplier, conformist, anticorruption layer, etc.\"), mdx(\"h3\", {\n    \"id\": \"shared-kernel\"\n  }, \"Shared Kernel\"), mdx(\"p\", null, \"A shared subset of the model/codebase used by multiple contexts. Requires close collaboration.\"), mdx(\"h3\", {\n    \"id\": \"anticorruption-layer\"\n  }, \"Anticorruption Layer\"), mdx(\"p\", null, \"A translation layer that protects your model from external or legacy models.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"TypeScript Example:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// External API model\\ntype ExternalOrder = { order_id: string; total: number };\\n\\n// Internal model\\nclass Order {\\n  constructor(public readonly id: string, public readonly total: number) {}\\n}\\n\\n// Anticorruption Layer\\nfunction mapExternalOrder(external: ExternalOrder): Order {\\n  return new Order(external.order_id, external.total);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"open-host-service--published-language\"\n  }, \"Open Host Service & Published Language\"), mdx(\"p\", null, \"Expose your model via a stable API or protocol, using a well-documented language (e.g., OpenAPI, GraphQL schema, or industry XML standard).\"), mdx(\"h3\", {\n    \"id\": \"distillation\"\n  }, \"Distillation\"), mdx(\"p\", null, \"Focus on the core domain, separate generic subdomains, and keep the model as simple as possible.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"9-supple-design-making-models-easy-to-use-and-change\"\n  }, \"9. Supple Design: Making Models Easy to Use and Change\"), mdx(\"p\", null, \"Supple design is about making your models expressive, intention-revealing, and easy to evolve.\"), mdx(\"h3\", {\n    \"id\": \"intention-revealing-interfaces\"\n  }, \"Intention-Revealing Interfaces\"), mdx(\"p\", null, \"Name methods and classes after domain concepts, not technical details.\"), mdx(\"h3\", {\n    \"id\": \"side-effect-free-functions\"\n  }, \"Side-Effect-Free Functions\"), mdx(\"p\", null, \"Prefer pure functions for calculations and queries.\"), mdx(\"h3\", {\n    \"id\": \"assertions-and-invariants\"\n  }, \"Assertions and Invariants\"), mdx(\"p\", null, \"Use TypeScript\\u2019s type system and runtime checks to enforce invariants.\"), mdx(\"h3\", {\n    \"id\": \"specification-pattern\"\n  }, \"Specification Pattern\"), mdx(\"p\", null, \"Encapsulate business rules as reusable, composable objects.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface Specification<T> {\\n  isSatisfiedBy(candidate: T): boolean;\\n}\\n\\nclass OverdraftAllowed implements Specification<BankAccount> {\\n  isSatisfiedBy(account: BankAccount): boolean {\\n    return account.balance >= 0;\\n  }\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"10-refactoring-toward-deeper-insight\"\n  }, \"10. Refactoring Toward Deeper Insight\"), mdx(\"p\", null, \"DDD is an iterative process. As you learn more, refactor your model to reflect deeper understanding.\"), mdx(\"h3\", {\n    \"id\": \"example-evolving-a-naive-model\"\n  }, \"Example: Evolving a Naive Model\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Before:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Invoice {\\n  constructor(public amount: number, public paid: boolean) {}\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"After:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Invoice {\\n  private payments: Payment[] = [];\\n  constructor(public readonly id: string, public readonly total: number) {}\\n\\n  addPayment(payment: Payment) {\\n    this.payments.push(payment);\\n  }\\n\\n  get paid(): boolean {\\n    return this.payments.reduce((sum, p) => sum + p.amount, 0) >= this.total;\\n  }\\n}\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"11-testing-and-evolving-your-domain-model\"\n  }, \"11. Testing and Evolving Your Domain Model\"), mdx(\"p\", null, \"Testing is essential for evolving your domain model safely.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example with Jest:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"test('BankAccount deposit increases balance', () => {\\n  const account = new BankAccount('id', 100);\\n  account.deposit(50);\\n  expect(account.balance).toBe(150);\\n});\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test aggregates, value objects, and business rules.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use mocks for repositories and services.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"12-real-world-case-study-from-naive-model-to-deep-model\"\n  }, \"12. Real-World Case Study: From Naive Model to Deep Model\"), mdx(\"p\", null, \"Let\\u2019s walk through a shipping scenario, from a naive model to a deep, expressive domain model.\"), mdx(\"h3\", {\n    \"id\": \"step-1-naive-model\"\n  }, \"Step 1: Naive Model\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Shipment {\\n  constructor(\\n    public id: string,\\n    public origin: string,\\n    public destination: string,\\n    public status: string\\n  ) {}\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-2-introducing-value-objects-and-entities\"\n  }, \"Step 2: Introducing Value Objects and Entities\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Location {\\n  constructor(public readonly code: string, public readonly name: string) {}\\n}\\n\\nclass Shipment {\\n  private status: ShipmentStatus;\\n  constructor(\\n    public readonly id: string,\\n    public readonly origin: Location,\\n    public readonly destination: Location\\n  ) {\\n    this.status = ShipmentStatus.Pending;\\n  }\\n\\n  markInTransit() {\\n    if (this.status !== ShipmentStatus.Pending) throw new Error('Invalid state');\\n    this.status = ShipmentStatus.InTransit;\\n  }\\n}\\n\\nenum ShipmentStatus {\\n  Pending,\\n  InTransit,\\n  Delivered,\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-3-aggregates-and-invariants\"\n  }, \"Step 3: Aggregates and Invariants\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"class Shipment {\\n  private events: ShipmentEvent[] = [];\\n  // ...\\n  addEvent(event: ShipmentEvent) {\\n    // Enforce business rules here\\n    this.events.push(event);\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"step-4-bounded-contexts-and-integration\"\n  }, \"Step 4: Bounded Contexts and Integration\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Booking, Tracking, and Billing contexts each have their own models for Shipment.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate via APIs or events, using anticorruption layers.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"13-best-practices-and-common-pitfalls\"\n  }, \"13. Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"best-practices\"\n  }, \"Best Practices\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Collaborate closely with domain experts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Build and maintain a ubiquitous language.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep aggregates small and focused.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use value objects liberally.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Isolate the domain model from infrastructure.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test business rules thoroughly.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Refactor toward deeper insight.\")), mdx(\"h3\", {\n    \"id\": \"common-pitfalls\"\n  }, \"Common Pitfalls\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Anemic domain models (entities with only getters/setters).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Overly large aggregates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Leaking infrastructure concerns into the domain.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ignoring bounded contexts and integration challenges.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Failing to evolve the model as understanding grows.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"14-conclusion-and-further-resources\"\n  }, \"14. Conclusion and Further Resources\"), mdx(\"p\", null, \"Domain-Driven Design is a journey, not a destination. In TypeScript, DDD can help you build systems that are robust, expressive, and a joy to work with. By focusing on the domain, collaborating with experts, and relentlessly refining your model, you can tackle even the most complex business problems.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Eric Evans, \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Domain-Driven Design: Tackling Complexity in the Heart of Software\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vaughn Vernon, \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Implementing Domain-Driven Design\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Patterns of Enterprise Application Architecture (Martin Fowler)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Domain-Driven Design Community: \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://dddcommunity.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://dddcommunity.org/\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Awesome DDD: \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/heynickc/awesome-ddd\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/heynickc/awesome-ddd\"))), mdx(\"hr\", null), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"This guide is intended as a living reference. As the TypeScript ecosystem and DDD practices evolve, so too should your models and your approach. Happy modeling!\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/a1946/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/5b37e/ddd.png 236w,\n/static/6720283e0e150a9ffbed2b2e549d8728/49058/ddd.png 472w,\n/static/6720283e0e150a9ffbed2b2e549d8728/a1946/ddd.png 944w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/99fbb/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/77392/ddd.webp 236w,\n/static/6720283e0e150a9ffbed2b2e549d8728/1f177/ddd.webp 472w,\n/static/6720283e0e150a9ffbed2b2e549d8728/99fbb/ddd.webp 944w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/3ddd4/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/078a8/ddd.png 163w,\n/static/6720283e0e150a9ffbed2b2e549d8728/e56da/ddd.png 327w,\n/static/6720283e0e150a9ffbed2b2e549d8728/3ddd4/ddd.png 653w,\n/static/6720283e0e150a9ffbed2b2e549d8728/c5cc7/ddd.png 980w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/0acdf/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/ac59e/ddd.webp 163w,\n/static/6720283e0e150a9ffbed2b2e549d8728/7660b/ddd.webp 327w,\n/static/6720283e0e150a9ffbed2b2e549d8728/0acdf/ddd.webp 653w,\n/static/6720283e0e150a9ffbed2b2e549d8728/75470/ddd.webp 980w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAFEklEQVQ4y02UeUwVVxTGhx00YkVZRCgosqnsIBQVZHnwAJ9oWR+LYBAsPkVaC2ixFAppC2hj49I/mhBwSVT+qGLUttHGpC5FoFgsoKylRcAFUHBrrP31zhiNk5zMzL1zvvN953x3JGtraxbYLSArawNhYWG86+BASEgIOp0Of39/tmzZwtd797Jv3z7KyspYsWIFanUMERERLFq0iN2lu8nJ2URIaCgazVokV1cXMtLTqa2pISgoCEtLS4KDgykvr8DDw4PZs2fj5OSE8+LF2NjYYGRsRF5eHqEhocTFxVFZWUVycgp+ovjy5cuRNBoNZbt3i6pqlixZguPChXh5eSpg1gLAx8cHXz8/AgICWLpsGTbz5yvM7O3tycjIRBWpIj8/XyjR4enpiRQtgDIzMlCpVAQKhlZWVpiZmREYGKQkbN68mZSUFKKiooS0HNLS0li5ciVW1laYmJoqLBMSEyn7tIyar6qRqior+bCwkFWrVjHHwkIwsCExMYmioiLiYuMUuXPmvIO5ublSTGYvg+bm5uIk2rBYhE63VchOpri4BKmhvp7q6mrs37VnxowZJCUlKUzmC2mSJL0JAwMD9PT1lWdTM1OFQEFBAfJQfX19CQ8PVwYmHdi/n9LSUkHfBD/RK7nBM2fOVBINDQ0VIANDA4yNjTEyMnoTevp6ilytNhVjE2OcnZ0VN0glJSUkCYmzZs1S+uXm5qaAyX2UAeVkmbkMqG+gr6zJDCU9CYu5FlRVVQl3vIedvZ1iMUn2nAwg097x0Q709PReydR7JVMGfA1mYmKi2EYOuaD8XXZ2Njt37lIYy8UkuWfyhnyvra3F29sbV1dXxY/yIGR2yodv9fPtkK22Z0+tYiM7OzukdfHxoroBmZmZDA8P8+TJUyYmJrn/4AF9ff00N1+n6cwZDh48RHlFhTKw16dEZuzg6EBdXR3OLi7Y2toiabVa0VQT5eh1dNzk0aMpxsbuMjU1zcuX//Hixb88f/4Pr69nz57zSOzdu3efzs4uTp9u4sTxE4qH5wlVooehih22bSugra2dvt5+2lp/47pgdv16K+3tN7h9q4fenj6mp58wPj7J6OhdwX6AkZExHj9+KgBPivO/Wki2Fz1MXs/cuebExKo4d+40DfXf8e2hbzh6pI4LF84rcfz4EcG+jZHRv7h06SfOnj3FxYs/0NJyjdbWa+z6pEjYxlH8WIR3M+LOEx14lDCfOvKSL5MQfgp10FFSo8+QHvsjBRtaKdV18/GmDorzOslaewGt+hwb1/1MYXYbW9Ob0axqJNDlACr/w+Ise3WzPf0OOWv/Jid+gKzYP8mOHeKDhCHxPkimuldED5vW9ZG7vk9Z00YMsCbgNiud/iDUpZPIpT2ovQaI8uhDWhPQyba0fvKTeinMHBSJvehS+0lX3SbOvwvN8m5i/boEQBfvr7jF+uBbxPp2EuPbRbSXuPt0E+XZicrjphJSqPsVksM72KgRCSFtJK3uQKu6gSawjTD3FiKWtRDt3Y7a53fx3Mpq91+VNTmivNoIX9pMpEeL2G8n0rNVDCUhCzMTS9RRyTg6eGJn605wUAxZmTqKdnxGSfHnlJfVUFG+R3nPzdlOWmoukeHxuLn4YTnPkTRtLpq4VK78cgOpqel7vviyisqqchoa6jjZeJzBwX4ejN9ncnJCeO4hQ0ODwnM3Gbs7ysOHE0xMjnNnZJirVy/T2HiCw4frOXbsMNOPp/gfjo9PExhws5AAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/6720283e0e150a9ffbed2b2e549d8728/502b1/ddd.png","srcSet":"/static/6720283e0e150a9ffbed2b2e549d8728/f2e6d/ddd.png 114w,\n/static/6720283e0e150a9ffbed2b2e549d8728/4ddba/ddd.png 229w,\n/static/6720283e0e150a9ffbed2b2e549d8728/502b1/ddd.png 457w,\n/static/6720283e0e150a9ffbed2b2e549d8728/7ddc2/ddd.png 686w,\n/static/6720283e0e150a9ffbed2b2e549d8728/435bf/ddd.png 914w,\n/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png 1200w","srcWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/15384/ddd.webp","srcSetWebp":"/static/6720283e0e150a9ffbed2b2e549d8728/31fce/ddd.webp 114w,\n/static/6720283e0e150a9ffbed2b2e549d8728/e3e25/ddd.webp 229w,\n/static/6720283e0e150a9ffbed2b2e549d8728/15384/ddd.webp 457w,\n/static/6720283e0e150a9ffbed2b2e549d8728/0258d/ddd.webp 686w,\n/static/6720283e0e150a9ffbed2b2e549d8728/64ea2/ddd.webp 914w,\n/static/6720283e0e150a9ffbed2b2e549d8728/9000d/ddd.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2021c0%2012%200%2021%201%2020l2-1-1%202c-2%203-3%205-1%204v4l-1%203c0%203%204%208%204%206l2-1c1%201%200%204-4%205-2%201-3%205-1%207l1-1h2c-1-1%200-2%201-2%202-1%202-1%201%202l-2%202-1%201H2c-2-1-3%200-1%202v1c-2%200-1%208%202%2011l3%201%201-3%201%201v1l1-1h3c2-1%200-3-2-3v-1h2c2%201%201-2-2-4l-3-3%202-2%207-2v3l1%202c2-1%201%201-1%202v3c1%201%202%201%203-1%202-1%203%200%201%202v6c0%201%200%202-1%201l1%203c3%204%205%205%204%203v-4l-1-3-1-1c-1%201-1%201%200%200%200-3%203-1%205%203l3%203%203%201c2%202%202%202%203%201%201-2%201-2%203%200l3%201%202%202c2%203%202%206-2%208-2%200-3%202-3%203l-1%202-1-1h-1v-1l-1-1-3-1c-2-2-2-2-3%200l1%202%201%202v5l1%202c0%201%200%202%202%203l1%203-18-17C3%2092%200%2090%200%2092l1%204v1c-2-1-1%201%201%202h1c-1-2%201-3%204%200a316%20316%200%200126%2028h-2l-1-1h-2c-1-2-5-2-5-1%200%200%201%202%203%202l3%201%201-1v8l2%201%202%201c2%201%203%201%203-1h1l1-1v-1c2%200%202%202%200%203-1%201-2%202-1%204s1%202-2%202l-1%202c-1%202-6%2011-8%2011l-1%201-1%201c-2%201-2%201-1-1%201-3%201-4-1-2l-2%202v-3l-1%201c1-1-1-3-4-5-3-3-5-4-5-3H8l-1-2-2-1-1-1v-3H2l-1%201-1%204%201%205%201-4v-3l2%202%201%205%202%204%201%201%201%201h1v1h1v1l-1%202c-2%201-1%202%202%202h1v-5%201l1%201%202%202c0%205-7%204-12-2-3-4-4-2-4%208%200%209%200%209%202%202%200-7%202-5%202%203%200%204%200%205-2%205l-2%201c0%202%201%203%206%205%208%204%209%204%2010%209%201%203-1%208-4%208l1-2%202-3-2-1-3-1H8c0%202-1%202-4%200-3-1-3-1-3%201l-1%2010v8h8c1-1%201-1-1-1s-2%200-1-2c1-5%204-4%204%203%200%204%200%204-1%203H7l3%203c5%204%203%204-3%203-7-3-7-3-7%203%201%206%201%207%208%207%202%200%202%200%201-1l-1-1c2%200%203-2%201-3l-2%201c0%201-1%202-3%202s-2%200-2-3c1-3%204-3%2010-2h2v-2c1%201%202%203%202%208%200%209%200%209-7%207l-3-1h2c3-1%203-4%200-4H4c-4-1-4%202-3%2013%200%202%202%201%202%200l1-2%201-1%201-2c2%200%202%201%202%204%200%205-2%207-3%205%200-3-5-2-5%201l2%202%202%201h3l1%201c0%201%201%202%202%201l1%201c0%202-4%202-5%200l-3-1c-2%200-3%200-2%201v1c-2%201%200%203%203%203s4%200%203%202l1%202%201%202c0%201-1%202-3%201H4l2%201c2%201%202%201-2%201l-4-1v6l1%206h10l-2-1-3-1%207-1c9%201%2014%203%2013%205h-5l-5-2c-3%200-3%200-2%201%204%201%202%201-3%201s-5%200-4%201c1%202%201%202%202%201h4l9%201c5%201%205%201-6%201s-12%200-12-2l-3-2a578%20578%200%20002%2086h1l1%201h1v2h2c-1%203%200%205%201%203%201-1%201-1%201%201v4h2l2%201-1%201c-2-2-1%201%202%205l4%203%203%201c4%202%209%201%208-2l1-1h1c0-1%201-1%202%201s2%202%2011%201l12-1c4%201%204-1%200-6l-16-21%203-1%205%201%204%204%203%205%201%201%201%201-1%202-1%202%202-1h2l1%201v2c-2%201%200%203%202%203h2v1l-1%201%202%201c1-1%202%200%202%201%201%203%201%203%204%202s3-1%202%201v3c0%202%200%202%203%201l2-2v-1h2v-1c-1-1%200-2%202-1v-2h8l5-1h5l7-2%205-1%2015-2c2%200%202%200%201-1h5l7-1a998%20998%200%2001115-2v-1l1%201%203%201c3%200%203%200-1%201s3%201%2022%203h7a137%20137%200%200023%204l4%201%205%201h1l2%201%203%201v-1l-2-2h1l6%202h4l-3-2c-4-4-3-4%202-1%203%202%203%202%204%201l2-2c2%200%209-10%2012-16l1-1%202-2c-1-2%200-2%204%200l-1-2-2-2h5l5%201-5%209-10%2014c-1%202-1%202%204%202%203%200%205%201%207%203%203%202%206%203%205%201-1-1%200-1%201-1v-1l1-1%202-1h-1c-2%200-2-1-1-3l1-1%201-1h4c3%200%204%200%204-2%200-5%201-9%203-11l2-3%201-1v-1l2-1h2l8-1h1c2-1%202-1%202%203a829%20829%200%20000-81c0%203-2%204-3%202h-1l-2%201c-1%200-1-1%201-3l2-4%201-3%201%201v2c1-1%202-14%202-62%200-66%200-66-3-65-1%200-1-1%201-2%201-1%202-2%202-5%200-2%200-3-1-1%200%203-8%208-10%207-1-1-2-1-4%201-3%202-5%203-3%201v-2l-2%201h-2l1-3c2-1%202-1%200-3-1-3-3-4-2-2v3l-2-2%201-2%201-1-1-1h-1v-1l-6-1%201-1c1%201%203%200%204-3%203-3%206-4%206-2l-1%201-1%201c1%202%202%202%205%200%202-1%202-2%201-2l1-3c4-4%203-5-1-1-3%202-3%202-4%201-1-2%206-8%208-7l2%201c3%200%204%201%201%201-1%200-2%200-1%201h4c0-1%201-2%203-2l4-2h-5c-4%201-5%201-2-2v-2l-1%201-2%201%202-3c3-3%205-3%203-1-1%202%200%202%202%201v-2l1-2c1%201%201%200%201-3l-1-8c0-4%200-4-2-3h-5l-2-2v-1l-2-2c-1-3%200-3%206-9s6-7%206-11l-1-4h-1l-2-2v-2l2%201c1%202%202%201%202-3l-2-5c-2-1-2-2-1-2l2%201%201-14c0-11%200-15-1-14l-2%202h-1c-2%202-5-2-5-6-1-2%202-6%203-5l1-1v-1l1-1-1-1c-1%200-2-3-1-4h3l1%201-1%203v2c1%200%202%201%202%205l1-10V0h-17l-3%204-3%204-4%204c-2%203-5%204-3%202l-1-1-1-1c-1-2%200-4%201-3l1-1c-1-1%200-3%201-5l2-3h-5c-4%200-6%200-7%202v3h1l-1%202-1-1h-1l-1%201-2%207h-2v-1h-2v-2l-2-1h-4l-2-3-2-1-1%201V5l-1-1-4-1-6-3h-2l3%203a413%20413%200%200010%2011v4h1v-2h1l3%201c2%202%202%203-2%209-2%203-2%204-1%204v3h-2l-1-1c-1%201-5-4-4-6%200-2%200-2-1-1%200%202-3%201-3%200v-2l2-3c3-4%204-10%200-11-1-1-2%200-3%203-1%202-2%203-3%202l-1%201%201%203c2%200%202%201%201%202-1%202-2%202-3%200l-1-2-1-1c-1%201-2%200-3-1s-1-1%202-1c2%200%202%200%201-1l-2-4-1-2-1%203c-2%203-3%204-2%201V9l2-1c1%200%203-4%202-5l1-2c1-1-2-1-14-1h-15l1%203c0%202%200%202-2%201-1-2-2-2-2-1-1%201-1%201-2-1%200-2%200-2-20-2-15%200-19%200-18%201v2c0%201-3-1-2-2l-2-1v2c1%201%200%201-5%201l-7%201h-2l-2-1V2l1-2-3%202-2%203V2c1-3-1-2-2%201l-3%202a325%20325%200%2000-44-2h-1c-1%202-3%200-2-2l-1-1-1%202-12%201-12-1c1-2-1-2-14-2h-15l1%203c1%202%201%204-1%202l-1-2c1-1-3-3-4-2l1%201v1l1%201h-1l-2%201v1l-1-2-2-2%201-1c1-1-6-1-15-1L81%201h-1L68%200H58l1%202c1%202%202%203%203%202h1c1%201%200%201-1%201l-1%201%201%201%201%201v4l-1-1c-3-3-3-2%201%205%203%207%204%2010%202%209l-1%202c1%201%200%202-1%203-2%202-3%200-3-4l-1-5c-2-2-2-3-1-6v-3l-1-1-2-3c-2-1-2-1-3%201-1%203-2%204-4%204s-2%201-1%203c1%201%200%202-1%203-2%201-2%202-1%202v1c-1%202-3%201-5-2v-5l1-1c-1-1-1-1%200%200l1-1c-1-1-1-1%200%200l1-1v-1c1%201%206-3%208-5l1-1h2c1-2%202-2%203%201%203%204%204%203%202-2-2-4-4-5-6-3h-1c1-1-2-1-12-1-8%200-13%200-12%201l-1%201c-1%200-2%200-1-1L13%200H0v21M186%207l3%201%205%201c1%201%200%201-3%201h-6l-1-2c-1-2-2-2-7-2l-6%201h-2c-2%200-1%207%200%208%202%201%2068%200%2070-1l1-4%201-4h-17c-2-1-3%200-3%201h-1c0-3-34-3-34%200m-59%201l-2%201c-1%202%200%206%201%206l1%201%201%201c2%201%203%201%202-1%200-2%200-3%203-2%204%200%207-3%206-5%200-2-8-3-12-1m-7%207l2%205c1%207%201%207-1%207l-1-2c1-2-2-4-4-4v2l1%202v3l2%201v1c-2%200-1%202%201%202l1%201v1l1-1%201%201%203%203h3l-3%202-2%203h2l5-3c3-2%203-3%202-3l-2-2c0-3-2-3-2%200-1%203-1%203-4-9-3-8-5-13-5-10m22%202l-1%201c-3-1-9%201-8%203%200%202%200%202-1%201v7l3%205h3c4-1%205%200%202%202l-1%202c1%202%207-3%207-6l-4-16v1M33%2022l-3%206-2%201c-3-1-3%200-2%202h2c0-2%201-1%203%202%202%205%204%209%202%208s-1%200%201%203c1%201%201%201%201-1-1-2-1-2%203%202l4%204%202-2c2-2%202-2%201-3l-1-2%203%202c4%205%202%201-3-7-4-7-9-12-8-7%201%201%201%201-1%201l-3-1-1-1%201-1c1%201%204-3%204-5s2-1%204%202c2%205%208%2014%209%2014L37%2020c-2-2-2-2-4%202m282-1c0%202%200%202-1%201l-1-1v2l1%201c-1%202%200%205%201%204l1%203%204%204c4%203%204%203%206%201l2-7c-2-2%201-1%202%201%202%202%202%202%201%203-1%200-2%201-2%203l-3%203c-2%203%204%2010%207%207h2l1-1v-1c1%202%202%201%202-2v-1h1v-3c1-1%201-2-4-6a47%2047%200%2000-12-10l-7-4-1%203M51%2021l-4%203-1%201h-1c-1%201%200%203%201%205%202%205%204%204%208-1%203-3%204-6%202-5h-1v-2c2%200%201-3%200-3l-4%202m307%205c-4%207-4%208-3%208l1%202h-1c-2-2-2-2-7%206a3775%203775%200%2001-21%2037l3%202h2l1%201c1%201%201%201%204-2s4-5%203-6l1-2v-3c0-2%200-2%201-1%200%201%201%201%202-1l1-3%201-2%201-2-1-1c1-3%200-3-2-1-1%202-3%202-2-1h1v-2h2c0-1%201-1%202%201l3%203c-2%205%205-5%208-11%200-2%201-3%202-3l1-2h1l1-1c-1-1-1-1%200%200l1-1v-1c1%201%201%201%200%200l1-2%202%201%202%201%201-1v-2h-4l1-2c1-1-2-2-4-2v-2l-1-1v-1l-1-1h-1l3-1%202-1-1-1c-1%200-2-1-1-2%200-4-1-4-5%203m-53%2012v4l-2%203-1%203c0%201%200%202%201%201h1l3-2v1c0%202%202%205%203%204l1%201v1l3-4c1-3%202-4%203-3l2-1c2-2%201-4-2-3l-4-3-4-3h-3l-1-1v2M16%2041v1h-1l-3%205%203%205c2%202%203%205%202%206h1l3%202c6%207%208%209%2010%207l1-2%201-1c1%201%201%200%201-1v-4c1-3%200-5-1-5h-1l1-1-1-1v-1h-1c-1%202-4-2-2-4l-1-1-4-1h-1v-2h-2c-2-2-5-3-5-2m352%2015c-5%208-6%208-4%208%202-1%202%200%200%202-1%202-1%202%203%207a149%20149%200%200018%2016c0%202%203%200%208-4l4-6v-1l1-2c0-2-1-3-2-3v-1l-1-1h-1c0-1%200-2-1-1l-1-1h-1l-1-1-1-2-2-1c1-1-5-8-9-10-2-2-3-2-5%200l-2%201%202-2v-3l-5%205m-172%204c-24%201-42%207-65%2019-15%207-44%2033-41%2035v1h-1l-1%201c-1-1-1-1%200%200l-1%201v1h-1c-1-1-1-1-2%201v3h-1v1h-2v2l-1%201-3%203c-3%204-4%206-2%205v2h-1c0-3-2-1-8%2011-12%2023-18%2061-15%2089v9s2%204%202%209l7%2020%205%2012h4c4%200%204-1%202-5v-1c1-1%202%201%203%202%202%204%207%206%206%202l1-2%201%203%203%201h3l-2-4-2-4c2%201%207%201%206-1l1-1%201-2h1v1l1%201%202-2c1-2%200-2-4-2l-4-1c1-1-3-3-8-4l-2-2c0-1%203-1%206%201l3%201%204%201h2l2%201h-2c-2%200-2%200-1%201l10%201%202-1%201%201c0%202%204%204%207%203%202%200%202%200%200-2l-2-1-1-1%201-2%208%201-1%201h-2%204c6%200%206%200%204-1v-1l2-1%201-1c2%201%202%204%200%204v2l1%202-2-1h-2l1%201h-2c-4%200-8%201-7%202l3%201c2%200%202%200%201%201s0%202%206%203l3%201-3-2c-3-4-1-4%203-1%203%203%209%205%208%203-2-3%209-2%2011%201%201%202%204%203%206%201%201-1%201-1-2-2-4-2-4-3%201-3a515%20515%200%200019%201l3%203-1%201-9-1c-4-2-7-3-8-1-1%201-1%201%201%202%202%200%202%200%201%201a618%20618%200%200092-2c-4-2-4-3%200-3l6%203c3%203%205%204%204%202s7-2%2010%200h19v-1h5l-1%201%2017%201%2018-1h1c0%203%206%201%207-2l3-7v-2l1-2%201-1%201-1%201-3v-2l1-1v-2l1-3v-3l2-2c2-1%201%206-5%2020l-5%2012h4c3%200%204%200%207-8a146%20146%200%200011-77c-1-18-15-60-20-59l-1-2-3-7c-4-7-9-13-9-11v2l-2-2c0-2-3-4-4-3l2%203c2%203%202%205-1%203v2c1%201%202%200%204-1%202-2%203-2%203%200l-1%201c-1%200-1%201%201%203a125%20125%200%200117%2036c1-1%202%202%203%208l1%206c3%204%203%209%203%2015l1%203v19c1%206%201%207-1%207-4-1-7%202-5%208l1-1%201-3%201-2c1%200%202%201%202%203l-1%202-1%202v1c-1-1-2%200-2%201l-2%201-1-6c0-7%202-10%204-9%201%201%201%200%201-3l1-5-1-5v-4l-1-6-1-5-1-3v-4l-2-5-1-5-1-4c0-6-15-32-25-44-3-4-4-5-3-6h3c2%202%201-1-2-3-1-2-2-2-2-1%201%201-2%202-4%201h-1v-1h-1l-1-1c1-1-15-16-17-15l-1-2-3-1v-1l-1-1h-1l-1-1c-1%201-6-2-5-3l-1-1h-2l-1-1v-1c-2%201-14-5-13-6h-2l-2-1v-1h-1l-1%201v-1l-1-2v1h-5v-2h-6c-3%200-3%200-1-1s2-1-1-1h-5v-1l-3-1h-3l-2-1h-5l-5%201h-3l7%201c8%201%2031%207%2038%2010%2030%2013%2069%2051%2071%2070v4l-2-5c-2-2-3-5-2-6h-1c-1%201-1%201-1-1v-1l-2-1h1l1-1-2-1-4-4c-4-6-6-8-5-5v2l4%2010c7%2011%2012%2021%2015%2032%205%2015%208%2048%205%2048l-2-1h-1l-15-2a2484%202484%200%2000-250-29%20184%20184%200%200117-49l-5%209-5%207-2%203-3%203c0-3%206-16%2011-24%204-6%206-11%203-9l-1%201v3h-2v2c0%202%200%202-1%201s-3%200-2%202v3c-1%202-1%202-2%201-2-3-9%2012-7%2015%200%202%200%202-1%201l-1%201a73%2073%200%2001-7%2023l-1%202c-2%204-3%2031-1%2031l2-4c1-2%201-2%201%201l-1%204-1%201%201%201%201%204%202%205v3c-5-2-5%203-1%2018a213%20213%200%20015%2017v2l1%203%202%202-3-1a97%2097%200%2001-11-39v-3c-3%205-4-27-1-45%204-18%2013-41%2022-55%208-12%2012-16%2014-15%202%200%202%200%202-2-1-2%200-4%207-10%207-7%2010-8%208-6l1%201%201-2c0-1%207-9%209-9%203-1%205-2%204-3h1l1-1h1v-1h1c2%200%202%200%201-1v-1h3l1-1h1v-1h1c2%200%202%200%201-1v-1h1l1-1%201%201v-1l2-1h1c-1-1%200-1%200%200l2-1h1l3-1%203-1c2%200%2010-3%209-4v-1l10-2c17-5%2035-6%2050-4a369%20369%200%200025%205%20142%20142%200%200160%2036c9%209%2013%2012%2012%209-1-1%202-1%203%201h2c0-2-21-22-23-21v-1c1-1-3-4-4-3l-1-1-1-1-1-1h-2v-2h-2l-1-1v-1h-1l-1-2v1l-1%201-1-2v-2h-4c-2%200-2%200-1-1%202-1%200-2-2-1-2%200-5-1-3-2a166%20166%200%2000-78-16M39%2067l-1%201-2%201h-2l-3%201c-2%201-2%201%201%204l4%203c2%200%202%200%201%201l-4%201c-1-1-2%201%200%201%201%201%2015-3%2015-4%200-2-9-11-9-9m143%207l1%201-3%201h-7v2h-2l-4%201-3%201-1%201-1-1-8%201c-7%203-10%205-7%205v1c-2%201-3%201-2-1h-1c-2%200-2%201-1%202v1c-1%200-2%200-1-1%201-3-15%206-21%2011l-4%203-1%201v1l-3%201-2%203c2%201-4%205-6%204l-1%201h1l-2%203c-4%205-4%206%201%202%2021-20%2050-35%2078-40%2012-3%2012-3%207-3l-6-1h-1m169%2017l-2%203%203%204c2%203%204%205%203%206h2l1%202c2%201%205-2%204-5l1-1h1l2%201c1%200%201-1-2-3l-3-2c-1%202-2%200-2-2l2-1c2%202%201-1-2-3h-4c-1-1-2%200-4%201M0%20120l2%203v3l-2%206c0%203%200%204%201%203h3v-1c-2-1-2-2-1-4%201-1%202-2%201-3v-1l2%202%204%203c2%201%203%201%202%202s-1%201%201%202h1l2-1c6%202%206%202%202-1l-5-4c0-2-4-5-5-5l-4-2c-3-3-4-4-4-2m183%20141l-1%201c-1-1-2%200-2%201l1%201%203%201h-3l-2%201%206-1h3v2c-1%201-1%201%201%201v1c-1%201-1%201%202%201l3-1h2c4%200%208-3%204-4l-2-1h-5c-3-1-3-1-1-1%204%200%203-1%200-2l-3%201h-3c-2-2-3-2-3-1M20%20312l1%207h4c12-1%2012-15%200-15h-5v8m91%200v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m77%200v7h5c6%200%208-2%208-7s-3-8-8-8h-5v8m-150-3c-4%204-1%2011%203%2011%203%200%206-4%206-6%200-6-6-9-9-5m198%200c-2%202-2%207-1%209l5%201c2-1%202%200%202%201l-4%201c-3%200-4%202%200%203%205%201%206-2%206-9v-7l-4-1-4%202M42%20333c-1%202%201%2014%202%2015l1-2c0-3%200-3%202-2%205%201%208-8%204-11-2-2-8-2-9%200m67-1l1%2016%201-3c0-3%200-3%201-2%204%204%2010-4%207-10-2-1-8-2-10-1m42%2029a177%20177%200%2000107%200c3-2-27%203-34%206-2%200-2%200-2-2s1-2%206-3a800%20800%200%2001-19%201l10%201%201%202c1%201-4%201-13%201-11%200-14-1-15-2h-2c-1%201-21-2-22-4l-9-1-8%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/6720283e0e150a9ffbed2b2e549d8728/6050d/ddd.png"}}}]}},"staticQueryHashes":["1609575157","2068910035","2361467917","2361467917","3838421970","500183989","5650841"]}