recce-nightly 0.62.0.20250417__py3-none-any.whl → 1.30.0.20251221__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of recce-nightly might be problematic. Click here for more details.

Files changed (245) hide show
  1. recce/VERSION +1 -1
  2. recce/__init__.py +27 -22
  3. recce/adapter/base.py +11 -14
  4. recce/adapter/dbt_adapter/__init__.py +845 -461
  5. recce/adapter/dbt_adapter/dbt_version.py +3 -0
  6. recce/adapter/sqlmesh_adapter.py +24 -35
  7. recce/apis/check_api.py +59 -42
  8. recce/apis/check_events_api.py +353 -0
  9. recce/apis/check_func.py +41 -35
  10. recce/apis/run_api.py +25 -19
  11. recce/apis/run_func.py +64 -25
  12. recce/artifact.py +119 -51
  13. recce/cli.py +1301 -324
  14. recce/config.py +43 -34
  15. recce/connect_to_cloud.py +138 -0
  16. recce/core.py +55 -47
  17. recce/data/404/index.html +2 -0
  18. recce/data/404.html +2 -1
  19. recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +7 -0
  20. recce/data/__next.@lineage.!KHNsb3Qp.txt +4 -0
  21. recce/data/__next.__PAGE__.txt +6 -0
  22. recce/data/__next._full.txt +32 -0
  23. recce/data/__next._head.txt +8 -0
  24. recce/data/__next._index.txt +14 -0
  25. recce/data/__next._tree.txt +8 -0
  26. recce/data/_next/static/chunks/025a7e3e3f9f40ae.js +1 -0
  27. recce/data/_next/static/chunks/0ce56d67ef5779ca.js +4 -0
  28. recce/data/_next/static/chunks/1a6a78780155dac7.js +48 -0
  29. recce/data/_next/static/chunks/1de8485918b9182a.css +2 -0
  30. recce/data/_next/static/chunks/1e4b1b50d1e34993.js +1 -0
  31. recce/data/_next/static/chunks/206d5d181e4c738e.js +1 -0
  32. recce/data/_next/static/chunks/2c357efc34c5b859.js +25 -0
  33. recce/data/_next/static/chunks/2e9d95d2d48c479c.js +1 -0
  34. recce/data/_next/static/chunks/2f016dc4a3edad2e.js +2 -0
  35. recce/data/_next/static/chunks/313251962d698f7c.js +1 -0
  36. recce/data/_next/static/chunks/3a9f021f38eb5574.css +1 -0
  37. recce/data/_next/static/chunks/40079da8d2b8f651.js +1 -0
  38. recce/data/_next/static/chunks/4599182bffb64661.js +38 -0
  39. recce/data/_next/static/chunks/4e62f6e184173580.js +1 -0
  40. recce/data/_next/static/chunks/5c4dfb0d09eaa401.js +1 -0
  41. recce/data/_next/static/chunks/69e4f06ccfdfc3ac.js +1 -0
  42. recce/data/_next/static/chunks/6b206cb4707d6bee.js +1 -0
  43. recce/data/_next/static/chunks/6d8557f062aa4386.css +1 -0
  44. recce/data/_next/static/chunks/7fbe3650bd83b6b5.js +1 -0
  45. recce/data/_next/static/chunks/83fa823a825674f6.js +1 -0
  46. recce/data/_next/static/chunks/848a6c9b5f55f7ed.js +1 -0
  47. recce/data/_next/static/chunks/859462b0858aef88.css +2 -0
  48. recce/data/_next/static/chunks/923964f18c87d0f1.css +1 -0
  49. recce/data/_next/static/chunks/939390f911895d7c.js +48 -0
  50. recce/data/_next/static/chunks/99a9817237a07f43.js +1 -0
  51. recce/data/_next/static/chunks/9fed8b4b2b924054.js +5 -0
  52. recce/data/_next/static/chunks/b6949f6c5892110c.js +1 -0
  53. recce/data/_next/static/chunks/b851a1d3f8149828.js +1 -0
  54. recce/data/_next/static/chunks/c734f9ad957de0b4.js +1 -0
  55. recce/data/_next/static/chunks/cdde321b0ec75717.js +2 -0
  56. recce/data/_next/static/chunks/d0f91117d77ff844.css +1 -0
  57. recce/data/_next/static/chunks/d6c8667911c2500f.js +1 -0
  58. recce/data/_next/static/chunks/da8dab68c02752cf.js +74 -0
  59. recce/data/_next/static/chunks/dc074049c9d12d97.js +109 -0
  60. recce/data/_next/static/chunks/ee7f1a8227342421.js +1 -0
  61. recce/data/_next/static/chunks/fa2f4e56c2fccc73.js +1 -0
  62. recce/data/_next/static/chunks/turbopack-1fad664f62979b93.js +3 -0
  63. recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  64. recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  65. recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
  66. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  67. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
  68. recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  69. recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
  70. recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  71. recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
  72. recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
  73. recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  74. recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_buildManifest.js +11 -0
  75. recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_clientMiddlewareManifest.json +1 -0
  76. recce/data/_not-found/__next._full.txt +24 -0
  77. recce/data/_not-found/__next._head.txt +8 -0
  78. recce/data/_not-found/__next._index.txt +13 -0
  79. recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
  80. recce/data/_not-found/__next._not-found.txt +4 -0
  81. recce/data/_not-found/__next._tree.txt +6 -0
  82. recce/data/_not-found/index.html +2 -0
  83. recce/data/_not-found/index.txt +24 -0
  84. recce/data/auth_callback.html +68 -0
  85. recce/data/checks/__next.@lineage.__DEFAULT__.txt +7 -0
  86. recce/data/checks/__next._full.txt +39 -0
  87. recce/data/checks/__next._head.txt +8 -0
  88. recce/data/checks/__next._index.txt +14 -0
  89. recce/data/checks/__next._tree.txt +8 -0
  90. recce/data/checks/__next.checks.__PAGE__.txt +10 -0
  91. recce/data/checks/__next.checks.txt +4 -0
  92. recce/data/checks/index.html +2 -0
  93. recce/data/checks/index.txt +39 -0
  94. recce/data/imgs/reload-image.svg +4 -0
  95. recce/data/index.html +2 -27
  96. recce/data/index.txt +32 -7
  97. recce/data/lineage/__next.@lineage.__DEFAULT__.txt +7 -0
  98. recce/data/lineage/__next._full.txt +39 -0
  99. recce/data/lineage/__next._head.txt +8 -0
  100. recce/data/lineage/__next._index.txt +14 -0
  101. recce/data/lineage/__next._tree.txt +8 -0
  102. recce/data/lineage/__next.lineage.__PAGE__.txt +10 -0
  103. recce/data/lineage/__next.lineage.txt +4 -0
  104. recce/data/lineage/index.html +2 -0
  105. recce/data/lineage/index.txt +39 -0
  106. recce/data/query/__next.@lineage.__DEFAULT__.txt +7 -0
  107. recce/data/query/__next._full.txt +37 -0
  108. recce/data/query/__next._head.txt +8 -0
  109. recce/data/query/__next._index.txt +14 -0
  110. recce/data/query/__next._tree.txt +8 -0
  111. recce/data/query/__next.query.__PAGE__.txt +9 -0
  112. recce/data/query/__next.query.txt +4 -0
  113. recce/data/query/index.html +2 -0
  114. recce/data/query/index.txt +37 -0
  115. recce/diff.py +6 -12
  116. recce/event/CONFIG.bak +1 -0
  117. recce/event/__init__.py +86 -74
  118. recce/event/collector.py +33 -22
  119. recce/event/track.py +49 -27
  120. recce/exceptions.py +1 -1
  121. recce/git.py +7 -7
  122. recce/github.py +57 -53
  123. recce/mcp_server.py +725 -0
  124. recce/models/__init__.py +4 -1
  125. recce/models/check.py +438 -21
  126. recce/models/run.py +1 -0
  127. recce/models/types.py +134 -28
  128. recce/pull_request.py +27 -25
  129. recce/run.py +179 -122
  130. recce/server.py +394 -104
  131. recce/state/__init__.py +31 -0
  132. recce/state/cloud.py +644 -0
  133. recce/state/const.py +26 -0
  134. recce/state/local.py +56 -0
  135. recce/state/state.py +119 -0
  136. recce/state/state_loader.py +174 -0
  137. recce/summary.py +196 -149
  138. recce/tasks/__init__.py +19 -3
  139. recce/tasks/core.py +11 -13
  140. recce/tasks/dataframe.py +82 -18
  141. recce/tasks/histogram.py +69 -34
  142. recce/tasks/lineage.py +2 -2
  143. recce/tasks/profile.py +152 -86
  144. recce/tasks/query.py +180 -89
  145. recce/tasks/rowcount.py +37 -31
  146. recce/tasks/schema.py +18 -15
  147. recce/tasks/top_k.py +35 -35
  148. recce/tasks/utils.py +147 -0
  149. recce/tasks/valuediff.py +247 -155
  150. recce/util/__init__.py +3 -0
  151. recce/util/api_token.py +80 -0
  152. recce/util/breaking.py +105 -100
  153. recce/util/cll.py +274 -219
  154. recce/util/cloud/__init__.py +15 -0
  155. recce/util/cloud/base.py +115 -0
  156. recce/util/cloud/check_events.py +190 -0
  157. recce/util/cloud/checks.py +242 -0
  158. recce/util/io.py +22 -17
  159. recce/util/lineage.py +65 -16
  160. recce/util/logger.py +1 -1
  161. recce/util/onboarding_state.py +45 -0
  162. recce/util/perf_tracking.py +85 -0
  163. recce/util/recce_cloud.py +347 -72
  164. recce/util/singleton.py +4 -4
  165. recce/util/startup_perf.py +121 -0
  166. recce/yaml/__init__.py +7 -10
  167. recce_nightly-1.30.0.20251221.dist-info/METADATA +195 -0
  168. recce_nightly-1.30.0.20251221.dist-info/RECORD +183 -0
  169. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/WHEEL +1 -2
  170. recce/data/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js +0 -1
  171. recce/data/_next/static/chunks/29e3cc0d-8c150e37dff9631b.js +0 -1
  172. recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +0 -1
  173. recce/data/_next/static/chunks/3998a672-eaad84bdd88cc73e.js +0 -1
  174. recce/data/_next/static/chunks/450c323b-1bb5db526e54435a.js +0 -1
  175. recce/data/_next/static/chunks/47d8844f-79a1b53c66a7d7ec.js +0 -1
  176. recce/data/_next/static/chunks/500-e51c92a025a51234.js +0 -65
  177. recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +0 -1
  178. recce/data/_next/static/chunks/700-3b65fc3666820d00.js +0 -2
  179. recce/data/_next/static/chunks/7a8a3e83-d7fa409d97b38b2b.js +0 -1
  180. recce/data/_next/static/chunks/7f27ae6c-413f6b869a04183a.js +0 -1
  181. recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
  182. recce/data/_next/static/chunks/a30376cd-7d806e1602f2dc3a.js +0 -1
  183. recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +0 -1
  184. recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
  185. recce/data/_next/static/chunks/app/page-9adc25782272ed2e.js +0 -1
  186. recce/data/_next/static/chunks/b63b1b3f-7395c74e11a14e95.js +0 -1
  187. recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +0 -1
  188. recce/data/_next/static/chunks/c1ceaa8b-a1e442154d23515e.js +0 -1
  189. recce/data/_next/static/chunks/cd9f8d63-cf0d5a7b0f7a92e8.js +0 -54
  190. recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +0 -1
  191. recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +0 -1
  192. recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +0 -1
  193. recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
  194. recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +0 -1
  195. recce/data/_next/static/chunks/main-app-0225a2255968e566.js +0 -1
  196. recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +0 -1
  197. recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +0 -1
  198. recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
  199. recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -14
  200. recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  201. recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
  202. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
  203. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  204. recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  205. recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
  206. recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  207. recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
  208. recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
  209. recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  210. recce/data/_next/static/qiyFlux77VkhxiceAJe_F/_buildManifest.js +0 -1
  211. recce/state.py +0 -753
  212. recce_nightly-0.62.0.20250417.dist-info/METADATA +0 -311
  213. recce_nightly-0.62.0.20250417.dist-info/RECORD +0 -139
  214. recce_nightly-0.62.0.20250417.dist-info/top_level.txt +0 -2
  215. tests/__init__.py +0 -0
  216. tests/adapter/__init__.py +0 -0
  217. tests/adapter/dbt_adapter/__init__.py +0 -0
  218. tests/adapter/dbt_adapter/conftest.py +0 -13
  219. tests/adapter/dbt_adapter/dbt_test_helper.py +0 -283
  220. tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -40
  221. tests/adapter/dbt_adapter/test_dbt_cll.py +0 -102
  222. tests/adapter/dbt_adapter/test_selector.py +0 -177
  223. tests/tasks/__init__.py +0 -0
  224. tests/tasks/conftest.py +0 -4
  225. tests/tasks/test_histogram.py +0 -137
  226. tests/tasks/test_lineage.py +0 -42
  227. tests/tasks/test_preset_checks.py +0 -50
  228. tests/tasks/test_profile.py +0 -73
  229. tests/tasks/test_query.py +0 -151
  230. tests/tasks/test_row_count.py +0 -116
  231. tests/tasks/test_schema.py +0 -99
  232. tests/tasks/test_top_k.py +0 -73
  233. tests/tasks/test_valuediff.py +0 -74
  234. tests/test_cli.py +0 -122
  235. tests/test_config.py +0 -45
  236. tests/test_core.py +0 -27
  237. tests/test_dbt.py +0 -36
  238. tests/test_pull_request.py +0 -130
  239. tests/test_server.py +0 -98
  240. tests/test_state.py +0 -123
  241. tests/test_summary.py +0 -57
  242. /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
  243. /recce/data/_next/static/{qiyFlux77VkhxiceAJe_F → nX-Uz0AH6Tc6hIQUFGqaB}/_ssgManifest.js +0 -0
  244. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/entry_points.txt +0 -0
  245. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,2 @@
