{"componentChunkName":"component---src-templates-platform-tsx","path":"/platforms/python/guides/sanic/troubleshooting/","result":{"data":{"file":{"id":"ff050074-8f3f-59d4-b268-d1ba0cc9e579","relativePath":"python/common/troubleshooting.mdx","sourceInstanceName":"platforms","childMarkdownRemark":null,"childMdx":{"body":"function _extends() { _extends = Object.assign || 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); }\n\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; }\n\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\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Troubleshooting\",\n  \"sidebar_order\": 950,\n  \"redirect_from\": [\"/platforms/python/contextvars/\"]\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar CodeTabs = makeShortcode(\"CodeTabs\");\nvar CodeBlock = makeShortcode(\"CodeBlock\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We expect most users of the Python SDK not to run into any of the problems\\ndocumented here.\"), mdx(\"p\", null, \"Use the information in this page to help answer these questions:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\\"What do I do if scope data is leaking between requests?\\\"\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\\"What do I do if my transaction has nested spans when they should be parallel?\\\"\")), mdx(\"p\", null, \"The short answer to those: check if your \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" work and you clone the\\nhub where needed.\"), mdx(\"h2\", {\n    \"id\": \"addressing-concurrency-issues\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#addressing-concurrency-issues\",\n    \"aria-label\": \"addressing concurrency issues permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Addressing Concurrency Issues\"), mdx(\"p\", null, \"Python supports several distinct solutions to concurrency, including threads and\\ncoroutines.\"), mdx(\"p\", null, \"The Python SDK does its best to figure out how contextual data such as tags set\\nwith \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry_sdk.set_tags\"), \" is supposed to flow along your control flow. In most\\ncases it works perfectly, but in a few situations some special care must be\\ntaken. This is specially true when working with a code base doing concurrency\\noutside of the provided framework integrations.\"), mdx(\"p\", null, \"The general recommendation is to have one hub per \\\"concurrency unit\\\"\\n(thread/coroutine/etc). The SDK ensures every thread has an independent hub. If\\nyou do concurrency with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"asyncio\"), \" coroutines, clone the current hub for use\\nwithin a block that runs concurrent code:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"python\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"python\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-python\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-python\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"with\"), \" Hub\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"Hub\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \".\"), \"current\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \":\"), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token comment\"\n  }), \"# in this block Hub.current refers to a new clone\"), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token comment\"\n  }), \"# of the original hub, with the same client and\"), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token comment\"\n  }), \"# the same initial scope data.\"))))))), mdx(\"p\", null, \"Issues with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"asyncio\"), \" have then an easy workaround: every \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"asyncio\"), \" coroutine\\nthat really does run concurrently with other coroutines needs to be made into a\\ntask, then the hub needs to be cloned and reassigned.\"), mdx(\"p\", null, \"See the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"../integrations/default-integrations/#threading\"\n  }), \"Threading\"), \" section\\nfor a more complete example that involves cloning the current hub.\"), mdx(\"h2\", {\n    \"id\": \"context-variables-vs-thread-locals\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#context-variables-vs-thread-locals\",\n    \"aria-label\": \"context variables vs thread locals permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Context Variables vs Thread Locals\"), mdx(\"p\", null, \"The Python SDK uses \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://docs.python.org/3/library/threading.html#thread-local-data\"\n  }), \"thread\\nlocals\"), \" to\\nkeep contextual data where it belongs. There are a few situations where this\\napproach fails.\"), mdx(\"p\", null, \"Read along if you cannot figure out why contextual data is leaking across HTTP\\nrequests, or data is missing or popping up at the wrong place and time.\"), mdx(\"h3\", {\n    \"id\": \"python-2-thread-locals-and-gevent\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#python-2-thread-locals-and-gevent\",\n    \"aria-label\": \"python 2 thread locals and gevent permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Python 2: Thread Locals and gevent\"), mdx(\"p\", null, \"If the SDK is installed on Python 2, there is not much else to use than the\\naforementioned thread locals, so the SDK will use just that.\"), mdx(\"p\", null, \"Code that uses async libraries such as \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"twisted\"), \" is not supported\"), \" in the\\nsense that you will experience context data leaking across tasks/any logical\\nboundaries, at least out of the box.\"), mdx(\"p\", null, \"Code that uses more \\\"magical\\\" async libraries such as \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"gevent\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"eventlet\"), \"\\nwill work just fine\"), \" provided those libraries are configured to monkeypatch\\nthe stdlib. If you are only using those libraries in the context of running\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gunicorn\"), \" that is the case, for example.\"), mdx(\"h3\", {\n    \"id\": \"python-3-context-variables-or-thread-locals\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#python-3-context-variables-or-thread-locals\",\n    \"aria-label\": \"python 3 context variables or thread locals permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Python 3: Context Variables or Thread Locals\"), mdx(\"p\", null, \"Python 3 introduced \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"asyncio\"), \", which, just like Twisted, had the problem of not\\nhaving any concept of attaching contextual data to your control flow. That\\nmeans in Python 3.6 and lower, the SDK is not able to prevent leaks of\\ncontextual data.\"), mdx(\"p\", null, \"Python 3.7 rectified this problem with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" stdlib module which is\\nbasically thread locals that also work in asyncio-based code. The SDK will\\nattempt to use that module instead of thread locals if available.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"For Python 3.6 and older, install \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"aiocontextvars\"), \" from PyPI\"), \" which is a\\nfully-functional backport of \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \". The SDK will check for this package\\nand use it instead of thread locals.\"), mdx(\"h2\", {\n    \"id\": \"context-variables-vs-geventeventlet\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#context-variables-vs-geventeventlet\",\n    \"aria-label\": \"context variables vs geventeventlet permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Context Variables vs gevent/eventlet\"), mdx(\"p\", null, \"If you are using \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gevent\"), \" (older than 20.5) or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"eventlet\"), \" in your application and\\nhave configured it to monkeypatch the stdlib, the SDK will abstain from using\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" even if it is available.\"), mdx(\"p\", null, \"The reason for that is that both of those libraries will monkeypatch the\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"threading\"), \" module only, and not the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" module.\"), mdx(\"p\", null, \"The real-world usecase where this actually comes up is if you're using Django\\n3.0 within a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gunicorn+gevent\"), \" worker on Python 3.7. In such a scenario the\\nmonkeypatched \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"threading\"), \" module will honor the control flow of a gunicorn\\nworker while the unpatched \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" will not.\"), mdx(\"p\", null, \"It gets more complicated if you're using Django Channels in the same app, but a\\nseparate server process, as this is a legitimate usage of \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"asyncio\"), \" for which\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"contextvars\"), \" behaves more correctly. Make sure that your channels websocket\\nserver does not import or use gevent at all (and much less call\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gevent.monkey.patch_all\"), \"), and you should be good.\"), mdx(\"p\", null, \"Even then there are still edge cases where this behavior is flat-out broken,\\nsuch as mixing asyncio code with gevent/eventlet-based code. In that case there\\nis no right, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"static\"), \" answer as to which context library to use. Even then\\ngevent's aggressive monkeypatching is likely to interfere in a way that cannot\\nbe fixed from within the SDK.\"), mdx(\"p\", null, \"This \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/gevent/gevent/issues/1407\"\n  }), \"issue has been fixed with gevent\\n20.5\"), \" but continues to be one for\\neventlet.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#addressing-concurrency-issues","title":"Addressing Concurrency Issues"},{"url":"#context-variables-vs-thread-locals","title":"Context Variables vs Thread Locals","items":[{"url":"#python-2-thread-locals-and-gevent","title":"Python 2: Thread Locals and gevent"},{"url":"#python-3-context-variables-or-thread-locals","title":"Python 3: Context Variables or Thread Locals"}]},{"url":"#context-variables-vs-geventeventlet","title":"Context Variables vs gevent/eventlet"}]},"internal":{"type":"Mdx"}}}},"pageContext":{"excerpt":"We expect most users of the Python SDK not to run into any of the problems\ndocumented here. Use the information in this page to help answer these questions: \"What do I do if scope data is leaking between requests?\" \"What do I do if my transaction has nested spans when they should be parallel?\" The short answer to those: check if your  contextvars  work and you clone the\nhub where needed. Addressing Concurrency Issues Python supports several distinct solutions to concurrency, including threads and\ncoroutines. The Python SDK does its best to figure out how contextual data such as tags set\nwith  sentry_sdk.set_tags  is supposed to flow along your control flow. In most\ncases it works perfectly, but in a few situations some special care must be\ntaken. This is specially true when working with a code base doing concurrency\noutside of the provided framework integrations. The general recommendation is to have one hub per \"concurrency unit\"\n(thread/coroutine/etc). The SDK ensures every thread has an independent hub. If\nyou do concurrency with  asyncio  coroutines, clone the current hub for use\nwithin a block that runs concurrent code: Issues with  asyncio  have then an easy workaround: every  asyncio  coroutine\nthat really does run concurrently with other coroutines needs to be made into a\ntask, then the hub needs to be cloned and reassigned. See the  Threading  section\nfor a more complete example that involves cloning the current hub. Context Variables vs Thread Locals The Python SDK uses  thread\nlocals  to\nkeep contextual data where it belongs. There are a few situations where this\napproach fails. Read along if you cannot figure out why contextual data is leaking across HTTP\nrequests, or data is missing or popping up at the wrong place and time. Python 2: Thread Locals and gevent If the SDK is installed on Python 2, there is not much else to use than the\naforementioned thread locals, so the SDK will use just that. Code that uses async libraries such as  twisted  is not supported  in the\nsense that you will experience context data leaking across tasks/any logical\nboundaries, at least out of the box. Code that uses more \"magical\" async libraries such as  gevent  or  eventlet \nwill work just fine  provided those libraries are configured to monkeypatch\nthe stdlib. If you are only using those libraries in the context of running\n gunicorn  that is the case, for example. Python 3: Context Variables or Thread Locals Python 3 introduced  asyncio , which, just like Twisted, had the problem of not\nhaving any concept of attaching contextual data to your control flow. That\nmeans in Python 3.6 and lower, the SDK is not able to prevent leaks of\ncontextual data. Python 3.7 rectified this problem with the  contextvars  stdlib module which is\nbasically thread locals that also work in asyncio-based code. The SDK will\nattempt to use that module instead of thread locals if available. For Python 3.6 and older, install  aiocontextvars  from PyPI  which is a\nfully-functional backport of  contextvars . The SDK will check for this package\nand use it instead of thread locals. Context Variables vs gevent/eventlet If you are using  gevent  (older than 20.5) or  eventlet  in your application and\nhave configured it to monkeypatch the stdlib, the SDK will abstain from using\n contextvars  even if it is available. The reason for that is that both of those libraries will monkeypatch the\n threading  module only, and not the  contextvars  module. The real-world usecase where this actually comes up is if you're using Django\n3.0 within a  gunicorn+gevent  worker on Python 3.7. In such a scenario the\nmonkeypatched  threading  module will honor the control flow of a gunicorn\nworker while the unpatched  contextvars  will not. It gets more complicated if you're using Django Channels in the same app, but a\nseparate server process, as this is a legitimate usage of  asyncio  for which\n contextvars  behaves more correctly. Make sure that your channels websocket\nserver does not import or use gevent at all (and much less call\n gevent.monkey.patch_all ), and you should be good. Even then there are still edge cases where this behavior is flat-out broken,\nsuch as mixing asyncio code with gevent/eventlet-based code. In that case there\nis no right,  static  answer as to which context library to use. Even then\ngevent's aggressive monkeypatching is likely to interfere in a way that cannot\nbe fixed from within the SDK. This  issue has been fixed with gevent\n20.5  but continues to be one for\neventlet.","title":"Troubleshooting","sidebar_order":950,"redirect_from":[],"platform":{"name":"python","title":"Python"},"guide":{"name":"sanic","title":"Sanic"},"noindex":true,"notoc":true,"id":"ff050074-8f3f-59d4-b268-d1ba0cc9e579"}},"staticQueryHashes":["1218203755","1222113826","1222113826","1766336459","2158593473","2404336828","2472290386","2764967025","3818502851","4015007367","4192517163","4264099332","518019976"]}