1
+ <!DOCTYPE html><!--nX_Uz0AH6Tc6hIQUFGqaB--><html lang="en"><head><meta charSet="utf-8"/><link rel="preconnect" href="/" crossorigin=""/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/chunks/3a9f021f38eb5574.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/859462b0858aef88.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/6d8557f062aa4386.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/d0f91117d77ff844.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/923964f18c87d0f1.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/1de8485918b9182a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/69e4f06ccfdfc3ac.js"/><script src="/_next/static/chunks/0ce56d67ef5779ca.js" async=""></script><script src="/_next/static/chunks/d6c8667911c2500f.js" async=""></script><script src="/_next/static/chunks/2f016dc4a3edad2e.js" async=""></script><script src="/_next/static/chunks/turbopack-1fad664f62979b93.js" async=""></script><script src="/_next/static/chunks/c734f9ad957de0b4.js" async=""></script><script src="/_next/static/chunks/2e9d95d2d48c479c.js" async=""></script><script src="/_next/static/chunks/7fbe3650bd83b6b5.js" async=""></script><script src="/_next/static/chunks/4599182bffb64661.js" async=""></script><script src="/_next/static/chunks/83fa823a825674f6.js" async=""></script><script src="/_next/static/chunks/9fed8b4b2b924054.js" async=""></script><script src="/_next/static/chunks/2c357efc34c5b859.js" async=""></script><script src="/_next/static/chunks/dc074049c9d12d97.js" async=""></script><script src="/_next/static/chunks/40079da8d2b8f651.js" async=""></script><script src="/_next/static/chunks/848a6c9b5f55f7ed.js" async=""></script><script src="/_next/static/chunks/cdde321b0ec75717.js" async=""></script><script src="/_next/static/chunks/99a9817237a07f43.js" async=""></script><script src="/_next/static/chunks/b6949f6c5892110c.js" async=""></script><script src="/_next/static/chunks/6b206cb4707d6bee.js" async=""></script><script src="/_next/static/chunks/4e62f6e184173580.js" async=""></script><script src="/_next/static/chunks/1a6a78780155dac7.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtm.js?id=GTM-M2HVJQFD" as="script"/><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico?favicon.a8d38d84.ico" sizes="32x32" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-emotion="css-global 1sm4dhk">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:#171717;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;background-color:#FFFFFF;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#FFFFFF;}</style><style data-emotion="css lb61rc">.css-lb61rc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;overflow:hidden;}</style><div class="MuiBox-root css-lb61rc"><style data-emotion="css 19a3m4u">.css-19a3m4u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;min-height:40px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgb(255, 110, 66);}</style><div class="MuiBox-root css-19a3m4u"><style data-emotion="css 1cto74x">.css-1cto74x{-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-1cto74x:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1cto74x:hover{color:#225581;}.css-1cto74x:hover{-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion="css oqdijk">.css-oqdijk{margin:0;font:inherit;line-height:inherit;letter-spacing:inherit;color:#3182CE;font-weight:500;-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-oqdijk:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-oqdijk:hover{color:#225581;}.css-oqdijk:hover{-webkit-text-decoration:none;text-decoration:none;}</style><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover css-oqdijk" href="https://reccehq.com/" target="_blank"><style data-emotion="css 15zum9u">.css-15zum9u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-15zum9u"><style data-emotion="css u2at6n">.css-u2at6n{width:20px;height:20px;margin-left:18px;}</style><img class="MuiBox-root css-u2at6n" src="/logo/recce-logo-white.png" alt="recce-logo-white"/><style data-emotion="css 1f16f3g">.css-1f16f3g{margin:0;font-weight:600;font-size:1.25rem;line-height:1.4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";color:white;font-family:"Montserrat",sans-serif;font-size:1.25rem;}</style><h4 class="MuiTypography-root MuiTypography-h4 css-1f16f3g">RECCE</h4></div></a><style data-emotion="css 1jcz15f">.css-1jcz15f{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:rgba(255,255,255,0.8);font-size:sm;text-transform:uppercase;border-width:1px;padding-left:4px;padding-right:4px;border-radius:4.5px;}</style><span class="MuiTypography-root MuiTypography-body1 css-1jcz15f"></span><style data-emotion="css 1rr4qq7">.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-1rr4qq7"></div><style data-emotion="css 1824a4q">.css-1824a4q{color:white;font-size:0.875rem;font-weight:600;background-color:brand.700;border-radius:6px;padding-left:12px;padding-right:12px;padding-top:4px;padding-bottom:4px;margin-right:8px;cursor:pointer;border:none;}</style><button class="MuiBox-root css-1824a4q">Connect to Cloud</button></div><style data-emotion="css 1dhtcsx">.css-1dhtcsx{border-bottom:1px solid lightgray;padding-left:12px;padding-right:12px;}</style><div class="MuiBox-root css-1dhtcsx"><style data-emotion="css kkbn2n">.css-kkbn2n{display:grid;grid-template-columns:1fr auto 1fr;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-kkbn2n"><style data-emotion="css 1qlx8uq">.css-1qlx8uq{overflow:hidden;min-height:48px;-webkit-overflow-scrolling:touch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:none;min-height:auto;}@media (max-width:599.95px){.css-1qlx8uq .MuiTabs-scrollButtons{display:none;}}</style><div class="MuiTabs-root css-1qlx8uq"><style data-emotion="css 2xu61f">.css-2xu61f{position:relative;display:inline-block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;white-space:nowrap;overflow-x:hidden;width:100%;}</style><div style="overflow:hidden;margin-bottom:0" class="MuiTabs-scroller MuiTabs-fixed css-2xu61f"><style data-emotion="css 17do188">.css-17do188{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div role="tablist" class="MuiTabs-list MuiTabs-flexContainer css-17do188"><style data-emotion="css 1n2jfwv">.css-1n2jfwv{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1n2jfwv.Mui-selected{color:#3182CE;}.css-1n2jfwv.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><style data-emotion="css 1ameuk9">.css-1ameuk9{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1ameuk9::-moz-focus-inner{border-style:none;}.css-1ameuk9.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ameuk9{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ameuk9.Mui-selected{color:#3182CE;}.css-1ameuk9.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><style data-emotion="css 171onha">.css-171onha{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;}</style><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/lineage/">Lineage</a></div></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-selected Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="true"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/query/">Query</a></div><style data-emotion="css l6r5ej">.css-l6r5ej{position:absolute;height:2px;bottom:0;width:100%;-webkit-transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#3182CE;height:2px;}</style><span class="MuiTabs-indicator css-l6r5ej"></span></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem;display:flex;gap:3px;align-items:center" href="/checks/">Checklist<!-- --> </a></div></button></div></div></div><style data-emotion="css vx1bta">.css-vx1bta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-vx1bta"></div></div></div><div style="display:flex;flex-direction:row;height:100%"><div class="MuiBox-root css-0" style="contain:size"></div><div style="display:flex;flex-direction:column;flex:1;contain:size"><!--$?--><template id="B:0"></template><style data-emotion="css 11iw7t1">.css-11iw7t1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;contain:size;}</style><div class="MuiBox-root css-11iw7t1"><style data-emotion="css tkevr6">.css-tkevr6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:100%;}</style><div class="MuiBox-root css-tkevr6"><style data-emotion="css 18h6s44 animation-61bdi0">.css-18h6s44{display:inline-block;-webkit-animation:animation-61bdi0 1.4s linear infinite;animation:animation-61bdi0 1.4s linear infinite;color:#3182CE;}@-webkit-keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}</style><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><style data-emotion="css 4ejps8">.css-4ejps8{display:block;}</style><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><style data-emotion="css 13odlrs animation-1o38n3e">.css-13odlrs{stroke:currentColor;stroke-dasharray:80px,200px;stroke-dashoffset:0;-webkit-animation:animation-1o38n3e 1.4s ease-in-out infinite;animation:animation-1o38n3e 1.4s ease-in-out infinite;}@-webkit-keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}@keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}</style><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><!--/$--><style data-emotion="css 10klw3m">.css-10klw3m{height:100%;}</style><div class="MuiBox-root css-10klw3m"></div></div></div></div><style data-emotion="css depviu">@media print{.css-depviu{position:absolute!important;}}</style><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src="/_next/static/chunks/69e4f06ccfdfc3ac.js" id="_R_" async=""></script><div hidden id="S:0"><style data-emotion="css 1arxj4v">.css-1arxj4v{padding:0px;contain:content;}</style><div class="MuiBox-root css-1arxj4v"><style data-emotion="css r2yx1p">.css-r2yx1p{display:none;height:100%;position:absolute;inset:0;}</style><div class="MuiBox-root css-r2yx1p"><style data-emotion="css l1tuuh">.css-l1tuuh{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-l1tuuh"><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><style data-emotion="css 1g4yje1">.css-1g4yje1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;}</style><div class="MuiBox-root css-1g4yje1"><style data-emotion="css 1aqmeaq">.css-1aqmeaq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:right;-ms-flex-pack:right;-webkit-justify-content:right;justify-content:right;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;padding:4pt 8pt;gap:5px;height:54px;border-bottom:1px solid lightgray;-webkit-flex:0 0 54px;-ms-flex:0 0 54px;flex:0 0 54px;}</style><div class="MuiBox-root css-1aqmeaq"><div class="MuiBox-root css-0"><style data-emotion="css 1l201on">.css-1l201on{font-size:8pt;}</style><div class="MuiBox-root css-1l201on">History</div><style data-emotion="css 2tw0t7">.css-2tw0t7{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;}.css-2tw0t7:hover{-webkit-text-decoration:none;text-decoration:none;}.css-2tw0t7.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-2tw0t7.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-2tw0t7:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-2tw0t7:hover{box-shadow:none;}.css-2tw0t7.Mui-focusVisible{box-shadow:none;}.css-2tw0t7:active{box-shadow:none;}.css-2tw0t7.Mui-disabled{box-shadow:none;}.css-2tw0t7.MuiButton-loading{color:transparent;}.css-2tw0t7:hover{border-width:1px;}</style><style data-emotion="css 16izesw">.css-16izesw{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;}.css-16izesw::-moz-focus-inner{border-style:none;}.css-16izesw.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-16izesw{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-16izesw:hover{-webkit-text-decoration:none;text-decoration:none;}.css-16izesw.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-16izesw.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-16izesw:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-16izesw:hover{box-shadow:none;}.css-16izesw.Mui-focusVisible{box-shadow:none;}.css-16izesw:active{box-shadow:none;}.css-16izesw.Mui-disabled{box-shadow:none;}.css-16izesw.MuiButton-loading{color:transparent;}.css-16izesw:hover{border-width:1px;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation css-16izesw" tabindex="0" type="button"><style data-emotion="css 1s1s15d">.css-1s1s15d{display:inherit;margin-right:8px;margin-left:-4px;}</style><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeXsmall css-1s1s15d"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M13.507 12.324a7 7 0 0 0 .065-8.56A7 7 0 0 0 2 4.393V2H1v3.5l.5.5H5V5H2.811a6.008 6.008 0 1 1-.135 5.77l-.887.462a7 7 0 0 0 11.718 1.092zm-3.361-.97l.708-.707L8 7.792V4H7v4l.146.354 3 3z"></path></svg></span>Show</button></div><div class="MuiBox-root css-0"><style data-emotion="css 19np553">.css-19np553{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:0.75rem;}.css-19np553>:not(style):not(style){margin:0;}.css-19np553>:not(style)~:not(style){margin-left:2px;}</style><div class="MuiStack-root css-19np553"><style data-emotion="css 6x80av">.css-6x80av{margin:0;font-size:0.75rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;font-size:0.75rem;}</style><p class="MuiTypography-root MuiTypography-body2 css-6x80av">Custom Queries</p><style data-emotion="css p5a8cd">.css-p5a8cd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:#525252;}</style><span class="MuiBox-root css-p5a8cd" aria-label="Custom queries allow you to use two SQL queries to compare results between current and base environments."><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" font-size="1rem" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"></path></svg></span><style data-emotion="css 87glm6">.css-87glm6{z-index:1500;pointer-events:none;pointer-events:auto;pointer-events:none;}</style><style data-emotion="css levejw">.css-levejw{z-index:1500;pointer-events:none;pointer-events:auto;pointer-events:none;}</style></div><style data-emotion="css 1pwinck">.css-1pwinck{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:58px;height:38px;overflow:hidden;padding:12px;box-sizing:border-box;position:relative;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;z-index:0;vertical-align:middle;width:40px;height:24px;padding:7px;}@media print{.css-1pwinck{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1pwinck .MuiSwitch-thumb{width:16px;height:16px;}.css-1pwinck .MuiSwitch-switchBase{padding:4px;}.css-1pwinck .MuiSwitch-switchBase.Mui-checked{-webkit-transform:translateX(16px);-moz-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px);}</style><span class="MuiSwitch-root MuiSwitch-sizeSmall css-1pwinck"><style data-emotion="css dttd05">.css-dttd05{position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-dttd05.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-dttd05.Mui-disabled{color:#F5F5F5;}.css-dttd05.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-dttd05.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-dttd05 .MuiSwitch-input{left:-100%;width:300%;}.css-dttd05:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-dttd05:hover{background-color:transparent;}}.css-dttd05.Mui-checked{color:#3182CE;}.css-dttd05.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-dttd05.Mui-checked:hover{background-color:transparent;}}.css-dttd05.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-dttd05.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><style data-emotion="css 1li6zzw">.css-1li6zzw{padding:9px;border-radius:50%;position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1li6zzw.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-1li6zzw.Mui-disabled{color:#F5F5F5;}.css-1li6zzw.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-1li6zzw.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-1li6zzw .MuiSwitch-input{left:-100%;width:300%;}.css-1li6zzw:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1li6zzw:hover{background-color:transparent;}}.css-1li6zzw.Mui-checked{color:#3182CE;}.css-1li6zzw.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-1li6zzw.Mui-checked:hover{background-color:transparent;}}.css-1li6zzw.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-1li6zzw.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><style data-emotion="css 1yjdgai">.css-1yjdgai{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;padding:9px;border-radius:50%;position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1yjdgai::-moz-focus-inner{border-style:none;}.css-1yjdgai.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1yjdgai{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1yjdgai.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-1yjdgai.Mui-disabled{color:#F5F5F5;}.css-1yjdgai.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-1yjdgai.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-1yjdgai .MuiSwitch-input{left:-100%;width:300%;}.css-1yjdgai:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1yjdgai:hover{background-color:transparent;}}.css-1yjdgai.Mui-checked{color:#3182CE;}.css-1yjdgai.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-1yjdgai.Mui-checked:hover{background-color:transparent;}}.css-1yjdgai.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-1yjdgai.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><span class="MuiButtonBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary PrivateSwitchBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary css-1yjdgai"><style data-emotion="css j8yymo">.css-j8yymo{cursor:inherit;position:absolute;opacity:0;width:100%;height:100%;top:0;left:0;margin:0;padding:0;z-index:1;}</style><input type="checkbox" role="switch" class="PrivateSwitchBase-input MuiSwitch-input css-j8yymo"/><style data-emotion="css pcrmjj">.css-pcrmjj{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12);background-color:currentColor;width:20px;height:20px;border-radius:50%;}</style><span class="MuiSwitch-thumb css-pcrmjj"></span></span><style data-emotion="css 1khxa25">.css-1khxa25{height:100%;width:100%;border-radius:7px;z-index:-1;-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#000;opacity:0.38;}</style><span class="MuiSwitch-track css-1khxa25"></span></span></div><style data-emotion="css i9gxme">.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}</style><div class="MuiBox-root css-i9gxme"></div><style data-emotion="css k008qs">.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div class="MuiBox-root css-k008qs"><style data-emotion="css 1c8x0al">.css-1c8x0al{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0 0.5rem;}</style><div class="MuiStack-root css-1c8x0al"><style data-emotion="css flsuge">.css-flsuge{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-flsuge>:not(style):not(style){margin:0;}.css-flsuge>:not(style)~:not(style){margin-left:2px;}</style><div class="MuiStack-root css-flsuge"><style data-emotion="css om753j">.css-om753j{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:#525252;font-size:0.625rem;}</style><label class="MuiTypography-root MuiTypography-body1 css-om753j">Diff with Primary Key(s) (suggested)</label><style data-emotion="css 1j6yt1r">.css-1j6yt1r{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:#525252;cursor:help;}</style><span class="MuiBox-root css-1j6yt1r" aria-label="Provide a primary key to perform query diff in data warehouse and only return changed rows."><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" font-size="0.75rem" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path></svg></span></div><style data-emotion="css qw5n18">.css-qw5n18{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:240px;}</style><div class="no-track-pii-safe MuiBox-root css-qw5n18"><style data-emotion="css 1786q8c">.css-1786q8c{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#737373;--variant-outlinedColor:#737373;--variant-outlinedBorder:rgba(115, 115, 115, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#737373;padding:3px 9px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0.25rem 0.75rem;font-size:0.875rem;border-color:#D4D4D4;color:#171717;width:100%;height:24px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;text-transform:none;font-size:0.625rem;font-weight:normal;padding-left:4px;padding-right:4px;}.css-1786q8c:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1786q8c.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1786q8c.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1786q8c:hover{--variant-containedBg:#525252;--variant-textBg:rgba(115, 115, 115, 0.04);--variant-outlinedBorder:#737373;--variant-outlinedBg:rgba(115, 115, 115, 0.04);}}.css-1786q8c:hover{box-shadow:none;}.css-1786q8c.Mui-focusVisible{box-shadow:none;}.css-1786q8c:active{box-shadow:none;}.css-1786q8c.Mui-disabled{box-shadow:none;}.css-1786q8c.MuiButton-loading{color:transparent;}.css-1786q8c:hover{border-width:1px;}.css-1786q8c:hover{border-color:#A3A3A3;background-color:#F5F5F5;}</style><style data-emotion="css sbnkax">.css-sbnkax{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#737373;--variant-outlinedColor:#737373;--variant-outlinedBorder:rgba(115, 115, 115, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#737373;padding:3px 9px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0.25rem 0.75rem;font-size:0.875rem;border-color:#D4D4D4;color:#171717;width:100%;height:24px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;text-transform:none;font-size:0.625rem;font-weight:normal;padding-left:4px;padding-right:4px;}.css-sbnkax::-moz-focus-inner{border-style:none;}.css-sbnkax.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-sbnkax{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-sbnkax:hover{-webkit-text-decoration:none;text-decoration:none;}.css-sbnkax.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-sbnkax.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-sbnkax:hover{--variant-containedBg:#525252;--variant-textBg:rgba(115, 115, 115, 0.04);--variant-outlinedBorder:#737373;--variant-outlinedBg:rgba(115, 115, 115, 0.04);}}.css-sbnkax:hover{box-shadow:none;}.css-sbnkax.Mui-focusVisible{box-shadow:none;}.css-sbnkax:active{box-shadow:none;}.css-sbnkax.Mui-disabled{box-shadow:none;}.css-sbnkax.MuiButton-loading{color:transparent;}.css-sbnkax:hover{border-width:1px;}.css-sbnkax:hover{border-color:#A3A3A3;background-color:#F5F5F5;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedNeutral MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorNeutral MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedNeutral MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorNeutral MuiButton-disableElevation css-sbnkax" tabindex="0" type="button"><style data-emotion="css 1hf3ko">.css-1hf3ko{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:#525252;font-size:0.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}</style><span class="MuiTypography-root MuiTypography-body1 css-1hf3ko">Select or type to add keys</span></button></div></div></div><style data-emotion="css 1w708gf">.css-1w708gf{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;padding:4px 10px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;padding:0.25rem 0.75rem;font-size:0.875rem;}.css-1w708gf:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1w708gf.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1w708gf:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-1w708gf:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.css-1w708gf:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-1w708gf.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-1w708gf.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1w708gf:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1w708gf:hover{box-shadow:none;}.css-1w708gf.Mui-focusVisible{box-shadow:none;}.css-1w708gf:active{box-shadow:none;}.css-1w708gf.Mui-disabled{box-shadow:none;}.css-1w708gf.MuiButton-loading{color:transparent;}.css-1w708gf:hover{box-shadow:none;}</style><style data-emotion="css ud44du">.css-ud44du{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;padding:4px 10px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;padding:0.25rem 0.75rem;font-size:0.875rem;}.css-ud44du::-moz-focus-inner{border-style:none;}.css-ud44du.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-ud44du{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-ud44du:hover{-webkit-text-decoration:none;text-decoration:none;}.css-ud44du.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-ud44du:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-ud44du:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.css-ud44du:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-ud44du.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-ud44du.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-ud44du:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-ud44du:hover{box-shadow:none;}.css-ud44du.Mui-focusVisible{box-shadow:none;}.css-ud44du:active{box-shadow:none;}.css-ud44du.Mui-disabled{box-shadow:none;}.css-ud44du.MuiButton-loading{color:transparent;}.css-ud44du:hover{box-shadow:none;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-ud44du" tabindex="0" type="button">Run Diff</button></div><style data-emotion="css a8gnbf">.css-a8gnbf{width:100%;-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-a8gnbf"><style data-emotion="css 1fbu2fh">.css-1fbu2fh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;background-color:#EDF2F880;height:40px;min-height:40px;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0px;padding:0px 16px;-webkit-flex:0 0 40px;-ms-flex:0 0 40px;flex:0 0 40px;}</style><div class="MuiStack-root css-1fbu2fh"><style data-emotion="css nwvf79">.css-nwvf79{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;font-weight:700;}</style><strong class="MuiTypography-root MuiTypography-body1 no-track-pii-safe css-nwvf79"></strong><div class="MuiBox-root css-i9gxme"></div><style data-emotion="css 1ml32ah">.css-1ml32ah{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;background-color:white;padding:6px 12px;}.css-1ml32ah:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1ml32ah.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1ml32ah.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1ml32ah:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1ml32ah:hover{box-shadow:none;}.css-1ml32ah.Mui-focusVisible{box-shadow:none;}.css-1ml32ah:active{box-shadow:none;}.css-1ml32ah.Mui-disabled{box-shadow:none;}.css-1ml32ah.MuiButton-loading{color:transparent;}.css-1ml32ah:hover{border-width:1px;}</style><style data-emotion="css 1d22ayb">.css-1d22ayb{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;background-color:white;padding:6px 12px;}.css-1d22ayb::-moz-focus-inner{border-style:none;}.css-1d22ayb.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1d22ayb{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1d22ayb:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1d22ayb.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1d22ayb.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1d22ayb:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1d22ayb:hover{box-shadow:none;}.css-1d22ayb.Mui-focusVisible{box-shadow:none;}.css-1d22ayb:active{box-shadow:none;}.css-1d22ayb.Mui-disabled{box-shadow:none;}.css-1d22ayb.MuiButton-loading{color:transparent;}.css-1d22ayb:hover{border-width:1px;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation css-1d22ayb" tabindex="0" type="button"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeXsmall css-1s1s15d"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 384 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"></path></svg></span>Run Query</button></div><div class="cm-theme no-track-pii-safe max-h-dvh h-full no-track-pii-safe"></div></div></div><!--$--><!--/$--></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
2
+ $RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:I[660181,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"HTTPAccessFallbackBoundary\"]\n2:I[634135,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"GoogleTagManager\"]\n3:I[485153,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"\"]\n4:I[84654,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"default\"]\n5:I[302240,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"default\"]\n6:I[408821,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/848a6c9b5f55f7ed.js\"],\"default\"]\n7:I[354876,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"default\"]\n8:\"$Sreact.fragment\"\n9:I[288014,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"ClientPageRoot\"]\na:I[884916,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/cdde321b0ec75717.js\",\"/_next/static/chunks/99a9817237a07f43.js\"],\"default\"]\n12:I[253348,[\"/_next/static/chunks/b6949f6c5892110c.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"default\"]\n:HL[\"/_next/static/chunks/3a9f021f38eb5574.css\",\"style\"]\n:HL[\"/_next/static/chunks/859462b0858aef88.css\",\"style\"]\n:HL[\"/_next/static/chunks/6d8557f062aa4386.css\",\"style\"]\n:HL[\"/_next/static/chunks/d0f91117d77ff844.css\",\"style\"]\n:HL[\"/_next/static/chunks/923964f18c87d0f1.css\",\"style\"]\n:HL[\"/_next/static/chunks/1de8485918b9182a.css\",\"style\"]\n:HC[\"/\",\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"nX-Uz0AH6Tc6hIQUFGqaB\",\"c\":[\"\",\"query\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"query\",{\"children\":[\"__PAGE__\",{}]}],\"lineage\":[\"__DEFAULT__\",{}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$L1\",\"c\",{\"notFound\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3a9f021f38eb5574.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/859462b0858aef88.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6d8557f062aa4386.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/d0f91117d77ff844.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/923964f18c87d0f1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/4599182bffb64661.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/83fa823a825674f6.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/9fed8b4b2b924054.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/2c357efc34c5b859.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/dc074049c9d12d97.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-6\",{\"src\":\"/_next/static/chunks/40079da8d2b8f651.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":\"$undefined\",\"children\":[[],[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:0\"]]}]}]]}]],\"children\":[\"$0:f:0:1:0:props:notFound:0\",[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"lineage\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/848a6c9b5f55f7ed.js\",\"async\":true}]],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorStyles\",\"errorScripts\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorScripts\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:1\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$8\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$8\",\"c\",{\"children\":[[\"$\",\"$L9\",null,{\"Component\":\"$a\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@b\",\"$@c\"]}}],[\"$Ld\",\"$Le\"],\"$Lf\"]}],{},null,false,false]},null,false,false],\"lineage\":[\"$L10\",{},null,false,false]},null,false,false],\"$L11\",false]],\"m\":\"$undefined\",\"G\":[\"$12\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"13:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"OutletBoundary\"]\n14:\"$Sreact.suspense\"\n16:I[670337,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/6b206cb4707d6bee.js\",\"/_next/static/chunks/4e62f6e184173580.js\",\"/_next/static/chunks/1a6a78780155dac7.js\"],\"default\"]\n19:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"ViewportBoundary\"]\n1b:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"MetadataBoundary\"]\nd:[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdde321b0ec75717.js\",\"async\":true,\"nonce\":\"$undefined\"}]\ne:[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/99a9817237a07f43.js\",\"async\":true,\"nonce\":\"$undefined\"}]\nf:[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@15\"}]}]\n10:[\"$\",\"$8\",\"c\",{\"children\":[[\"$\",\"$L9\",null,{\"Component\":\"$16\",\"serverProvidedParams\":{\"searchParams\":\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:searchParams\",\"params\":\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\",\"promises\":[\"$@17\",\"$@18\"]}}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1de8485918b9182a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/6b206cb4707d6bee.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/4e62f6e184173580.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/1a6a78780155dac7.js\",\"async\":true,\"nonce\":\"$undefined\"}]],null]}]\n11:[\"$\",\"$8\",\"h\",{\"children\":[null,[\"$\",\"$L19\",null,{\"children\":\"$@1a\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1b\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.Metadata\",\"children\":\"$@1c\"}]}]}],null]}]\nb:{}\nc:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"17:{}\n18:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"1a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1d:I[666314,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"IconMark\"]\n1c:[[\"$\",\"title\",\"0\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.a8d38d84.ico\",\"sizes\":\"32x32\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1d\",\"3\",{}]]\n15:null\n"])</script></body></html>
@@ -0,0 +1,37 @@
1
+ 1:I[660181,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"HTTPAccessFallbackBoundary"]
2
+ 2:I[634135,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],"GoogleTagManager"]
3
+ 3:I[485153,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],""]
4
+ 4:I[84654,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],"default"]
5
+ 5:I[302240,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"default"]
6
+ 6:I[408821,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/848a6c9b5f55f7ed.js"],"default"]
7
+ 7:I[354876,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"default"]
8
+ 8:"$Sreact.fragment"
9
+ 9:I[288014,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"ClientPageRoot"]
10
+ a:I[884916,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/cdde321b0ec75717.js","/_next/static/chunks/99a9817237a07f43.js"],"default"]
11
+ 12:I[253348,["/_next/static/chunks/b6949f6c5892110c.js","/_next/static/chunks/40079da8d2b8f651.js"],"default"]
12
+ :HL["/_next/static/chunks/3a9f021f38eb5574.css","style"]
13
+ :HL["/_next/static/chunks/859462b0858aef88.css","style"]
14
+ :HL["/_next/static/chunks/6d8557f062aa4386.css","style"]
15
+ :HL["/_next/static/chunks/d0f91117d77ff844.css","style"]
16
+ :HL["/_next/static/chunks/923964f18c87d0f1.css","style"]
17
+ :HL["/_next/static/chunks/1de8485918b9182a.css","style"]
18
+ :HC["/",""]
19
+ 0:{"P":null,"b":"nX-Uz0AH6Tc6hIQUFGqaB","c":["","query",""],"q":"","i":false,"f":[[["",{"children":["query",{"children":["__PAGE__",{}]}],"lineage":["__DEFAULT__",{}]},"$undefined","$undefined",true],[["$","$L1","c",{"notFound":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3a9f021f38eb5574.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/859462b0858aef88.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","2",{"rel":"stylesheet","href":"/_next/static/chunks/6d8557f062aa4386.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","3",{"rel":"stylesheet","href":"/_next/static/chunks/d0f91117d77ff844.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","4",{"rel":"stylesheet","href":"/_next/static/chunks/923964f18c87d0f1.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/7fbe3650bd83b6b5.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/4599182bffb64661.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/83fa823a825674f6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/_next/static/chunks/9fed8b4b2b924054.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/_next/static/chunks/2c357efc34c5b859.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/_next/static/chunks/dc074049c9d12d97.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/_next/static/chunks/40079da8d2b8f651.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","$L2",null,{"gtmId":"GTM-M2HVJQFD"}],["$","$L3",null,{"dangerouslySetInnerHTML":{"__html":"\n (function() {\n const hash = window.location.hash;\n if (hash.startsWith('#!')) {\n const newLocation = window.location.origin + window.location.pathname;\n window.location.assign(newLocation);\n }\n })();\n "}}],["$","body",null,{"children":["$","$L4",null,{"lineage":"$undefined","children":[[],[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:0"]]}]}]]}]],"children":["$0:f:0:1:0:props:notFound:0",["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","$L2",null,{"gtmId":"GTM-M2HVJQFD"}],["$","$L3",null,{"dangerouslySetInnerHTML":{"__html":"\n (function() {\n const hash = window.location.hash;\n if (hash.startsWith('#!')) {\n const newLocation = window.location.origin + window.location.pathname;\n window.location.assign(newLocation);\n }\n })();\n "}}],["$","body",null,{"children":["$","$L4",null,{"lineage":["$","$L5",null,{"parallelRouterKey":"lineage","error":"$6","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/848a6c9b5f55f7ed.js","async":true}]],"template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}],"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$6","errorStyles":"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorStyles","errorScripts":"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorScripts","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:1","forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$8","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$8","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],["$Ld","$Le"],"$Lf"]}],{},null,false,false]},null,false,false],"lineage":["$L10",{},null,false,false]},null,false,false],"$L11",false]],"m":"$undefined","G":["$12",[]],"S":true}
20
+ 13:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"OutletBoundary"]
21
+ 14:"$Sreact.suspense"
22
+ 16:I[670337,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/6b206cb4707d6bee.js","/_next/static/chunks/4e62f6e184173580.js","/_next/static/chunks/1a6a78780155dac7.js"],"default"]
23
+ 19:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"ViewportBoundary"]
24
+ 1b:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"MetadataBoundary"]
25
+ d:["$","script","script-0",{"src":"/_next/static/chunks/cdde321b0ec75717.js","async":true,"nonce":"$undefined"}]
26
+ e:["$","script","script-1",{"src":"/_next/static/chunks/99a9817237a07f43.js","async":true,"nonce":"$undefined"}]
27
+ f:["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]
28
+ 10:["$","$8","c",{"children":[["$","$L9",null,{"Component":"$16","serverProvidedParams":{"searchParams":"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:searchParams","params":"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params","promises":["$@17","$@18"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/1de8485918b9182a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/6b206cb4707d6bee.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/4e62f6e184173580.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/1a6a78780155dac7.js","async":true,"nonce":"$undefined"}]],null]}]
29
+ 11:["$","$8","h",{"children":[null,["$","$L19",null,{"children":"$@1a"}],["$","div",null,{"hidden":true,"children":["$","$L1b",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$@1c"}]}]}],null]}]
30
+ b:{}
31
+ c:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
32
+ 17:{}
33
+ 18:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
34
+ 1a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
35
+ 1d:I[666314,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"IconMark"]
36
+ 1c:[["$","title","0",{"children":"recce"}],["$","meta","1",{"name":"description","content":"Recce: Data validation toolkit for comprehensive PR review"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.a8d38d84.ico","sizes":"32x32","type":"image/x-icon"}],["$","$L1d","3",{}]]
37
+ 15:null
recce/diff.py CHANGED
@@ -5,28 +5,22 @@ import pandas as pd
5
5
 
6
6
  def diff_text(before: str, after: str):
7
7
  if before is None and after is None:
8
- print('not found in both states')
8
+ print("not found in both states")
9
9
  return
10
10
  elif before == after:
11
- print('no changes')
11
+ print("no changes")
12
12
  return
13
13
 
14
- diff_output = difflib.unified_diff(
15
- before.splitlines(),
16
- after.splitlines(),
17
- "base",
18
- "current",
19
- lineterm=""
20
- )
14
+ diff_output = difflib.unified_diff(before.splitlines(), after.splitlines(), "base", "current", lineterm="")
21
15
  for line in diff_output:
22
16
  print(line)
23
17
 
24
18
 
25
19
  def diff_dataframe(before: pd.DataFrame, after: pd.DataFrame):
26
20
  if before is None and after is None:
27
- print('not found in both states')
21
+ print("not found in both states")
28
22
  return
29
23
 
30
24
  before_aligned, after_aligned = before.align(after)
31
- diff = before_aligned.compare(after_aligned, result_names=('base', 'current'))
32
- print(diff.to_string(na_rep='-'))
25
+ diff = before_aligned.compare(after_aligned, result_names=("base", "current"))
26
+ print(diff.to_string(na_rep="-"))
recce/event/CONFIG.bak ADDED
@@ -0,0 +1 @@
1
+ event_api_key: <API_KEY>
recce/event/__init__.py CHANGED
@@ -10,17 +10,21 @@ from typing import Dict
10
10
 
11
11
  import sentry_sdk
12
12
 
13
- from recce import is_ci_env, get_version, get_runner
13
+ from recce import get_runner, get_version, is_ci_env, is_recce_cloud_instance
14
14
  from recce import yaml as pyml
15
15
  from recce.event.collector import Collector
16
16
  from recce.git import current_branch, hosting_repo
17
- from recce.github import is_github_codespace, get_github_codespace_info, get_github_codespace_name, \
18
- get_github_codespace_available_at
19
-
20
- USER_HOME = os.path.expanduser('~')
21
- RECCE_USER_HOME = os.path.join(USER_HOME, '.recce')
22
- RECCE_USER_PROFILE = os.path.join(RECCE_USER_HOME, 'profile.yml')
23
- RECCE_USER_EVENT_PATH = os.path.join(RECCE_USER_HOME, '.unsend_events.json')
17
+ from recce.github import (
18
+ get_github_codespace_available_at,
19
+ get_github_codespace_info,
20
+ get_github_codespace_name,
21
+ is_github_codespace,
22
+ )
23
+
24
+ USER_HOME = os.path.expanduser("~")
25
+ RECCE_USER_HOME = os.path.join(USER_HOME, ".recce")
26
+ RECCE_USER_PROFILE = os.path.join(RECCE_USER_HOME, "profile.yml")
27
+ RECCE_USER_EVENT_PATH = os.path.join(RECCE_USER_HOME, ".unsend_events.json")
24
28
 
25
29
  __version__ = get_version()
26
30
  _collector = Collector()
@@ -33,13 +37,13 @@ def init():
33
37
 
34
38
  # Amplitude init
35
39
  _collector.set_api_key(api_key)
36
- _collector.set_user_id(user_profile.get('user_id'))
40
+ _collector.set_user_id(user_profile.get("user_id"))
37
41
  _collector.set_unsend_events_file(RECCE_USER_EVENT_PATH)
38
42
 
39
43
  # Sentry init
40
44
  sentry_env = _get_sentry_env()
41
45
  sentry_dns = _get_sentry_dns()
42
- release_version = __version__ if sentry_env != 'development' else None
46
+ release_version = __version__ if sentry_env != "development" else None
43
47
  sentry_sdk.init(
44
48
  dsn=sentry_dns,
45
49
  environment=sentry_env,
@@ -47,58 +51,63 @@ def init():
47
51
  # Set traces_sample_rate to 1.0 to capture 100%
48
52
  # of transactions for performance monitoring.
49
53
  # We recommend adjusting this value in production.
50
- traces_sample_rate=1.0
54
+ traces_sample_rate=1.0,
51
55
  )
52
- sentry_sdk.set_tag('recce.version', __version__)
53
- sentry_sdk.set_tag('platform', sys.platform)
54
- sentry_sdk.set_tag('is_ci_env', is_ci_env())
55
- sentry_sdk.set_tag('is_github_codespace', is_github_codespace())
56
- sentry_sdk.set_tag('system_timezone', get_system_timezone())
56
+ sentry_sdk.set_tag("recce.version", __version__)
57
+ sentry_sdk.set_tag("platform", sys.platform)
58
+ sentry_sdk.set_tag("is_ci_env", is_ci_env())
59
+ sentry_sdk.set_tag("is_github_codespace", is_github_codespace())
60
+ sentry_sdk.set_tag("is_recce_cloud_instance", is_recce_cloud_instance())
61
+ sentry_sdk.set_tag("system_timezone", get_system_timezone())
57
62
 
58
63
 
59
64
  def get_user_id():
60
- return load_user_profile().get('user_id')
65
+ return load_user_profile().get("user_id")
61
66
 
62
67
 
63
68
  def get_recce_api_token():
64
- return load_user_profile().get('api_token')
69
+ return load_user_profile().get("api_token")
70
+
71
+
72
+ def update_recce_api_token(token):
73
+ return update_user_profile({"api_token": token})
65
74
 
66
75
 
67
76
  def is_anonymous_tracking():
68
- return load_user_profile().get('anonymous_tracking', False)
77
+ return load_user_profile().get("anonymous_tracking", False)
69
78
 
70
79
 
71
80
  def _get_sentry_dns():
72
- dns_file = os.path.normpath(os.path.join(os.path.dirname(__file__), 'SENTRY_DNS'))
73
- with open(dns_file) as f:
81
+ dns_file = os.path.normpath(os.path.join(os.path.dirname(__file__), "SENTRY_DNS"))
82
+ with open(dns_file, encoding="utf-8") as f:
74
83
  dns = f.read().strip()
75
84
  return dns
76
85
 
77
86
 
78
87
  def _get_sentry_env():
79
- if '.dev' in __version__:
80
- return 'development'
81
- elif re.match(r'^\d+\.\d+\.\d+\.\d{8}[a|b|rc]?.*$', __version__):
82
- return 'nightly'
83
- elif 'a' in __version__:
84
- return 'alpha'
85
- elif 'b' in __version__:
86
- return 'beta'
87
- elif 'rc' in __version__:
88
- return 'release-candidate'
89
- return 'production'
88
+ if ".dev" in __version__:
89
+ return "development"
90
+ elif re.match(r"^\d+\.\d+\.\d+\.\d{8}[a|b|rc]?.*$", __version__):
91
+ return "nightly"
92
+ elif "a" in __version__:
93
+ return "alpha"
94
+ elif "b" in __version__:
95
+ return "beta"
96
+ elif "rc" in __version__:
97
+ return "release-candidate"
98
+ return "production"
90
99
 
91
100
 
92
101
  def _get_api_key():
93
- if os.getenv('RECCE_EVENT_API_KEY'):
102
+ if os.getenv("RECCE_EVENT_API_KEY"):
94
103
  # For local testing purpose
95
- return os.getenv('RECCE_EVENT_API_KEY')
104
+ return os.getenv("RECCE_EVENT_API_KEY")
96
105
 
97
- config_file = os.path.abspath(os.path.join(os.path.dirname(__file__), 'CONFIG'))
106
+ config_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "CONFIG"))
98
107
  try:
99
- with open(config_file) as fh:
108
+ with open(config_file, encoding="utf-8") as fh:
100
109
  config = pyml.load(fh)
101
- return config.get('event_api_key')
110
+ return config.get("event_api_key")
102
111
  except Exception:
103
112
  return None
104
113
 
@@ -108,15 +117,15 @@ def _generate_user_profile():
108
117
  os.makedirs(RECCE_USER_HOME, exist_ok=True)
109
118
  except Exception:
110
119
  # TODO: should show warning message but not raise exception
111
- print('Please disable command tracking to continue.')
120
+ print("Please disable command tracking to continue.")
112
121
  exit(1)
113
122
  if is_github_codespace() is True:
114
- salted_name = f'codespace-{get_github_codespace_name()}'
123
+ salted_name = f"codespace-{get_github_codespace_name()}"
115
124
  user_id = hashlib.sha256(salted_name.encode()).hexdigest()
116
125
  else:
117
126
  user_id = uuid.uuid4().hex
118
- with open(RECCE_USER_PROFILE, 'w+') as f:
119
- pyml.dump({'user_id': user_id, 'anonymous_tracking': True}, f)
127
+ with open(RECCE_USER_PROFILE, "w+", encoding="utf-8") as f:
128
+ pyml.dump({"user_id": user_id, "anonymous_tracking": True}, f)
120
129
  return dict(user_id=user_id, anonymous_tracking=True)
121
130
 
122
131
 
@@ -125,9 +134,9 @@ def load_user_profile():
125
134
  if not os.path.exists(RECCE_USER_PROFILE):
126
135
  user_profile = _generate_user_profile()
127
136
  else:
128
- with open(RECCE_USER_PROFILE, 'r') as f:
137
+ with open(RECCE_USER_PROFILE, "r", encoding="utf-8") as f:
129
138
  user_profile = pyml.load(f)
130
- if user_profile.get('user_id') is None:
139
+ if user_profile is None or user_profile.get("user_id") is None:
131
140
  user_profile = _generate_user_profile()
132
141
 
133
142
  return user_profile
@@ -136,7 +145,7 @@ def load_user_profile():
136
145
  def update_user_profile(update_values):
137
146
  original = load_user_profile()
138
147
  original.update(update_values)
139
- with open(RECCE_USER_PROFILE, 'w+') as f:
148
+ with open(RECCE_USER_PROFILE, "w+", encoding="utf-8") as f:
140
149
  pyml.dump(original, f)
141
150
  return original
142
151
 
@@ -146,10 +155,10 @@ def flush_events(command=None):
146
155
 
147
156
 
148
157
  def should_log_event():
149
- with open(RECCE_USER_PROFILE, 'r') as f:
158
+ with open(RECCE_USER_PROFILE, "r", encoding="utf-8") as f:
150
159
  user_profile = pyml.load(f)
151
160
  # TODO: default anonymous_tracking to false if field is not present
152
- tracking = user_profile.get('anonymous_tracking', False)
161
+ tracking = user_profile.get("anonymous_tracking", False)
153
162
  tracking = tracking and isinstance(tracking, bool)
154
163
  if not tracking:
155
164
  return False
@@ -166,18 +175,18 @@ def log_event(prop, event_type, **kwargs):
166
175
 
167
176
  repo = hosting_repo()
168
177
  if repo is not None:
169
- prop['repository'] = sha256(repo.encode()).hexdigest()
178
+ prop["repository"] = sha256(repo.encode()).hexdigest()
170
179
 
171
180
  branch = current_branch()
172
181
  if branch is not None:
173
- prop['branch'] = sha256(branch.encode()).hexdigest()
182
+ prop["branch"] = sha256(branch.encode()).hexdigest()
174
183
 
175
184
  runner = get_runner()
176
185
  if runner is not None:
177
- prop['runner_type'] = runner
186
+ prop["runner_type"] = runner
178
187
 
179
- if runner == 'github codespaces':
180
- prop['codespaces_name'] = get_github_codespace_name()
188
+ if runner == "github codespaces":
189
+ prop["codespaces_name"] = get_github_codespace_name()
181
190
 
182
191
  payload = dict(
183
192
  **prop,
@@ -191,11 +200,11 @@ def log_api_event(endpoint_name, prop):
191
200
  **prop,
192
201
  endpoint_name=endpoint_name,
193
202
  )
194
- log_event(prop, 'api_event')
203
+ log_event(prop, "api_event")
195
204
  _collector.schedule_flush()
196
205
 
197
206
 
198
- def log_load_state(command='server', single_env=False):
207
+ def log_load_state(command="server", single_env=False):
199
208
  from recce.models import CheckDAO
200
209
 
201
210
  checks = 0
@@ -213,10 +222,10 @@ def log_load_state(command='server', single_env=False):
213
222
  )
214
223
 
215
224
  if command == "server":
216
- prop['single_env'] = single_env
225
+ prop["single_env"] = single_env
217
226
 
218
- log_event(prop, 'load_state')
219
- if command == 'server':
227
+ log_event(prop, "load_state")
228
+ if command == "server":
220
229
  _collector.schedule_flush()
221
230
 
222
231
 
@@ -227,31 +236,29 @@ def log_codespaces_events(command):
227
236
  return
228
237
 
229
238
  user_prop = dict(
230
- location=codespace.get('location'),
231
- is_prebuild=codespace.get('prebuild', False),
239
+ location=codespace.get("location"),
240
+ is_prebuild=codespace.get("prebuild", False),
232
241
  )
233
242
 
234
243
  prop = dict(
235
- machine=codespace.get('machine', {}).get('display_name'),
244
+ machine=codespace.get("machine", {}).get("display_name"),
236
245
  codespaces_name=get_github_codespace_name(),
237
246
  )
238
247
 
239
248
  # Codespace created event, send once
240
- codespace_created_at = load_user_profile().get('codespace_created_at')
249
+ codespace_created_at = load_user_profile().get("codespace_created_at")
241
250
  if codespace_created_at is None:
242
- created_at = datetime.fromisoformat(codespace.get('created_at'))
243
- prop['state'] = 'created'
244
- _collector.log_event(prop, 'codespace_instance', event_triggered_at=created_at,
245
- user_properties=user_prop)
246
- update_user_profile({'codespace_created_at': codespace.get('created_at')})
251
+ created_at = datetime.fromisoformat(codespace.get("created_at"))
252
+ prop["state"] = "created"
253
+ _collector.log_event(prop, "codespace_instance", event_triggered_at=created_at, user_properties=user_prop)
254
+ update_user_profile({"codespace_created_at": codespace.get("created_at")})
247
255
 
248
256
  # Codespace available event, send multiple times as start/stop it
249
257
  available_at = get_github_codespace_available_at(codespace)
250
- if available_at and available_at.isoformat() != load_user_profile().get('codespace_available_at'):
251
- prop['state'] = 'available'
252
- _collector.log_event(prop, 'codespace_instance', event_triggered_at=available_at,
253
- user_properties=user_prop)
254
- update_user_profile({'codespace_available_at': available_at.isoformat()})
258
+ if available_at and available_at.isoformat() != load_user_profile().get("codespace_available_at"):
259
+ prop["state"] = "available"
260
+ _collector.log_event(prop, "codespace_instance", event_triggered_at=available_at, user_properties=user_prop)
261
+ update_user_profile({"codespace_available_at": available_at.isoformat()})
255
262
 
256
263
  # Codespace instance event should be flushed immediately
257
264
  _collector.send_events()
@@ -259,20 +266,25 @@ def log_codespaces_events(command):
259
266
 
260
267
  def log_single_env_event():
261
268
  prop = dict(
262
- action='launch_server',
269
+ action="launch_server",
263
270
  )
264
- log_event(prop, '[Experiment] single_environment')
271
+ log_event(prop, "[Experiment] single_environment")
265
272
  _collector.schedule_flush()
266
273
 
267
274
 
268
275
  def log_performance(feature_name: str, metrics: Dict):
269
276
  prop = metrics
270
- log_event(prop, f'[Performance] {feature_name}')
277
+ log_event(prop, f"[Performance] {feature_name}")
278
+ _collector.schedule_flush()
279
+
280
+
281
+ def log_connected_to_cloud():
282
+ log_event({"action": "connected_to_cloud"}, "Connect OSS to Cloud")
271
283
  _collector.schedule_flush()
272
284
 
273
285
 
274
286
  def capture_exception(e):
275
- user_id = load_user_profile().get('user_id')
287
+ user_id = load_user_profile().get("user_id")
276
288
  if is_ci_env() is True:
277
289
  user_id = f"{user_id}_CI"
278
290