@mdn/fred 2.2.0 → 2.2.1

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.
Files changed (222) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/components/content-section/server.css +1 -1
  3. package/components/curriculum/layout.css +2 -77
  4. package/components/curriculum/sidebar.css +0 -4
  5. package/components/curriculum/toc.css +1 -3
  6. package/components/curriculum-about/server.js +15 -6
  7. package/components/curriculum-default/server.js +15 -6
  8. package/components/curriculum-module/server.js +15 -6
  9. package/components/curriculum-overview/server.js +15 -36
  10. package/components/generic-layout/server.css +4 -60
  11. package/components/generic-layout/server.js +9 -4
  12. package/components/generic-sidebar/server.css +1 -3
  13. package/components/generic-toc/server.css +0 -3
  14. package/components/homepage-contributor-spotlight/server.css +5 -1
  15. package/components/html/global.css +2 -1
  16. package/components/layout/2-sidebars.css +141 -0
  17. package/components/layout/README.md +52 -10
  18. package/components/layout/global.css +5 -6
  19. package/components/left-sidebar/server.css +2 -12
  20. package/components/page-layout/server.css +1 -1
  21. package/components/play-console/element.css +15 -0
  22. package/components/print/global.css +2 -2
  23. package/components/reference-layout/server.css +2 -80
  24. package/components/reference-layout/server.js +6 -6
  25. package/out/service-worker.js +1 -1
  26. package/out/service-worker.js.map +1 -1
  27. package/out/static/client/{198.edf1fdf142c21fb8.css → 198.f743d603d3fa74b7.css} +2 -2
  28. package/out/static/client/{198.edf1fdf142c21fb8.css.map → 198.f743d603d3fa74b7.css.map} +1 -1
  29. package/out/static/client/270.66bae6059a1c23f9.css +2 -0
  30. package/out/static/client/270.66bae6059a1c23f9.css.map +1 -0
  31. package/out/static/client/5408.a0622390fa1726dc.css +2 -0
  32. package/out/static/client/5408.a0622390fa1726dc.css.map +1 -0
  33. package/out/static/client/6216.91b6560dce4c40eb.js +2 -0
  34. package/out/static/client/6216.91b6560dce4c40eb.js.map +1 -0
  35. package/out/static/client/6760.d97440f1ca6690c6.js +6 -0
  36. package/out/static/client/6760.d97440f1ca6690c6.js.map +1 -0
  37. package/out/static/client/{749.f46b8d04d93e42db.js → 749.15180d605dd9d7e9.js} +2 -2
  38. package/out/static/client/749.15180d605dd9d7e9.js.map +1 -0
  39. package/out/static/client/{index.a66b5a087a738e61.js → index.a845f20de1913b16.js} +3 -3
  40. package/out/static/client/{index.a66b5a087a738e61.js.map → index.a845f20de1913b16.js.map} +1 -1
  41. package/out/static/client/{runtime.149f3caaca6b394a.js → runtime.b11a359ec0a4abb0.js} +2 -2
  42. package/out/static/client/{runtime.149f3caaca6b394a.js.map → runtime.b11a359ec0a4abb0.js.map} +1 -1
  43. package/out/static/client/stats.json +740 -686
  44. package/out/static/client/styles-a11y-menu.7b49a1a7289a65dd.js +1 -0
  45. package/out/static/client/styles-advertising.ee901de4f53dfcfb.js +1 -0
  46. package/out/static/client/styles-article-footer.e9f7514e3e96e55e.js +1 -0
  47. package/out/static/client/styles-banner.d39b1822c276b7a1.js +1 -0
  48. package/out/static/client/styles-baseline-indicator.b0124633d8959185.js +1 -0
  49. package/out/static/client/styles-blog-index.a6463d0111bfa84b.js +1 -0
  50. package/out/static/client/styles-blog-post.226761d5090b01f6.js +1 -0
  51. package/out/static/client/{styles-blog-post.23b8b3e8e0ec1e69.css → styles-blog-post.c03ec8a22f8d4ff6.css} +2 -2
  52. package/out/static/client/{styles-blog-post.23b8b3e8e0ec1e69.css.map → styles-blog-post.c03ec8a22f8d4ff6.css.map} +1 -1
  53. package/out/static/client/styles-breadcrumbs-bar.9539fa2e37251d88.js +1 -0
  54. package/out/static/client/{styles-breadcrumbs-bar.02910e49bb8b2372.css → styles-breadcrumbs-bar.9a51a3c76a6231d0.css} +2 -2
  55. package/out/static/client/{styles-breadcrumbs-bar.02910e49bb8b2372.css.map → styles-breadcrumbs-bar.9a51a3c76a6231d0.css.map} +1 -1
  56. package/out/static/client/styles-breadcrumbs.73650619944b4ea9.js +1 -0
  57. package/out/static/client/styles-button.63c03050fb25b8ce.js +1 -0
  58. package/out/static/client/{styles-content-section.302cd1e445138b77.css → styles-content-section.01ee04d014688a05.css} +2 -2
  59. package/out/static/client/{styles-content-section.302cd1e445138b77.css.map → styles-content-section.01ee04d014688a05.css.map} +1 -1
  60. package/out/static/client/styles-content-section.4ebcf9edf977159a.js +1 -0
  61. package/out/static/client/styles-contributor-spotlight.f585c3be560baa36.js +1 -0
  62. package/out/static/client/styles-curriculum-about.df2a58fdc99668aa.js +1 -0
  63. package/out/static/client/styles-curriculum-default.87a662ae2e005fdc.js +1 -0
  64. package/out/static/client/styles-curriculum-landing.9af582d4a3e0692e.js +1 -0
  65. package/out/static/client/styles-curriculum-module.f87720da3b256bba.js +1 -0
  66. package/out/static/client/styles-curriculum-overview.16cdc5cb80128597.js +1 -0
  67. package/out/static/client/styles-featured-articles.950585abbd167c3f.js +1 -0
  68. package/out/static/client/styles-footer.f49c80542ef1fffb.js +1 -0
  69. package/out/static/client/styles-generic-about.b208cb4d9b62f6c5.js +1 -0
  70. package/out/static/client/styles-generic-community.264a7b11b708e2ae.js +1 -0
  71. package/out/static/client/styles-generic-content.bd4990121f075489.js +1 -0
  72. package/out/static/client/styles-generic-layout.1bc69c25775219ab.css +2 -0
  73. package/out/static/client/styles-generic-layout.1bc69c25775219ab.css.map +1 -0
  74. package/out/static/client/styles-generic-layout.518d8e7529d6d1e8.js +1 -0
  75. package/out/static/client/styles-generic-sidebar.a304a0ae4ff5d9d0.css +2 -0
  76. package/out/static/client/styles-generic-sidebar.a304a0ae4ff5d9d0.css.map +1 -0
  77. package/out/static/client/styles-generic-sidebar.a6ddb6ad375b6dea.js +1 -0
  78. package/out/static/client/styles-generic-toc.25a47b5903329e13.js +1 -0
  79. package/out/static/client/styles-generic-toc.b6981465a649e2b6.css +2 -0
  80. package/out/static/client/styles-generic-toc.b6981465a649e2b6.css.map +1 -0
  81. package/out/static/client/styles-global.b5c1c00652883917.js +1 -0
  82. package/out/static/client/{styles-global.2db431c11b66274e.css → styles-global.d24cf1d2734970c9.css} +2 -2
  83. package/out/static/client/{styles-global.2db431c11b66274e.css.map → styles-global.d24cf1d2734970c9.css.map} +1 -1
  84. package/out/static/client/styles-heading-anchor.a68e3e0eb0044a98.js +1 -0
  85. package/out/static/client/styles-homepage-body.04efe05e01579005.js +1 -0
  86. package/out/static/client/styles-homepage-contributor-spotlight.2bcbb1476c70410c.css +2 -0
  87. package/out/static/client/styles-homepage-contributor-spotlight.2bcbb1476c70410c.css.map +1 -0
  88. package/out/static/client/styles-homepage-contributor-spotlight.2da6fde81ab2e03a.js +1 -0
  89. package/out/static/client/styles-homepage-footer.d85ee198521b0417.js +1 -0
  90. package/out/static/client/styles-homepage-header.5c911fca0afedc7b.js +1 -0
  91. package/out/static/client/styles-homepage-hero.84542c123063331a.js +1 -0
  92. package/out/static/client/styles-homepage.6e3908e268226cfc.js +1 -0
  93. package/out/static/client/styles-latest-news.44b2cf830a3df3ba.js +1 -0
  94. package/out/static/client/styles-left-sidebar.81864a1b1af13cdc.css +2 -0
  95. package/out/static/client/styles-left-sidebar.81864a1b1af13cdc.css.map +1 -0
  96. package/out/static/client/styles-left-sidebar.c2ccc5982e4f4ec0.js +1 -0
  97. package/out/static/client/styles-logo.0e5223b5ca6c5c86.js +1 -0
  98. package/out/static/client/styles-mandala.5c6c0f84ff4bc09b.js +1 -0
  99. package/out/static/client/styles-menu.649d9e554d19dacb.js +1 -0
  100. package/out/static/client/styles-navigation.1bb818a8993b53bb.js +1 -0
  101. package/out/static/client/styles-not-found.5548da6ee760df5e.js +1 -0
  102. package/out/static/client/{styles-observatory-landing.7b47ee0004877825.css → styles-observatory-landing.55565f28f568d9fe.css} +2 -2
  103. package/out/static/client/{styles-observatory-landing.7b47ee0004877825.css.map → styles-observatory-landing.55565f28f568d9fe.css.map} +1 -1
  104. package/out/static/client/styles-observatory-landing.7b756d84bfd1f4a5.js +1 -0
  105. package/out/static/client/{styles-observatory-results.d8a2bea1fbfd4b2b.css → styles-observatory-results.8a6dcd7f335b94cc.css} +2 -2
  106. package/out/static/client/{styles-observatory-results.d8a2bea1fbfd4b2b.css.map → styles-observatory-results.8a6dcd7f335b94cc.css.map} +1 -1
  107. package/out/static/client/styles-observatory-results.a50f31e31fe5ce13.js +1 -0
  108. package/out/static/client/{styles-page-layout.e9b295138adbd4bc.css → styles-page-layout.5a4354f33e894319.css} +2 -2
  109. package/out/static/client/{styles-page-layout.e9b295138adbd4bc.css.map → styles-page-layout.5a4354f33e894319.css.map} +1 -1
  110. package/out/static/client/styles-page-layout.9a6bdcc133e4e481.js +1 -0
  111. package/out/static/client/styles-pagination.5b25c72cc0556f24.js +1 -0
  112. package/out/static/client/styles-playground.090bda8c12a63ec0.js +1 -0
  113. package/out/static/client/styles-recent-contributions.e713ba28ab0b7bc3.js +1 -0
  114. package/out/static/client/styles-reference-layout.e853d0ede90ff6ff.js +1 -0
  115. package/out/static/client/styles-reference-layout.f17861486ef2423f.css +2 -0
  116. package/out/static/client/styles-reference-layout.f17861486ef2423f.css.map +1 -0
  117. package/out/static/client/styles-reference-toc.dcf148c129d92975.js +1 -0
  118. package/out/static/client/styles-sandbox.dcb6dce1120b594d.js +1 -0
  119. package/out/static/client/{styles-site-search.ec3b6780533a8750.css → styles-site-search.3177bb12b1f83bf7.css} +2 -2
  120. package/out/static/client/{styles-site-search.ec3b6780533a8750.css.map → styles-site-search.3177bb12b1f83bf7.css.map} +1 -1
  121. package/out/static/client/styles-site-search.acc899abcd2a7645.js +1 -0
  122. package/out/static/client/styles-social-image.65fa265c06411ba3.js +1 -0
  123. package/out/static/client/styles-translation-banner.261e19907fee981b.js +1 -0
  124. package/out/static/client/styles-writer-toolbar.16afb45c733053cc.js +1 -0
  125. package/out/static/client/styles.298615289719f0aa.js +2 -0
  126. package/out/static/client/styles.298615289719f0aa.js.map +1 -0
  127. package/out/static/legacy/{2569.9f096bac448374bd.js → 2569.39ecdf7fe2d20c17.js} +2 -2
  128. package/out/static/legacy/{2569.9f096bac448374bd.js.map → 2569.39ecdf7fe2d20c17.js.map} +1 -1
  129. package/out/static/legacy/6753.9fefb8415a5a449e.js +27 -0
  130. package/out/static/legacy/6753.9fefb8415a5a449e.js.map +1 -0
  131. package/out/static/legacy/asset-manifest.json +8 -8
  132. package/out/static/legacy/{index.7ddac90f21db9f4e.html → index.5b77e00ea8d6df0b.html} +1 -1
  133. package/out/static/legacy/{index.6c7371784b8345e6.js → index.def60ac10a95218f.js} +3 -3
  134. package/out/static/legacy/{index.6c7371784b8345e6.js.map → index.def60ac10a95218f.js.map} +1 -1
  135. package/out/static/legacy/stats.json +13 -13
  136. package/out/static/legacy/{yari.74e397a2236facc5.js → yari.c9b6c25e48cbb380.js} +4 -4
  137. package/out/static/legacy/yari.c9b6c25e48cbb380.js.map +1 -0
  138. package/out/static/ssr/index.js +78 -37
  139. package/out/static/ssr/index.js.map +1 -1
  140. package/out/static/ssr/stats.json +4 -4
  141. package/package.json +18 -18
  142. package/out/static/client/5408.4bc756c440135b62.css +0 -2
  143. package/out/static/client/5408.4bc756c440135b62.css.map +0 -1
  144. package/out/static/client/6216.1bfd3cf0b0a6c7df.js +0 -2
  145. package/out/static/client/6216.1bfd3cf0b0a6c7df.js.map +0 -1
  146. package/out/static/client/6760.6ac3b2b3affbbe00.js +0 -6
  147. package/out/static/client/6760.6ac3b2b3affbbe00.js.map +0 -1
  148. package/out/static/client/749.f46b8d04d93e42db.js.map +0 -1
  149. package/out/static/client/styles-a11y-menu.b09c6038ee60691b.js +0 -1
  150. package/out/static/client/styles-advertising.8a72634ac33967b3.js +0 -1
  151. package/out/static/client/styles-article-footer.2008e05e900132bf.js +0 -1
  152. package/out/static/client/styles-banner.1588da63ad451f94.js +0 -1
  153. package/out/static/client/styles-baseline-indicator.045ce266c0388ff2.js +0 -1
  154. package/out/static/client/styles-blog-index.af7e5efac0463be9.js +0 -1
  155. package/out/static/client/styles-blog-post.21543a25c5d0c820.js +0 -1
  156. package/out/static/client/styles-breadcrumbs-bar.4e50455c81d9f236.js +0 -1
  157. package/out/static/client/styles-breadcrumbs.3272f39f147fdb26.js +0 -1
  158. package/out/static/client/styles-button.93e42cbce83fe9f8.js +0 -1
  159. package/out/static/client/styles-content-section.b38423c0dca8e3e4.js +0 -1
  160. package/out/static/client/styles-contributor-spotlight.efe854e18205bd6c.js +0 -1
  161. package/out/static/client/styles-curriculum-about.eb719efa09eab2e3.js +0 -1
  162. package/out/static/client/styles-curriculum-default.648a02845551d4a6.js +0 -1
  163. package/out/static/client/styles-curriculum-landing.f3af2ff9b3815ed8.js +0 -1
  164. package/out/static/client/styles-curriculum-module.284687a631bdb6c0.js +0 -1
  165. package/out/static/client/styles-curriculum-overview.81d25abdbb43b369.js +0 -1
  166. package/out/static/client/styles-featured-articles.1390540e6554e233.js +0 -1
  167. package/out/static/client/styles-footer.15153a4030e38f8f.js +0 -1
  168. package/out/static/client/styles-generic-about.f0afaa2db7066430.js +0 -1
  169. package/out/static/client/styles-generic-community.ff945b87102835f8.js +0 -1
  170. package/out/static/client/styles-generic-content.d0e560a0506475b1.js +0 -1
  171. package/out/static/client/styles-generic-layout.42a5e62407bd0066.css +0 -2
  172. package/out/static/client/styles-generic-layout.42a5e62407bd0066.css.map +0 -1
  173. package/out/static/client/styles-generic-layout.ca2cef837e24e7df.js +0 -1
  174. package/out/static/client/styles-generic-sidebar.b2b48d0d08f8bae7.js +0 -1
  175. package/out/static/client/styles-generic-sidebar.db43d8c5c4748aca.css +0 -2
  176. package/out/static/client/styles-generic-sidebar.db43d8c5c4748aca.css.map +0 -1
  177. package/out/static/client/styles-generic-toc.109e07ffeb20bc67.css +0 -2
  178. package/out/static/client/styles-generic-toc.109e07ffeb20bc67.css.map +0 -1
  179. package/out/static/client/styles-generic-toc.e8887bbe84a31d72.js +0 -1
  180. package/out/static/client/styles-global.efc5040b727dfca4.js +0 -1
  181. package/out/static/client/styles-heading-anchor.d7e14184517a1d3e.js +0 -1
  182. package/out/static/client/styles-homepage-body.1196a061fab22906.js +0 -1
  183. package/out/static/client/styles-homepage-contributor-spotlight.09a6993f73166d63.js +0 -1
  184. package/out/static/client/styles-homepage-contributor-spotlight.edc39a3f01eb964e.css +0 -2
  185. package/out/static/client/styles-homepage-contributor-spotlight.edc39a3f01eb964e.css.map +0 -1
  186. package/out/static/client/styles-homepage-footer.472132358e452a8b.js +0 -1
  187. package/out/static/client/styles-homepage-header.e6423ccb0a814f99.js +0 -1
  188. package/out/static/client/styles-homepage-hero.1c106d7a3adb970a.js +0 -1
  189. package/out/static/client/styles-homepage.843ab43d3f720fb6.js +0 -1
  190. package/out/static/client/styles-latest-news.986caae0711fbfe3.js +0 -1
  191. package/out/static/client/styles-left-sidebar.4d5208e5cb72af05.css +0 -2
  192. package/out/static/client/styles-left-sidebar.4d5208e5cb72af05.css.map +0 -1
  193. package/out/static/client/styles-left-sidebar.5a4d56fc21aab182.js +0 -1
  194. package/out/static/client/styles-logo.9cf3aa133bae8020.js +0 -1
  195. package/out/static/client/styles-mandala.b9822fc945abee39.js +0 -1
  196. package/out/static/client/styles-menu.97e048a6ffc666ce.js +0 -1
  197. package/out/static/client/styles-navigation.58a2a0a1f8d4487b.js +0 -1
  198. package/out/static/client/styles-not-found.a5c00a725a178969.js +0 -1
  199. package/out/static/client/styles-observatory-landing.c729a3523c37df23.js +0 -1
  200. package/out/static/client/styles-observatory-results.d4d142541bf683e1.js +0 -1
  201. package/out/static/client/styles-page-layout.baa1dac2402744c9.js +0 -1
  202. package/out/static/client/styles-pagination.04e3a505f4e789a6.js +0 -1
  203. package/out/static/client/styles-playground.7de5e497e2ebfa83.js +0 -1
  204. package/out/static/client/styles-recent-contributions.f1ab270b54c7e8de.js +0 -1
  205. package/out/static/client/styles-reference-layout.2c2d031dc83d605a.css +0 -2
  206. package/out/static/client/styles-reference-layout.2c2d031dc83d605a.css.map +0 -1
  207. package/out/static/client/styles-reference-layout.5c4b832bc9420f51.js +0 -1
  208. package/out/static/client/styles-reference-toc.afd507fb6d5ef895.js +0 -1
  209. package/out/static/client/styles-sandbox.3de7bd2afac30c66.js +0 -1
  210. package/out/static/client/styles-site-search.05f228cb7ac309b2.js +0 -1
  211. package/out/static/client/styles-social-image.dbdccf6b8d9258f2.js +0 -1
  212. package/out/static/client/styles-translation-banner.7698ddb14a70d0e5.js +0 -1
  213. package/out/static/client/styles-writer-toolbar.f161f8bd86e23a2a.js +0 -1
  214. package/out/static/client/styles.a182af71488aad03.js +0 -2
  215. package/out/static/client/styles.a182af71488aad03.js.map +0 -1
  216. package/out/static/legacy/6753.c44647828e8b4816.js +0 -27
  217. package/out/static/legacy/6753.c44647828e8b4816.js.map +0 -1
  218. package/out/static/legacy/yari.74e397a2236facc5.js.map +0 -1
  219. /package/out/static/client/{index.a66b5a087a738e61.js.LICENSE.txt → index.a845f20de1913b16.js.LICENSE.txt} +0 -0
  220. /package/out/static/legacy/{6753.c44647828e8b4816.js.LICENSE.txt → 6753.9fefb8415a5a449e.js.LICENSE.txt} +0 -0
  221. /package/out/static/legacy/{index.6c7371784b8345e6.js.LICENSE.txt → index.def60ac10a95218f.js.LICENSE.txt} +0 -0
  222. /package/out/static/legacy/{yari.74e397a2236facc5.js.LICENSE.txt → yari.c9b6c25e48cbb380.js.LICENSE.txt} +0 -0
@@ -1,4 +1,4 @@
1
- /*! For license information please see index.a66b5a087a738e61.js.LICENSE.txt */
1
+ /*! For license information please see index.a845f20de1913b16.js.LICENSE.txt */
2
2
  export const __rspack_esm_id="8410";export const __rspack_esm_ids=["8410"];export const __webpack_modules__={3971(e,t,n){n.d(t,{A:()=>p});var a=n(97825),o=n(31601),r=n.n(o),s=n(76314),i=n.n(s),l=n(4417),c=n.n(l),d=new n.U(n(70054)),u=i()(r()),m=c()(d);u.push([e.id,`*,:after,:before{box-sizing:border-box}dialog{border:0;padding:0}@media (width > 1006px){dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;font-size:var(--font-size-large);margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}dialog::backdrop{--csstools-light-dark-toggle-dee8eb9e-0:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle-dee8eb9e-0,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}}@media (width <= 1006px){dialog{font-size:var(--font-size-normal);height:100%;margin:0;max-height:100%;max-width:100%;width:100%}}dialog[open]{display:grid;grid-template-areas:"search close" "progress progress" "results results";grid-template-columns:1fr min-content;grid-template-rows:var(--navigation-height) min-content min-content}progress{grid-area:progress;margin:0 1rem .5rem}@media (width <= 1006px){progress{margin-inline:.3rem}}.close{font-size:1.37rem;grid-area:close}@media (width > 1006px){.close{display:none}}form{display:grid;gap:.5rem;grid-area:search;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}@media (width <= 1006px){form{align-self:center;background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;margin-left:.3rem;padding:.5rem}}form:before{background-color:var(--color-border-secondary);content:"";height:1em;-webkit-mask-image:url(${m});mask-image:url(${m});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{grid-area:results;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue);border-color:var(--color-blue-50)}li{border-inline-start:2px solid #0000;list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{background-color:var(--color-background-yellow);color:var(--color-text-primary)}`,""]);let p=(0,a.AH)([u.toString()])},10336(e,t,n){n.d(t,{A:()=>o});var a=n(97825);let o=(0,a.JW)`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M18 6 6 18M6 6l12 12"/></svg>`},98693(e,t,n){var a={"./code-example/element.js":["84352","6703","6203","1861","6475","7065","7517"],"./dropdown/element.js":["58623","2868","4740"],"./live-sample-result/element.js":["47849","6703","3611","6203","5950","4098","1861","5330"],"./observatory-tests-and-scores/element.js":["56538","6407"],"./play-runner/element.js":["63657","6703","5950","4098","4074"],"./search-button/element.js":["23745","3690"],"./survey/element.js":["70134","6703","6203","2105","2283"],"./ix-tab-wrapper/element.js":["49979","2568"],"./placement-sidebar/element.js":["57468","6703","3611","8280","1477","5649","2173"],"./placement-hp-main/element.js":["44394","6703","3611","8280","1477","5649","4759"],"./record-visit/element.js":["55237","5562","3094"],"./toggle-sidebar/element.js":["27486","6203","2415"],"./user-menu/element.js":["7247","6203","2105","7748"],"./interactive-example/element.js":["81505","6703","749","3730","3106","993","6216","2080","640","9515","1356","6203","5950","4098","6760","3047","1861","2448","6475","4419","7065","2568","5338","5722"],"./copy-button/element.js":["38262","6203","6475","4660"],"./observatory-comparison-table/element.js":["50117","9410","2006"],"./sidebar-filter/element.js":["83703","9324"],"./issues-table/element.js":["37511","4204"],"./scrim-inline/element.js":["43602","3611","5183"],"./switch/element.js":["41798","9099"],"./collection-save-button/element.js":["1355","6203","3000","4920"],"./contributor-list/element.js":["23082","9127"],"./button/element.js":["17398","6203","9898"],"./homepage-search/element.js":["27373","7678"],"./modal/element.js":["14903","6203","3000"],"./color-theme/element.js":["55269","2868","544"],"./about-team-member/element.js":["612","8981"],"./content-feedback/element.js":["83818","6203","4891"],"./play-console/element.js":["71787","6760"],"./ix-tab/element.js":["18977","4419","5338"],"./observatory-header-link/element.js":["1879","9410","3676"],"./curriculum-tabs/element.js":["52500","9717"],"./placement-bottom/element.js":["7895","6703","3611","8280","1477","5649","4060"],"./image-history/element.js":["47706","1975"],"./not-found/element.js":["2622","8926","3555"],"./placement-note/element.js":["47764","1477"],"./compat-table-lazy/element.js":["96678","2105","718","251"],"./site-search/element.js":["41425","6203","9578"],"./placement-no/element.js":["13755","8280"],"./play-controller/element.js":["23731","2448"],"./placement-top/element.js":["9951","6703","3611","8280","1477","5649","9204"],"./observatory-form/element.js":["17547","6703","6203","6110","8364"],"./observatory-results/element.js":["13430","6203","9410","2868","6110","2006","7593","3676","4070","3259"],"./about-tabs/element.js":["54842","7047"],"./observatory-human-duration/element.js":["37077","9410","4070"],"./playground/element.js":["93075","6703","749","3730","3106","993","6216","2080","640","9515","6203","5950","4098","6760","3047","2448","3000","7584"],"./ix-tab-panel/element.js":["89854","4419"],"./play-editor/element.js":["63386","749","3730","3106","993","6216","2080","640","9515","5950","3047"],"./themed-image/element.js":["48125","5102"],"./writer-open-editor/element.js":["51310","6203","9967"],"./progress-bar/element.js":["20141","6110"],"./compat-table/element.js":["72301","2105","718"],"./login-button/element.js":["70242","6203","6067"],"./observatory-rescan-button/element.js":["14416","6203","7593","3140"],"./recently-visited/element.js":["95821","5562","5246"],"./language-always-redirect-button/element.js":["77108","8300","5685"],"./language-switcher/element.js":["64786","2868","9099","8926","8300","5667"],"./search-modal/element.js":["97154"],"./writer-reload/element.js":["14925","4366"]};function o(e){if(!n.o(a,e))return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=a[e],o=t[0];return Promise.all(t.slice(1).map(n.e)).then(function(){return n(o)})}o.keys=()=>Object.keys(a),o.id=98693,e.exports=o},70054(e,t,n){e.exports=n.p+"search.5dd31cbeea7d1af9.svg"},51874(){try{let t=document.querySelector(".baseline-indicator");function e(e){e?localStorage.setItem("baseline-indicator","open"):localStorage.removeItem("baseline-indicator")}t instanceof HTMLDetailsElement&&(t.addEventListener("toggle",()=>{e(t.open)}),e(t.open))}catch(e){console.warn("Unable to attach to baseline indicator",e)}},99502(e,t,n){n.d(t,{i7:()=>x,iW:()=>y,tf:()=>l,P0:()=>h,I:()=>d,mR:()=>u,_0:()=>b,Q:()=>w,sR:()=>c,vQ:()=>m,kv:()=>p,Sl:()=>g,g_:()=>f,QD:()=>v});let a=[],o=r("RUNTIME_ENV",!0);function r(e,t,n){try{return!!JSON.parse(i(e,n)||JSON.stringify(t))}catch{return t}}function s(e,t,n){let a=i(e,n),o=a?Number.parseInt(a,10):t;return Number.isNaN(o)?t:o}function i(e,t={}){let{runtime:n}={runtime:!1,...t},r=`FRED_${e}`;return n&&o?(a.push(r),globalThis.process?.env[r]||i(e)):({FRED_RUNTIME_ENV:"true",FRED_PLAYGROUND_LOCAL:"false",FRED_LEGACY:"true"})[r]}let l=i("PLAYGROUND_BASE_HOST",void 0)||"mdnplay.dev",c=r("PLAYGROUND_LOCAL",!1,{runtime:!0}),d=s("PORT",3e3,{runtime:!0});r("OPEN_BROWSER_ON_START",!1,{runtime:!0});let u=s("PLAYGROUND_PORT",3001,{runtime:!0}),m=i("FXA_SIGNIN_URL",void 0)||"/users/fxa/login/authenticate/",p=i("FXA_SIGNOUT_URL",void 0)||"/users/fxa/login/logout/",h=r("GA_ENABLED",!1),g=i("GA_MEASUREMENT_ID",void 0)||"",b=r("GLEAN_ENABLED",!1),f=i("GLEAN_CHANNEL",void 0)||"dev",x=r("GLEAN_DEBUG",!1);r("ROBOTS_GLOBAL_ALLOW",!0);let v=r("WRITER_MODE",!1,{runtime:!0}),y=i("BCD_BASE_URL",void 0)||"https://bcd.developer.mozilla.org",w=i("OBSERVATORY_API_URL",void 0)||"https://observatory-api.mdn.mozilla.net"},36153(){let e=document.querySelector('[aria-controls="navigation__popup"]'),t=document.querySelector(".navigation");e instanceof HTMLElement&&t instanceof HTMLElement&&e.addEventListener("click",()=>{let n=("true"!==t.dataset.open).toString();t.dataset.open=n,e.setAttribute("aria-expanded",n)})},97154(e,t,n){n.r(t),n.d(t,{MDNSearchModal:()=>MDNSearchModal,splitQuery:()=>d});var a=n(31011),o=n(97825),r=n(61822),s=n(23727),i=n(14632),l=n(10336),c=n(3971);let MDNSearchModal=class MDNSearchModal extends(0,r.J)(o.WF){static ssr=!1;static styles=c.A;static properties={_index:{state:!0},_query:{state:!0},_selected:{state:!0},_shiftFocus:{state:!0}};constructor(){super(),this._index=void 0,this._query="",this._selected=0,this._shiftFocus=!1,this._hasEngaged=!1}async _loadIndex(){this._index||(this._index=this._fetchIndex())}async _fetchIndex(){let e=await fetch(`/${this.locale}/search-index.json`),t=await e.json();return{flex:t.map(({title:e,url:t},n)=>({index:n,title:e.toLowerCase(),slugTail:t.split("/").pop()?.toLowerCase()||""})),items:t}}showModal(){this._loadIndex(),this.shadowRoot?.querySelector("dialog")?.showModal(),this.shadowRoot?.querySelector("input")?.select()}_input({inputType:e,target:t}){t instanceof HTMLInputElement&&(this._query=t.value,!this._hasEngaged&&e.startsWith("insert")&&(this._hasEngaged=!0,(0,s.w)(`quick-search-change: ${"insertFromPaste"===e?"paste":"type"}`)))}_keydown(e){switch(e.key){case"ArrowUp":e.preventDefault(),this._select(this._selected-1);break;case"ArrowDown":e.preventDefault(),this._select(this._selected+1);break;case"Enter":{let{ctrlKey:t,shiftKey:n,altKey:a,metaKey:o}=e,r=this._getSelectedItem();r instanceof HTMLElement&&(e.preventDefault(),r.dispatchEvent(new MouseEvent("click",{bubbles:!0,composed:!0,ctrlKey:t,shiftKey:n,altKey:a,metaKey:o})));break}default:return}}_getSelectedItem(){return this.shadowRoot?.querySelector("[data-selected] a")??null}_select(e){let t=(this._queryIndex.value?.length||0)+1,n=e%t;this._selected=n<0?t+e:n,setTimeout(()=>{let e=this._getSelectedItem();e instanceof HTMLElement&&e.scrollIntoView({behavior:"smooth",block:"nearest"})},0)}_submit(e){e.preventDefault();let t=this._getSelectedItem();t instanceof HTMLElement&&t.click()}_focus({target:e}){if(e instanceof HTMLElement){let t=e.closest("[data-result]");if(t instanceof HTMLElement){let e=Number.parseInt(t.dataset.result||"NaN",10);Number.isNaN(e)||(this._selected=e,this._shiftFocus=!0)}else this._shiftFocus=!1}}_globalKeydown(e){let t=e.composedPath()?.[0]||e.target;if(t instanceof HTMLElement&&(["TEXTAREA","INPUT"].includes(t.tagName)||t.isContentEditable))return;let n=globalThis.getSelection()?.toString(),a=e.key,o=e.ctrlKey||e.metaKey,r="/"===a&&!o,i="k"===a&&o&&!e.shiftKey;(r||i)&&(e.preventDefault(),(0,s.w)(`quick-search-open: keyboard -> ${r?"slash":"ctrl-k"}`),this.showModal(),n&&(this._query=n,this._hasEngaged||(this._hasEngaged=!0,(0,s.w)("quick-search-change: selection"))))}_queryIndex=new a.YZ(this,{args:()=>[this._index,this._query],task:async([e,t])=>{if(e&&t){var n,a;let o,r;return n=t,a=await e,o=n.toLowerCase().trim(),r=d(n),a.flex.filter(({title:e})=>r.every(t=>e.includes(t))).map(({index:e,title:t,slugTail:n})=>[Number([t,n].includes(o)),e]).sort(([e],[t])=>t-e).map(([e,t])=>t).slice(0,10).map(e=>e&&(a.items||[])[e]).filter(Boolean)}}});_close(){this.shadowRoot?.querySelector("dialog")?.close()}connectedCallback(){super.connectedCallback(),this._globalKeydown=this._globalKeydown.bind(this),document.addEventListener("keydown",this._globalKeydown),this._loadIndex=this._loadIndex.bind(this),this.renderRoot.addEventListener("mouseover",this._loadIndex)}disconnectedCallback(){super.disconnectedCallback(),this.renderRoot.removeEventListener("mouseover",this._loadIndex),document.removeEventListener("keydown",this._globalKeydown)}_renderLoadingSearchIndex(){return(0,o.qy)`<progress
3
3
  aria-label=${this.l10n`Loading search index…`}
4
4
  ></progress>`}render(){let e=this._queryIndex.value?.length||0,t=this._query?`/${this.locale}/search?${new URLSearchParams({q:this._query})}`:null;return(0,o.qy)`
@@ -425,5 +425,5 @@ writer-reload-polling = Analyse toutes les { $seconds }s
425
425
  `,ru:`blog-toc-title = В этой статье
426
426
  `,"zh-CN":`blog-toc-title = 在本文中
427
427
  `,"zh-TW":`blog-toc-title = 在本文中
428
- `},l=["i","strong","br","em"],c=["title","aria-label"];let Fluent=class Fluent{constructor(e="en-US",t=[]){this.locale=e,this.usBundle=Fluent.constructBundle(new a.Np(e,{useIsolating:!1}),[s]),t.length>0&&(this.bundle=Fluent.constructBundle(new a.Np(e,{useIsolating:!1}),[s,...t]))}static constructBundle(e,t=[]){for(let n of t){let t=e.addResource(new a.B$(n),{allowOverrides:!0});t.length>0&&console.error(t)}return e}get(e,t,n,a){let o=this.getMessage(e,t,n);if(o)return Fluent.sanitize(o,a)}static sanitize(e,t={}){let n={};for(let e of Object.values(t))n[e.tag]=[...Object.keys(e).filter(e=>"tag"!==e),...c];let a=[...Object.values(t).map(e=>e.tag),...l],s=!0,i=o(e,{allowedAttributes:n,allowedTags:a,allowedSchemes:["http","https","mailto"],filter(e){let n=e.attrs["data-l10n-name"];if(n)for(let[a,o]of Object.entries(t[n]||{}))e.attrs[a]=o;return!!(l.includes(e.tag)||n&&Object.keys(t).includes(n)&&t[n]?.tag===e.tag)&&(s=!1,!0)}},!0);return s?i:(0,r._)(i)}getMessage(e,t,n={},a=this.bundle,o=!1){let r,s=a?a.getMessage(e):void 0;if("qa"===this.locale)return`[${e}${t?`.${t}`:""}]`;if(!s){if(o)return;return this.getMessage(e,t,n,this.usBundle,!0)}if(t){if(!(r=s.attributes[t])){if(o)return;return this.getMessage(e,t,n,this.usBundle,!0)}}else s.value&&(r=s.value);if(!r||!a)return"";let i=[],l=a?.formatPattern(r,n,i);return i.length>0&&console.error(i),l}};let d=new Map;function u(e){if(e){if(!d.has(e)){let t=i[e],n=new Fluent(e,t?[t]:void 0);d.set(e,n)}return d.get(e)}}let m=e=>class extends e{constructor(...e){let t,n;super(...e);let a=(t=globalThis.__MDNServerContext?.getStore(),n=globalThis.__MDNClientContext,t||n);this.locale=a.locale,this.l10n=function(e){function t(t,n){if("string"==typeof t){let n=u(e)?.get(t),a=`[${t}]`,o=e=>{let t=e[0];return n||t||a};return o.toString=()=>"string"==typeof n&&n||a,o}return t[0]||""}return t.raw=function({id:t,attr:n,args:a,elements:o}){let r=u(e);return r?r.get(t,n,a,o):`[${t}]`},t}(this.locale)}}},95831(){globalThis.__MDNClientContext={locale:globalThis.location.pathname.split("/")[1]||"en-US"}},23727(e,t,n){n.d(t,{w:()=>o});var a=n(34388);function o(e){a.A.recordElementClick({id:e,url:globalThis.location.href,referrer:document.referrer,title:document.title})}},14632(e,t,n){n.d(t,{o:()=>a});function a(e,t){let n=e.replaceAll("_"," ").split("/").filter(e=>!["",t,"docs"].includes(e));return(n=n.map(e=>"API"===e?"Web APIs":e)).length>1&&"Web"===n.at(0)&&n.splice(0,1),n.length>1&&n.splice(-1,1),n.join(" / ")}},86372(e,t,n){n.d(t,{G:()=>a});function a(e){return(e||document.cookie).split("; ").includes("moz-1st-party-data-opt-out=true")}}};import{__webpack_require__ as e}from"./runtime.149f3caaca6b394a.js";import*as t from"./1111.53dba753dc3eb961.js";e.C(t);import*as n from"./8903.ce3ee42276c345b9.js";e.C(n);import*as a from"./index.a66b5a087a738e61.js";e.C(a),e(e.s=33779);
429
- //# sourceMappingURL=index.a66b5a087a738e61.js.map
428
+ `},l=["i","strong","br","em"],c=["title","aria-label"];let Fluent=class Fluent{constructor(e="en-US",t=[]){this.locale=e,this.usBundle=Fluent.constructBundle(new a.Np(e,{useIsolating:!1}),[s]),t.length>0&&(this.bundle=Fluent.constructBundle(new a.Np(e,{useIsolating:!1}),[s,...t]))}static constructBundle(e,t=[]){for(let n of t){let t=e.addResource(new a.B$(n),{allowOverrides:!0});t.length>0&&console.error(t)}return e}get(e,t,n,a){let o=this.getMessage(e,t,n);if(o)return Fluent.sanitize(o,a)}static sanitize(e,t={}){let n={};for(let e of Object.values(t))n[e.tag]=[...Object.keys(e).filter(e=>"tag"!==e),...c];let a=[...Object.values(t).map(e=>e.tag),...l],s=!0,i=o(e,{allowedAttributes:n,allowedTags:a,allowedSchemes:["http","https","mailto"],filter(e){let n=e.attrs["data-l10n-name"];if(n)for(let[a,o]of Object.entries(t[n]||{}))e.attrs[a]=o;return!!(l.includes(e.tag)||n&&Object.keys(t).includes(n)&&t[n]?.tag===e.tag)&&(s=!1,!0)}},!0);return s?i:(0,r._)(i)}getMessage(e,t,n={},a=this.bundle,o=!1){let r,s=a?a.getMessage(e):void 0;if("qa"===this.locale)return`[${e}${t?`.${t}`:""}]`;if(!s){if(o)return;return this.getMessage(e,t,n,this.usBundle,!0)}if(t){if(!(r=s.attributes[t])){if(o)return;return this.getMessage(e,t,n,this.usBundle,!0)}}else s.value&&(r=s.value);if(!r||!a)return"";let i=[],l=a?.formatPattern(r,n,i);return i.length>0&&console.error(i),l}};let d=new Map;function u(e){if(e){if(!d.has(e)){let t=i[e],n=new Fluent(e,t?[t]:void 0);d.set(e,n)}return d.get(e)}}let m=e=>class extends e{constructor(...e){let t,n;super(...e);let a=(t=globalThis.__MDNServerContext?.getStore(),n=globalThis.__MDNClientContext,t||n);this.locale=a.locale,this.l10n=function(e){function t(t,n){if("string"==typeof t){let n=u(e)?.get(t),a=`[${t}]`,o=e=>{let t=e[0];return n||t||a};return o.toString=()=>"string"==typeof n&&n||a,o}return t[0]||""}return t.raw=function({id:t,attr:n,args:a,elements:o}){let r=u(e);return r?r.get(t,n,a,o):`[${t}]`},t}(this.locale)}}},95831(){globalThis.__MDNClientContext={locale:globalThis.location.pathname.split("/")[1]||"en-US"}},23727(e,t,n){n.d(t,{w:()=>o});var a=n(34388);function o(e){a.A.recordElementClick({id:e,url:globalThis.location.href,referrer:document.referrer,title:document.title})}},14632(e,t,n){n.d(t,{o:()=>a});function a(e,t){let n=e.replaceAll("_"," ").split("/").filter(e=>!["",t,"docs"].includes(e));return(n=n.map(e=>"API"===e?"Web APIs":e)).length>1&&"Web"===n.at(0)&&n.splice(0,1),n.length>1&&n.splice(-1,1),n.join(" / ")}},86372(e,t,n){n.d(t,{G:()=>a});function a(e){return(e||document.cookie).split("; ").includes("moz-1st-party-data-opt-out=true")}}};import{__webpack_require__ as e}from"./runtime.b11a359ec0a4abb0.js";import*as t from"./1111.53dba753dc3eb961.js";e.C(t);import*as n from"./8903.ce3ee42276c345b9.js";e.C(n);import*as a from"./index.a845f20de1913b16.js";e.C(a),e(e.s=33779);
429
+ //# sourceMappingURL=index.a845f20de1913b16.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.a66b5a087a738e61.js","sources":["webpack://@mdn/fred/./components/search-modal/element.css","webpack://@mdn/fred/./components/icon/cancel.svg","webpack://@mdn/fred/./components|lazy|/^\\.\\/.*\\/element\\.js$/|groupOptions: {}|strict namespace object","webpack://@mdn/fred/./components/baseline-indicator/hook.js","webpack://@mdn/fred/./components/env/runtime.js","webpack://@mdn/fred/./components/env/utils.js","webpack://@mdn/fred/./components/env/index.js","webpack://@mdn/fred/./components/navigation/hook.js","webpack://@mdn/fred/./components/search-modal/element.js","webpack://@mdn/fred/./components/user/context.js","webpack://@mdn/fred/./hooks/code-examples.js","webpack://@mdn/fred/./hooks/dialog-closedby.js","webpack://@mdn/fred/./utils/dnt-helper.js","webpack://@mdn/fred/./hooks/ga-init.js","webpack://@mdn/fred/./hooks/glean-init.js","webpack://@mdn/fred/./hooks/live-samples.js","webpack://@mdn/fred/./hooks/load-elements.js","webpack://@mdn/fred/./hooks/sidebar-scroll-to-current.js","webpack://@mdn/fred/./hooks/skip-to-search.js","webpack://@mdn/fred/./hooks/toc-highlight.js","webpack://@mdn/fred/./hooks/user-ping.js","webpack://@mdn/fred/./l10n/en-US.ftl","webpack://@mdn/fred/./l10n/fluent.js","webpack://@mdn/fred/./l10n/de.ftl","webpack://@mdn/fred/./l10n/es.ftl","webpack://@mdn/fred/./l10n/fr.ftl","webpack://@mdn/fred/./l10n/ja.ftl","webpack://@mdn/fred/./l10n/ko.ftl","webpack://@mdn/fred/./l10n/pt-BR.ftl","webpack://@mdn/fred/./l10n/ru.ftl","webpack://@mdn/fred/./l10n/zh-CN.ftl","webpack://@mdn/fred/./l10n/zh-TW.ftl","webpack://@mdn/fred/./l10n/mixin.js","webpack://@mdn/fred/./symmetric-context/both.js","webpack://@mdn/fred/./symmetric-context/client.js","webpack://@mdn/fred/./utils/glean.js","webpack://@mdn/fred/./utils/mdn-url2breadcrumb.js","webpack://@mdn/fred/./utils/telemetry-opt-out.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/search.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*,:after,:before{box-sizing:border-box}dialog{border:0;padding:0}@media (width > 1006px){dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;font-size:var(--font-size-large);margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}dialog::backdrop{--csstools-light-dark-toggle-dee8eb9e-0:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle-dee8eb9e-0,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}}@media (width <= 1006px){dialog{font-size:var(--font-size-normal);height:100%;margin:0;max-height:100%;max-width:100%;width:100%}}dialog[open]{display:grid;grid-template-areas:\"search close\" \"progress progress\" \"results results\";grid-template-columns:1fr min-content;grid-template-rows:var(--navigation-height) min-content min-content}progress{grid-area:progress;margin:0 1rem .5rem}@media (width <= 1006px){progress{margin-inline:.3rem}}.close{font-size:1.37rem;grid-area:close}@media (width > 1006px){.close{display:none}}form{display:grid;gap:.5rem;grid-area:search;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}@media (width <= 1006px){form{align-self:center;background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;margin-left:.3rem;padding:.5rem}}form:before{background-color:var(--color-border-secondary);content:\"\";height:1em;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{grid-area:results;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue);border-color:var(--color-blue-50)}li{border-inline-start:2px solid #0000;list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{background-color:var(--color-background-yellow);color:var(--color-text-primary)}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>`;","var map = {\n \"./code-example/element.js\": [\n \"84352\",\n \"6703\",\n \"6203\",\n \"1861\",\n \"6475\",\n \"7065\",\n \"7517\"\n ],\n \"./dropdown/element.js\": [\n \"58623\",\n \"2868\",\n \"4740\"\n ],\n \"./live-sample-result/element.js\": [\n \"47849\",\n \"6703\",\n \"3611\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"1861\",\n \"5330\"\n ],\n \"./observatory-tests-and-scores/element.js\": [\n \"56538\",\n \"6407\"\n ],\n \"./play-runner/element.js\": [\n \"63657\",\n \"6703\",\n \"5950\",\n \"4098\",\n \"4074\"\n ],\n \"./search-button/element.js\": [\n \"23745\",\n \"3690\"\n ],\n \"./survey/element.js\": [\n \"70134\",\n \"6703\",\n \"6203\",\n \"2105\",\n \"2283\"\n ],\n \"./ix-tab-wrapper/element.js\": [\n \"49979\",\n \"2568\"\n ],\n \"./placement-sidebar/element.js\": [\n \"57468\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"2173\"\n ],\n \"./placement-hp-main/element.js\": [\n \"44394\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"4759\"\n ],\n \"./record-visit/element.js\": [\n \"55237\",\n \"5562\",\n \"3094\"\n ],\n \"./toggle-sidebar/element.js\": [\n \"27486\",\n \"6203\",\n \"2415\"\n ],\n \"./user-menu/element.js\": [\n \"7247\",\n \"6203\",\n \"2105\",\n \"7748\"\n ],\n \"./interactive-example/element.js\": [\n \"81505\",\n \"6703\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"1356\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"6760\",\n \"3047\",\n \"1861\",\n \"2448\",\n \"6475\",\n \"4419\",\n \"7065\",\n \"2568\",\n \"5338\",\n \"5722\"\n ],\n \"./copy-button/element.js\": [\n \"38262\",\n \"6203\",\n \"6475\",\n \"4660\"\n ],\n \"./observatory-comparison-table/element.js\": [\n \"50117\",\n \"9410\",\n \"2006\"\n ],\n \"./sidebar-filter/element.js\": [\n \"83703\",\n \"9324\"\n ],\n \"./issues-table/element.js\": [\n \"37511\",\n \"4204\"\n ],\n \"./scrim-inline/element.js\": [\n \"43602\",\n \"3611\",\n \"5183\"\n ],\n \"./switch/element.js\": [\n \"41798\",\n \"9099\"\n ],\n \"./collection-save-button/element.js\": [\n \"1355\",\n \"6203\",\n \"3000\",\n \"4920\"\n ],\n \"./contributor-list/element.js\": [\n \"23082\",\n \"9127\"\n ],\n \"./button/element.js\": [\n \"17398\",\n \"6203\",\n \"9898\"\n ],\n \"./homepage-search/element.js\": [\n \"27373\",\n \"7678\"\n ],\n \"./modal/element.js\": [\n \"14903\",\n \"6203\",\n \"3000\"\n ],\n \"./color-theme/element.js\": [\n \"55269\",\n \"2868\",\n \"544\"\n ],\n \"./about-team-member/element.js\": [\n \"612\",\n \"8981\"\n ],\n \"./content-feedback/element.js\": [\n \"83818\",\n \"6203\",\n \"4891\"\n ],\n \"./play-console/element.js\": [\n \"71787\",\n \"6760\"\n ],\n \"./ix-tab/element.js\": [\n \"18977\",\n \"4419\",\n \"5338\"\n ],\n \"./observatory-header-link/element.js\": [\n \"1879\",\n \"9410\",\n \"3676\"\n ],\n \"./curriculum-tabs/element.js\": [\n \"52500\",\n \"9717\"\n ],\n \"./placement-bottom/element.js\": [\n \"7895\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"4060\"\n ],\n \"./image-history/element.js\": [\n \"47706\",\n \"1975\"\n ],\n \"./not-found/element.js\": [\n \"2622\",\n \"8926\",\n \"3555\"\n ],\n \"./placement-note/element.js\": [\n \"47764\",\n \"1477\"\n ],\n \"./compat-table-lazy/element.js\": [\n \"96678\",\n \"2105\",\n \"718\",\n \"251\"\n ],\n \"./site-search/element.js\": [\n \"41425\",\n \"6203\",\n \"9578\"\n ],\n \"./placement-no/element.js\": [\n \"13755\",\n \"8280\"\n ],\n \"./play-controller/element.js\": [\n \"23731\",\n \"2448\"\n ],\n \"./placement-top/element.js\": [\n \"9951\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"9204\"\n ],\n \"./observatory-form/element.js\": [\n \"17547\",\n \"6703\",\n \"6203\",\n \"6110\",\n \"8364\"\n ],\n \"./observatory-results/element.js\": [\n \"13430\",\n \"6203\",\n \"9410\",\n \"2868\",\n \"6110\",\n \"2006\",\n \"7593\",\n \"3676\",\n \"4070\",\n \"3259\"\n ],\n \"./about-tabs/element.js\": [\n \"54842\",\n \"7047\"\n ],\n \"./observatory-human-duration/element.js\": [\n \"37077\",\n \"9410\",\n \"4070\"\n ],\n \"./playground/element.js\": [\n \"93075\",\n \"6703\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"6760\",\n \"3047\",\n \"2448\",\n \"3000\",\n \"7584\"\n ],\n \"./ix-tab-panel/element.js\": [\n \"89854\",\n \"4419\"\n ],\n \"./play-editor/element.js\": [\n \"63386\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"5950\",\n \"3047\"\n ],\n \"./themed-image/element.js\": [\n \"48125\",\n \"5102\"\n ],\n \"./writer-open-editor/element.js\": [\n \"51310\",\n \"6203\",\n \"9967\"\n ],\n \"./progress-bar/element.js\": [\n \"20141\",\n \"6110\"\n ],\n \"./compat-table/element.js\": [\n \"72301\",\n \"2105\",\n \"718\"\n ],\n \"./login-button/element.js\": [\n \"70242\",\n \"6203\",\n \"6067\"\n ],\n \"./observatory-rescan-button/element.js\": [\n \"14416\",\n \"6203\",\n \"7593\",\n \"3140\"\n ],\n \"./recently-visited/element.js\": [\n \"95821\",\n \"5562\",\n \"5246\"\n ],\n \"./language-always-redirect-button/element.js\": [\n \"77108\",\n \"8300\",\n \"5685\"\n ],\n \"./language-switcher/element.js\": [\n \"64786\",\n \"2868\",\n \"9099\",\n \"8926\",\n \"8300\",\n \"5667\"\n ],\n \"./search-modal/element.js\": [\n \"97154\"\n ],\n \"./writer-reload/element.js\": [\n \"14925\",\n \"4366\"\n ]\n};\nfunction __rspack_async_context(req) {\n if(!__webpack_require__.o(map, req)) {\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n }\n\n var ids = map[req], id = ids[0];\n return Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n return __webpack_require__(id);\n });\n}\n\n__rspack_async_context.keys = () => (Object.keys(map));\n__rspack_async_context.id = 98693;\nmodule.exports = __rspack_async_context;\n","try {\n const indicator = document.querySelector(\".baseline-indicator\");\n if (indicator instanceof HTMLDetailsElement) {\n indicator.addEventListener(\"toggle\", () => {\n saveState(indicator.open);\n });\n saveState(indicator.open);\n }\n\n /**\n * @param {boolean} open\n */\n function saveState(open) {\n if (open) {\n localStorage.setItem(\"baseline-indicator\", \"open\");\n } else {\n localStorage.removeItem(\"baseline-indicator\");\n }\n }\n} catch (error) {\n console.warn(\"Unable to attach to baseline indicator\", error);\n}\n","import { parseBool } from \"./utils.js\";\n\n/** @type {string[]} */\nexport const runtimeVariables = [];\n/** Overriden to prod default (false) in rspack config, set to true so it works in dev server by default. */\nexport const RUNTIME_ENV = parseBool(\"RUNTIME_ENV\", true);\n","import { RUNTIME_ENV, runtimeVariables } from \"./runtime.js\";\n\n/**\n * @typedef {object} Options\n * @property {boolean} [runtime] Allow setting this value at runtime\n */\n\n/**\n * @param {string} name\n * @param {boolean} fallback\n * @param {Options} [options]\n */\nexport function parseBool(name, fallback, options) {\n try {\n return Boolean(\n JSON.parse(getEnv(name, options) || JSON.stringify(fallback)),\n );\n } catch {\n return fallback;\n }\n}\n\n/**\n * @param {string} name\n * @param {number} fallback\n * @param {Options} [options]\n */\nexport function parseInt(name, fallback, options) {\n const stringValue = getEnv(name, options);\n const numberValue = stringValue ? Number.parseInt(stringValue, 10) : fallback;\n return Number.isNaN(numberValue) ? fallback : numberValue;\n}\n\n/**\n * @param {string} name\n * @param {string} fallback\n * @param {Options} [options]\n */\nexport function parseString(name, fallback, options) {\n return getEnv(name, options) || fallback;\n}\n\n/**\n * @param {string} name\n * @param {Options} [options]\n * @returns {string | undefined}\n */\nfunction getEnv(name, options = {}) {\n const { runtime } = { runtime: false, ...options };\n const fullName = `FRED_${name}`;\n if (runtime && RUNTIME_ENV) {\n runtimeVariables.push(fullName);\n // safely navigate if process is not defined\n return globalThis.process?.env[fullName] || getEnv(name);\n }\n return globalThis.__MDNEnv?.[fullName];\n}\n","import { parseBool, parseInt, parseString } from \"./utils.js\";\n\nexport const PLAYGROUND_BASE_HOST = parseString(\n \"PLAYGROUND_BASE_HOST\",\n \"mdnplay.dev\",\n);\nexport const PLAYGROUND_LOCAL = parseBool(\"PLAYGROUND_LOCAL\", false, {\n runtime: true,\n});\nexport const PORT = parseInt(\"PORT\", 3000, { runtime: true });\nexport const OPEN_BROWSER_ON_START = parseBool(\"OPEN_BROWSER_ON_START\", false, {\n runtime: true,\n});\nexport const PLAYGROUND_PORT = parseInt(\"PLAYGROUND_PORT\", 3001, {\n runtime: true,\n});\n\nexport const FXA_SIGNIN_URL = parseString(\n \"FXA_SIGNIN_URL\",\n \"/users/fxa/login/authenticate/\",\n);\nexport const FXA_SIGNOUT_URL = parseString(\n \"FXA_SIGNOUT_URL\",\n \"/users/fxa/login/logout/\",\n);\n\nexport const GA_ENABLED = parseBool(\"GA_ENABLED\", false);\nexport const GA_MEASUREMENT_ID = parseString(\"GA_MEASUREMENT_ID\", \"\");\n\n/** Set to non-prod default, because we don't want glean to run without explicitly enabling. */\nexport const GLEAN_ENABLED = parseBool(\"GLEAN_ENABLED\", false);\n/** Set to non-prod default, because we don't want glean to run without explicitly enabling. */\nexport const GLEAN_CHANNEL = parseString(\"GLEAN_CHANNEL\", \"dev\");\nexport const GLEAN_DEBUG = parseBool(\"GLEAN_DEBUG\", false);\n\n/**\n * While there is a risk from not including the `noindex` meta tag on stage etc, we have a\n * `robots.txt` in place, and the effect of accidentally including it on prod is far worse:\n * so this must be the prod default.\n */\nexport const ROBOTS_GLOBAL_ALLOW = parseBool(\"ROBOTS_GLOBAL_ALLOW\", true);\n\nexport const WRITER_MODE = parseBool(\"WRITER_MODE\", false, { runtime: true });\n\nexport const BCD_BASE_URL = parseString(\n \"BCD_BASE_URL\",\n \"https://bcd.developer.mozilla.org\",\n);\n\nexport const OBSERVATORY_API_URL = parseString(\n \"OBSERVATORY_API_URL\",\n \"https://observatory-api.mdn.mozilla.net\",\n);\n","const button = document.querySelector(`[aria-controls=\"navigation__popup\"]`);\nconst navigation = document.querySelector(\".navigation\");\nif (button instanceof HTMLElement && navigation instanceof HTMLElement) {\n button.addEventListener(\"click\", () => {\n const open = (!(navigation.dataset.open === \"true\")).toString();\n navigation.dataset.open = open;\n button.setAttribute(\"aria-expanded\", open);\n });\n}\n","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\n\nimport { gleanClick } from \"../../utils/glean.js\";\nimport { mdnUrl2Breadcrumb } from \"../../utils/mdn-url2breadcrumb.js\";\n\nimport exitIcon from \"../icon/cancel.svg?lit\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNSearchModal extends L10nMixin(LitElement) {\n static ssr = false;\n static styles = styles;\n\n static properties = {\n _index: { state: true },\n _query: { state: true },\n _selected: { state: true },\n _shiftFocus: { state: true },\n };\n\n constructor() {\n super();\n /** @type {Promise<import(\"./types.js\").SearchIndex> | undefined} */\n this._index = undefined;\n this._query = \"\";\n this._selected = 0;\n this._shiftFocus = false;\n /** Capture whether user has engaged with the search. */\n this._hasEngaged = false;\n }\n\n async _loadIndex() {\n if (this._index) {\n return;\n }\n\n this._index = this._fetchIndex();\n }\n\n async _fetchIndex() {\n const res = await fetch(`/${this.locale}/search-index.json`);\n /** @type {import(\"./types.js\").SearchIndexItem[]} */\n const items = await res.json();\n /** @type {import(\"./types.js\").SearchIndexFlexItem[]} */\n const flex = items.map(({ title, url }, index) => ({\n index,\n title: title.toLowerCase(),\n slugTail: url.split(\"/\").pop()?.toLowerCase() || \"\",\n }));\n\n return {\n flex,\n items,\n };\n }\n\n showModal() {\n this._loadIndex();\n this.shadowRoot?.querySelector(\"dialog\")?.showModal();\n this.shadowRoot?.querySelector(\"input\")?.select();\n }\n\n /** @param {InputEvent} event */\n _input({ inputType, target }) {\n if (target instanceof HTMLInputElement) {\n this._query = target.value;\n if (!this._hasEngaged && inputType.startsWith(\"insert\")) {\n this._hasEngaged = true;\n gleanClick(\n `quick-search-change: ${inputType === \"insertFromPaste\" ? \"paste\" : \"type\"}`,\n );\n }\n }\n }\n\n /** @param {KeyboardEvent} event */\n _keydown(event) {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n this._select(this._selected - 1);\n break;\n }\n case \"ArrowDown\":\n event.preventDefault();\n this._select(this._selected + 1);\n break;\n\n case \"Enter\": {\n const { ctrlKey, shiftKey, altKey, metaKey } = event;\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n event.preventDefault();\n item.dispatchEvent(\n new MouseEvent(\"click\", {\n bubbles: true,\n composed: true,\n // we attempt to pass modifier keys through\n // but browser support is incredibly varied:\n ctrlKey,\n shiftKey,\n altKey,\n metaKey,\n }),\n );\n }\n break;\n }\n\n default:\n return;\n }\n }\n\n /** @returns {HTMLElement|null} */\n _getSelectedItem() {\n return this.shadowRoot?.querySelector(\"[data-selected] a\") ?? null;\n }\n\n /** @param {number} index */\n _select(index) {\n const results = (this._queryIndex.value?.length || 0) + 1;\n const value = index % results;\n this._selected = value < 0 ? results + index : value;\n setTimeout(() => {\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, 0);\n }\n\n /** @param {SubmitEvent} event */\n _submit(event) {\n event.preventDefault();\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.click();\n }\n }\n\n /** @param {FocusEvent} event */\n _focus({ target }) {\n if (target instanceof HTMLElement) {\n const focused = target.closest(\"[data-result]\");\n if (focused instanceof HTMLElement) {\n const index = Number.parseInt(focused.dataset.result || \"NaN\", 10);\n if (!Number.isNaN(index)) {\n this._selected = index;\n this._shiftFocus = true;\n }\n } else {\n this._shiftFocus = false;\n }\n }\n }\n\n /** @param {KeyboardEvent} event */\n _globalKeydown(event) {\n const target = event.composedPath()?.[0] || event.target;\n const isTextField =\n target instanceof HTMLElement &&\n ([\"TEXTAREA\", \"INPUT\"].includes(target.tagName) ||\n target.isContentEditable);\n\n if (isTextField) {\n return;\n }\n\n const selection = globalThis.getSelection()?.toString();\n const keyPressed = event.key;\n const ctrlOrMetaPressed = event.ctrlKey || event.metaKey;\n const isSlash = keyPressed === \"/\" && !ctrlOrMetaPressed;\n const isCtrlK = keyPressed === \"k\" && ctrlOrMetaPressed && !event.shiftKey;\n\n if (isSlash || isCtrlK) {\n event.preventDefault();\n gleanClick(\n `quick-search-open: keyboard -> ${isSlash ? \"slash\" : \"ctrl-k\"}`,\n );\n this.showModal();\n if (selection) {\n this._query = selection;\n if (!this._hasEngaged) {\n this._hasEngaged = true;\n gleanClick(\"quick-search-change: selection\");\n }\n }\n }\n }\n\n _queryIndex = new Task(this, {\n args: () => [this._index, this._query],\n task: async ([index, query]) => {\n if (!index || !query) {\n return;\n }\n return quickSearch(query, await index);\n },\n });\n\n _close() {\n this.shadowRoot?.querySelector(\"dialog\")?.close();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._globalKeydown = this._globalKeydown.bind(this);\n document.addEventListener(\"keydown\", this._globalKeydown);\n this._loadIndex = this._loadIndex.bind(this);\n this.renderRoot.addEventListener(\"mouseover\", this._loadIndex);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.renderRoot.removeEventListener(\"mouseover\", this._loadIndex);\n document.removeEventListener(\"keydown\", this._globalKeydown);\n }\n\n _renderLoadingSearchIndex() {\n return html`<progress\n aria-label=${this.l10n`Loading search index…`}\n ></progress>`;\n }\n\n render() {\n const siteSearchIndex = this._queryIndex.value?.length || 0;\n const searchUrl = this._query\n ? `/${this.locale}/search?${new URLSearchParams({ q: this._query })}`\n : null;\n return html`\n <dialog @keydown=${this._keydown} @focusin=${this._focus} closedby=\"any\">\n <form\n method=\"get\"\n action=${`/${this.locale}/search`}\n @submit=${this._submit}\n >\n <input\n type=\"search\"\n name=\"q\"\n .value=${this._query}\n autocomplete=\"off\"\n autofocus\n @input=${this._input}\n placeholder=${this.l10n`Search`}\n aria-label=${this.l10n`Search`}\n />\n </form>\n <mdn-button\n class=\"close\"\n variant=\"plain\"\n icon-only\n .icon=${exitIcon}\n @click=${this._close}\n >${this.l10n`Exit search`}</mdn-button\n >\n ${this._queryIndex.render({\n initial: this._renderLoadingSearchIndex.bind(this),\n pending: this._renderLoadingSearchIndex.bind(this),\n })}\n <ul>\n ${this._queryIndex.render({\n complete: (results) =>\n results?.map(\n ({ title, url }, i) => html`\n <li ?data-selected=${this._selected === i} data-result=${i}>\n <a\n href=${url}\n data-glean-id=${`quick-search: results[${1 + i}] -> ${this._query} -> ${url}`}\n ><span class=\"slug\"\n >${mdnUrl2Breadcrumb(url, this.locale)}</span\n >\n <span class=\"title\"\n >${HighlightMatch(title, this._query)}</span\n ></a\n >\n </li>\n `,\n ),\n })}\n ${searchUrl\n ? html`<li\n ?data-selected=${this._selected === siteSearchIndex}\n data-result=${siteSearchIndex}\n >\n <a\n href=${searchUrl}\n data-glean-id=${`quick-search: site-search -> ${this._query}`}\n ><span class=\"title\"\n >${this.l10n.raw({\n id: \"search-modal-site-search\",\n args: {\n query: this._query,\n },\n elements: {\n query: { tag: \"code\" },\n },\n })}</span\n ></a\n >\n </li>`\n : nothing}\n </ul>\n </dialog>\n `;\n }\n\n updated() {\n if (this._shiftFocus) {\n const selected = this._getSelectedItem();\n if (selected instanceof HTMLElement) {\n selected.focus();\n }\n }\n }\n}\n\ncustomElements.define(\"mdn-search-modal\", MDNSearchModal);\n\n/**\n * @param {string} input\n * @param {import(\"./types.js\").SearchIndex} index\n * @returns {import(\"./types.js\").SearchResultItem[]}\n */\nfunction quickSearch(input, index) {\n const inputValueLC = input.toLowerCase().trim();\n const q = splitQuery(input);\n const indexResults = index.flex\n .filter(({ title }) => q.every((q) => title.includes(q)))\n .map(({ index, title, slugTail }) => {\n const exact = Number([title, slugTail].includes(inputValueLC));\n return /** @type {const} */ ([exact, index]);\n })\n .sort(([aExact], [bExact]) => bExact - aExact) // Boost exact matches.\n .map(([_, i]) => i)\n .slice(0, 10);\n\n return indexResults.map((i) => i && (index.items || [])[i]).filter(Boolean);\n}\n\n/**\n * Used by quicksearch and sidebar filters.\n * @param {string} term\n * @returns {string[]}\n */\nexport function splitQuery(term) {\n term = term.trim().toLowerCase();\n return term.startsWith(\".\") || term.endsWith(\".\")\n ? // Dot is probably meaningful.\n term.split(/[ ,]+/)\n : // Dot is probably just a word separator.\n term.split(/[ ,.]+/);\n}\n\n/**\n * @param {string} title\n * @param {string} query\n */\nfunction HighlightMatch(title, query) {\n // Split on highlight term and include term into parts, ignore case.\n const words = splitQuery(query);\n // $& means the whole matched string\n const regexWords = words.map((s) =>\n s.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`),\n );\n const regex = regexWords.map((word) => `(${word})`).join(\"|\");\n const parts = title.split(new RegExp(regex, \"gi\"));\n return parts\n .filter(Boolean)\n .map((part) =>\n words.includes(part.toLowerCase()) ? html`<mark>${part}</mark>` : part,\n );\n}\n","/**\n * @import * as User from \"../user/types.js\";\n */\n\nimport { WRITER_MODE } from \"../env/index.js\";\n\nconst DEFAULT_GEO = { country: \"United States\", country_iso: \"US\" };\n\n/**\n * @type {User.User}\n */\nconst DEFAULT_USER = {\n username: null,\n isAuthenticated: false,\n avatarUrl: null,\n isSubscriber: false,\n subscriptionType: null,\n email: null,\n geo: DEFAULT_GEO,\n settings: null,\n};\n\n/**\n * @type {Promise<User.User> | undefined}\n */\nlet USER;\n\n/**\n *\n * @returns {Promise<User.User>}\n */\nexport function globalUser() {\n if (WRITER_MODE) {\n return new Promise(() => {});\n }\n if (!USER) {\n USER = fetchUserData().catch((error) => {\n console.error(error);\n return DEFAULT_USER;\n });\n }\n return USER;\n}\n\n/**\n *\n * @returns {Promise<User.User>}\n */\nasync function fetchUserData() {\n const response = await fetch(\"/api/v1/whoami\");\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n\n try {\n /**\n * @type {User.WhoamiResponse}\n */\n const data = await response.json();\n const settings = data?.settings\n ? {\n aiHelpHistory:\n typeof data.settings?.ai_help_history === \"boolean\"\n ? data.settings.ai_help_history\n : null,\n noAds: data.settings?.no_ads ?? null,\n }\n : DEFAULT_USER.settings;\n Settings.noAds = settings?.noAds || false;\n return {\n username: data.username ?? DEFAULT_USER.username,\n isAuthenticated: data.is_authenticated ?? DEFAULT_USER.isAuthenticated,\n avatarUrl: data.avatar_url ?? DEFAULT_USER.avatarUrl,\n isSubscriber: data.is_subscriber ?? DEFAULT_USER.isSubscriber,\n subscriptionType:\n data.subscription_type === \"core\"\n ? \"mdn_core\"\n : (data.subscription_type ?? DEFAULT_USER.subscriptionType),\n email: data.email ?? DEFAULT_USER.email,\n geo: {\n country: (data.geo && data.geo.country) ?? DEFAULT_GEO.country,\n country_iso:\n (data.geo && data.geo.country_iso) ?? DEFAULT_GEO.country_iso,\n },\n settings,\n };\n } catch {\n throw new Error(response.statusText);\n }\n}\n\nexport const Settings = {\n set noAds(value) {\n if (value) {\n globalThis.localStorage.setItem(\"nop\", \"yes\");\n } else {\n globalThis.localStorage.removeItem(\"nop\");\n }\n },\n\n get noAds() {\n return globalThis.localStorage?.getItem?.(\"nop\") === \"yes\";\n },\n};\n","for (const pre of document.querySelectorAll(\n `div.code-example pre:not(.hidden):not([class*=\"live-sample\"]):not([class*=\"interactive-example\"])`,\n)) {\n const { upgradePre } = await import(\"../components/code-example/element.js\");\n upgradePre(pre);\n}\n","/**\n * dialog closedby polyfill based on https://github.com/tak-dcxi/dialog-closedby-polyfill\n *\n * @license MIT\n *\n * Copyright (c) 2025 Takahiro Arai\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!(\"closedBy\" in HTMLDialogElement.prototype)) {\n addEventListener(\"click\", (event) => {\n const source = event.composedPath()[0];\n if (\n source instanceof HTMLDialogElement &&\n source.getAttribute(\"closedby\") === \"any\"\n ) {\n const rect = source.getBoundingClientRect();\n const { clientX: x, clientY: y } = event;\n const inside =\n rect.top <= y && y <= rect.bottom && rect.left <= x && x <= rect.right;\n\n if (!inside) source.close();\n }\n });\n}\n","/**\n * Returns true or false based on whether doNotTrack is enabled. It also takes into account the\n * anomalies, such as !bugzilla 887703, which effect versions of Fx 31 and lower. It also handles\n * IE versions on Windows 7, 8 and 8.1, where the DNT implementation does not honor the spec.\n * Based on https://github.com/mozmeao/dnt-helper/blob/main/src/mozilla-dnt-helper.js\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=1217896 for more details\n * @param {string} [dnt] - An optional mock doNotTrack string to ease unit testing.\n * @param {string} [ua] - An optional mock userAgent string to ease unit testing.\n * @returns {boolean} true if enabled else false\n */\nexport function dntEnabled(dnt, ua) {\n // for old version of IE we need to use the msDoNotTrack property of navigator\n // on newer versions, and newer platforms, this is doNotTrack but, on the window object\n // Safari also exposes the property on the window object.\n let dntStatus =\n dnt ||\n navigator.doNotTrack ||\n // @ts-expect-error - non-standard property\n globalThis.doNotTrack ||\n // @ts-expect-error - non-standard property\n navigator.msDoNotTrack;\n const userAgent = ua || navigator.userAgent;\n\n // List of Windows versions known to not implement DNT according to the standard.\n const anomalousWinVersions = [\n \"Windows NT 6.1\",\n \"Windows NT 6.2\",\n \"Windows NT 6.3\",\n ];\n\n const fxMatch = userAgent.match(/Firefox\\/(\\d+)/);\n const ieRegEx = /MSIE|Trident/i;\n const isIE = ieRegEx.test(userAgent);\n // Matches from Windows up to the first occurance of ; un-greedily\n // http://www.regexr.com/3c2el\n const platform = userAgent.match(/Windows.+?(?=;)/g);\n\n // With old versions of IE, DNT did not exist so we simply return false;\n if (isIE && typeof Array.prototype.indexOf !== \"function\") {\n return false;\n } else if (fxMatch && Number.parseInt(fxMatch[1] || \"0\", 10) < 32) {\n // Can't say for sure if it is 1 or 0, due to Fx bug 887703\n dntStatus = \"Unspecified\";\n } else if (\n isIE &&\n platform &&\n anomalousWinVersions.includes(platform.toString())\n ) {\n // default is on, which does not honor the specification\n dntStatus = \"Unspecified\";\n } else {\n // sets dntStatus to Disabled or Enabled based on the value returned by the browser.\n // If dntStatus is undefined, it will be set to Unspecified\n // @ts-expect-error - DNT status can be various types\n dntStatus = { 0: \"Disabled\", 1: \"Enabled\" }[dntStatus] || \"Unspecified\";\n }\n\n return dntStatus === \"Enabled\";\n}\n","/**\n * Google Analytics, enabled if:\n * 1. FRED_GA_ENABLED and FRED_GA_MEASUREMENT_ID are set\n * 2. User has not opted out via moz-1st-party-data-opt-out cookie\n * 3. User has not enabled Do Not Track (DNT)\n */\n\nimport { GA_ENABLED, GA_MEASUREMENT_ID } from \"../components/env/index.js\";\nimport { dntEnabled } from \"../utils/dnt-helper.js\";\nimport { userIsOptedOut } from \"../utils/telemetry-opt-out.js\";\n\nif (GA_ENABLED && GA_MEASUREMENT_ID && !userIsOptedOut() && !dntEnabled()) {\n const gaScript = document.createElement(\"script\");\n gaScript.async = true;\n gaScript.src = `https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(GA_MEASUREMENT_ID)}`;\n document.head.append(gaScript);\n\n globalThis.dataLayer = globalThis.dataLayer || [];\n\n function gtag() {\n globalThis.dataLayer.push(arguments);\n }\n\n gtag(\"js\", new Date());\n gtag(\"config\", GA_MEASUREMENT_ID, {\n anonymize_ip: true,\n });\n}\n","import Glean from \"@mozilla/glean/web\";\n\nimport {\n GLEAN_CHANNEL,\n GLEAN_DEBUG,\n GLEAN_ENABLED,\n} from \"../components/env/index.js\";\nimport { gleanClick } from \"../utils/glean.js\";\nimport { userIsOptedOut } from \"../utils/telemetry-opt-out.js\";\n\nconst GLEAN_APP_ID = \"mdn-fred\";\n\nconst uploadEnabled = !userIsOptedOut() && GLEAN_ENABLED;\n\nif (GLEAN_DEBUG) {\n Glean.setDebugViewTag(\"mdn-dev\");\n Glean.setLogPings(true);\n}\n\nGlean.initialize(GLEAN_APP_ID, uploadEnabled, {\n enableAutoPageLoadEvents: true,\n enableAutoElementClickEvents: true,\n channel: GLEAN_CHANNEL,\n});\n\ndocument.addEventListener(\"click\", (event) => {\n const composedTarget = event.composedPath()?.[0];\n if (composedTarget !== event.target && composedTarget instanceof Element) {\n // Workaround for automatic click events in shadow DOM.\n // See: https://bugzil.la/1988206\n const taggedElement = composedTarget.closest(\"[data-glean-id]\");\n if (taggedElement instanceof HTMLElement) {\n const gleanId = taggedElement.dataset.gleanId;\n if (gleanId) {\n gleanClick(gleanId);\n }\n }\n }\n\n const target = composedTarget ?? event.target;\n if (target instanceof Element) {\n // External link measurement.\n const anchor = target.closest(\"a\");\n if (\n anchor instanceof HTMLAnchorElement &&\n anchor.href &&\n anchor.origin &&\n anchor.origin !== document.location.origin\n ) {\n gleanClick(`external-link: ${anchor.href}`);\n }\n }\n});\n","/**\n * @import { MDNCodeExample } from \"../components/code-example/element.js\";\n */\n\nfor (const iframe of document.querySelectorAll(\"iframe[data-live-id]\")) {\n if (iframe instanceof HTMLIFrameElement) {\n const { liveId, livePath } = iframe.dataset;\n if (liveId) {\n /** @type {Record<string, string>} */\n const liveSampleCode = {};\n /** @type {MDNCodeExample[]} */\n const codeExamples = [];\n\n const escapedId = liveId.replaceAll(\".\", String.raw`\\.`);\n for (const element of document.querySelectorAll(\n `.live-sample___${escapedId}, .live-sample---${escapedId}`,\n )) {\n const { MDNCodeExample, upgradePre } =\n await import(\"../components/code-example/element.js\");\n const codeExample =\n element instanceof MDNCodeExample ? element : upgradePre(element);\n if (codeExample) {\n codeExamples.push(codeExample);\n const { language, code } = codeExample;\n liveSampleCode[language]\n ? (liveSampleCode[language] += code)\n : (liveSampleCode[language] = code);\n }\n }\n\n await import(\"../components/live-sample-result/element.js\");\n const result = document.createElement(\"mdn-live-sample-result\");\n result.liveId = liveId;\n result.code = liveSampleCode;\n result.srcPrefix = livePath;\n result.allow = iframe.allow || undefined;\n result.sandbox = iframe.sandbox.toString();\n result.height = iframe.height;\n iframe.closest(\".code-example\")?.replaceWith(result);\n\n for (const codeExample of codeExamples) {\n codeExample.liveSample ||= result;\n }\n }\n }\n}\n","const loaded = new Set();\nfor (const element of document.querySelectorAll(\"*\")) {\n const tag = element.tagName.toLowerCase();\n if (tag.startsWith(\"mdn-\") || tag === \"interactive-example\") {\n const component = tag.replace(\"mdn-\", \"\");\n if (!loaded.has(component)) {\n loaded.add(component);\n // we don't want to await, because we want these to load in parallel\n // eslint-disable-next-line unicorn/prefer-top-level-await\n import(`../components/${component}/element.js`).catch((error) => {\n console.error(\n `couldn't load code for <${component}>: does the element's code not match the naming schema?`,\n error,\n );\n });\n }\n }\n}\n","const sidebar = document.querySelector(\".left-sidebar\");\nconst current = sidebar?.querySelector('[aria-current=\"page\"]');\nif (sidebar && current instanceof HTMLElement) {\n sidebar.scrollTo({\n top: current.offsetTop - window.innerHeight / 4,\n });\n}\n","import { MDNSearchModal } from \"../components/search-modal/element.js\";\n\nconst skipToSearch = document.querySelector(`.a11y-menu a[href=\"#search\"]`);\n\nif (skipToSearch instanceof HTMLAnchorElement) {\n const search = document.querySelector(\"#search\");\n\n if (search instanceof MDNSearchModal) {\n skipToSearch.addEventListener(\"click\", (event) => {\n const { target } = event;\n\n if (target instanceof HTMLElement) {\n target.blur();\n event.preventDefault();\n }\n\n search.showModal();\n });\n } else {\n console.error(\"MDNSearchModal not found!\");\n skipToSearch.hidden = true;\n }\n}\n","/**\n * @param {HTMLElement} toc\n * @returns {void}\n */\nfunction highlightTOC(toc) {\n // 1. Collect TOC items\n const tocItems = [...toc.querySelectorAll(\"a\")];\n\n // 2. Map sections to TOC item\n /** @type {Map<HTMLElement, HTMLAnchorElement>} */\n const tocItemBySection = new Map();\n for (const item of tocItems.reverse()) {\n const target = document.querySelector(\n `[id=\"${decodeURIComponent(item.hash).slice(1)}\"]`,\n );\n\n if (!target) {\n continue;\n }\n\n /** @type {Element|null} */\n let section = target.closest(\"section\");\n\n while (\n section &&\n section instanceof HTMLElement &&\n !tocItemBySection.has(section)\n ) {\n tocItemBySection.set(section, item);\n const next = section.nextElementSibling;\n section = next;\n }\n }\n\n /** @type {WeakMap<HTMLElement,number>} */\n const visibleSectionsByItem = new WeakMap();\n\n /** @type {Set<HTMLElement>} */\n const everVisibleSections = new Set();\n\n // 3. Handle visibility transitions\n const onIntersect = (/** @type {IntersectionObserverEntry[]} */ entries) => {\n for (const { target, isIntersecting } of entries) {\n if (!(target instanceof HTMLElement)) {\n continue;\n }\n\n if (!everVisibleSections.has(target)) {\n if (isIntersecting) {\n everVisibleSections.add(target);\n } else {\n continue;\n }\n }\n\n const item = tocItemBySection.get(target);\n\n if (!item) {\n continue;\n }\n\n const visibleCount =\n (visibleSectionsByItem.get(item) ?? 0) + (isIntersecting ? 1 : -1);\n\n item.ariaCurrent = visibleCount > 0 ? \"true\" : null;\n visibleSectionsByItem.set(item, visibleCount);\n }\n };\n\n // 5. Determine options.\n /** @type {IntersectionObserverInit} */\n const options = {\n threshold: 0,\n };\n const header = document.querySelector(\"header\");\n if (header instanceof HTMLElement) {\n options.rootMargin = `-${header.clientHeight}px 0px 0px 0px`;\n }\n\n // 5. Init observer.\n const observer = new IntersectionObserver(onIntersect, options);\n\n // 6. Observe sections.\n for (const section of tocItemBySection.keys()) {\n observer.observe(section);\n }\n}\n\nfor (const toc of document.querySelectorAll(\n \".generic-toc, .reference-toc, .document-toc, .blog-toc\",\n)) {\n if (toc instanceof HTMLElement) {\n highlightTOC(toc);\n }\n}\n","import { globalUser } from \"../components/user/context.js\";\n\ntry {\n const user = await globalUser();\n const nextPing = new Date(localStorage.getItem(\"next-ping\") || 0);\n if (navigator.sendBeacon && user.isAuthenticated && nextPing < new Date()) {\n const params = new URLSearchParams();\n\n navigator.sendBeacon(\"/api/v1/ping\", params);\n\n const newNextPing = new Date();\n newNextPing.setUTCDate(newNextPing.getUTCDate() + 1);\n newNextPing.setUTCHours(0);\n newNextPing.setUTCMinutes(0);\n newNextPing.setUTCSeconds(0);\n newNextPing.setUTCMilliseconds(0);\n localStorage.setItem(\"next-ping\", newNextPing.toISOString());\n }\n} catch (error) {\n console.error(\"Failed to send ping\", error);\n}\n","export default `# TODO Use comments, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#comments\n# TODO Consider using terms, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#terms and https://projectfluent.org/fluent/guide/references.html#message-references\n\narticle-footer-last-modified = This page was last modified on <time data-l10n-name=\"date\">{ \\$date }</time> by <a data-l10n-name=\"contributors\">MDN contributors</a>.\narticle-footer-source-title = Folder: { \\$folder } (Opens in a new tab)\n\nbaseline-asterisk = Some parts of this feature may have varying levels of support.\nbaseline-high-extra = This feature is well established and works across many devices and browser versions. It’s been available across browsers since { \\$date }.\nbaseline-low-extra = Since { \\$date }, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.\nbaseline-not-extra = This feature is not Baseline because it does not work in some of the most widely-used browsers.\nbaseline-supported-in = Supported in { \\$browsers }\nbaseline-unsupported-in = Not widely supported in { \\$browsers }\nbaseline-supported-and-unsupported-in = Supported in { \\$supported }, but not widely supported in { \\$unsupported }\n\nhomepage-hero-title = Resources for Developers,<br> by Developers\nhomepage-hero-description = Documenting <a data-l10n-name=\"css\">CSS</a>, <a data-l10n-name=\"html\">HTML</a>, and <a data-l10n-name=\"js\">JavaScript</a>, since 2005.\n\nnot-found-title = Page not found\nnot-found-description = Sorry, the page <code data-l10n-name=\"url\">{ \\$url }</code> could not be found.\nnot-found-fallback-english = <strong data-l10n-name=\"strong\">Good news:</strong> The page you requested exists in <em data-l10n-name=\"em\">English</em>.\nnot-found-fallback-search = The page you requested doesn't exist, but you could try a site search for:\nnot-found-back = Go back to the home page\n\nreference-toc-header = In this article\n\nfooter-mofo = Visit <a data-l10n-name=\"moco\">Mozilla Corporation’s</a> not-for-profit parent, the <a data-l10n-name=\"mofo\">Mozilla Foundation</a>.\nfooter-copyright = Portions of this content are ©1998–{ \\$year } by individual mozilla.org contributors. Content available under <a data-l10n-name=\"cc\">a Creative Commons license</a>.\n\nsearch-modal-site-search = Site search for <em>{ \\$query }</em>\n\nsite-search-search-stats = Found { \\$results } documents.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] more than { \\$matches ->\n [one] { \\$matches } match\n *[other] { \\$matches } matches\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } match\n *[other] { \\$matches } matches\n }\n}\nsite-search-suggestions-text = Did you mean:\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } minute read\n *[other] { \\$minutes } minutes read\n}\nblog-post-not-found = Blog post not found.\n\nblog-previous = Previous post\nblog-next = Next post\n\n-brand-name-obs = HTTP Observatory\nobs-report = Report\nobs-title = { -brand-name-obs }\nobs-landing-intro = Launched in 2016, the { -brand-name-obs } enhances web security by analyzing compliance with best security practices. It has provided insights to over 6.9 million websites through 47 million scans.\nobs-assessment = Developed by Mozilla, the { -brand-name-obs } performs an in-depth assessment of a site’s HTTP headers and other key security configurations.\nobs-scanning = Its automated scanning process provides developers and website administrators with detailed, actionable feedback, focusing on identifying and addressing potential security vulnerabilities.\nobs-security = The tool is instrumental in helping developers and website administrators strengthen their sites against common security threats in a constantly advancing digital environment.\nobs-mdn = The { -brand-name-obs } provides effective security insights, guided by Mozilla's expertise and commitment to a safer and more secure internet and based on well-established trends and guidelines.\n\n\ncompat-loading = Loading…\ncompat-js-required = Enable JavaScript to view this browser compatibility table.\n\ncompat-browser-version-date = { \\$browser } { \\$version } – Release date: { \\$date }\ncompat-browser-version-released = Release date: { \\$date }\n\ncompat-link-report-issue = Report problems with this compatibility data\ncompat-link-report-issue-title = Report an issue with this compatibility data\ncompat-link-report-missing-title = Report missing compatibility data\ncompat-link-report-missing = Report this issue\ncompat-link-source = View data on GitHub\ncompat-link-source-title = File: { \\$filename }\n\ncompat-deprecated = Deprecated\ncompat-experimental = Experimental\ncompat-nonstandard = Non-standard\ncompat-no = No\n\ncompat-support-full = Full support\ncompat-support-partial = Partial support\ncompat-support-no = No support\ncompat-support-unknown = Support unknown\ncompat-support-preview = Preview browser support\ncompat-support-prefix = Implemented with the vendor prefix: { \\$prefix }\ncompat-support-altname = Alternate name: { \\$altname }\ncompat-support-removed = Removed in { \\$version } and later\ncompat-support-see-impl-url = See <a data-l10n-name=\"impl_url\">{ \\$label }</a>\ncompat-support-flags =\n { NUMBER(\\$has_added) ->\n [one] From version { \\$version_added }\n *[other] {\"\"}\n }{ \\$has_last ->\n [one] { NUMBER(\\$has_added) ->\n *[zero] Until { \\$versionLast } users\n [one] {\" \"}until { \\$versionLast } users\n }\n *[zero] { NUMBER(\\$has_added) ->\n *[zero] Users\n [one] {\" \"}users\n }\n }\n {\" \"}must explicitly set the <code data-l10n-name=\"name\">{ \\$flag_name }</code>{\" \"}\n { \\$flag_type ->\n *[preference] preference\n [runtime_flag] runtime flag\n }{ NUMBER(\\$has_value) ->\n [one] {\" \"}to <code data-l10n-name=\"value\">{ \\$flag_value }</code>\n *[other] {\"\"}\n }{\".\"}\n { NUMBER(\\$has_pref_url) ->\n [one] { \\$flag_type ->\n [preference] To change preferences in { \\$browser_name }, visit { \\$browser_pref_url }.\n *[other] {\"\"}\n }\n *[other] {\"\"}\n }\n\ncompat-legend = Legend\ncompat-legend-tip = Tip: you can click/tap on a cell for more information.\ncompat-legend-yes = { compat-support-full }\ncompat-legend-partial = { compat-support-partial }\ncompat-legend-preview = In development. Supported in a pre-release version.\ncompat-legend-no = { compat-support-no }\ncompat-legend-unknown = Compatibility unknown\ncompat-legend-experimental = { compat-experimental }. Expect behavior to change in the future.\ncompat-legend-nonstandard = { compat-nonstandard }. Check cross-browser support before using.\ncompat-legend-deprecated = { compat-deprecated }. Not for use in new websites.\ncompat-legend-footnote = See implementation notes.\ncompat-legend-disabled = User must explicitly enable this feature.\ncompat-legend-altname = Uses a non-standard name.\ncompat-legend-prefix = Requires a vendor prefix or different name for use.\ncompat-legend-more = Has more compatibility info.\n\nplacement-note = Ad\nplacement-no = Don't want to see ads?\n\npagination-next = Next page\npagination-prev = Previous page\npagination-current = Current page\npagination-goto = Go to page { \\$page }\n\nlogout = Sign out\nlogin = Log in\nsettings = My settings\n\nexample-play-button-label = Play\nexample-play-button-title = Run example in MDN Playground (opens in new tab)\n\ncontent-feedback-question = Was this page helpful to you?\ncontent-feedback-reason = Why was this page not helpful to you?\ncontent-feedback-thanks = Thank you for your feedback!\n\nwriter-reload-polling = Polling every { \\$seconds }s\n`;","import { FluentBundle, FluentResource } from \"@fluent/bundle\";\nimport insane from \"insane\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport de_ftl from \"../l10n/de.ftl\";\nimport enUS_ftl from \"../l10n/en-US.ftl\";\nimport es_ftl from \"../l10n/es.ftl\";\nimport fr_ftl from \"../l10n/fr.ftl\";\nimport ja_ftl from \"../l10n/ja.ftl\";\nimport ko_ftl from \"../l10n/ko.ftl\";\nimport ptBR_ftl from \"../l10n/pt-BR.ftl\";\nimport ru_ftl from \"../l10n/ru.ftl\";\nimport zhCN_ftl from \"../l10n/zh-CN.ftl\";\nimport zhTW_ftl from \"../l10n/zh-TW.ftl\";\n\n/**\n * @import { AllowedTags } from \"insane\";\n */\n\n/** @type {Record<string, string>} */\nconst ftlMap = {\n \"en-US\": enUS_ftl,\n de: de_ftl,\n es: es_ftl,\n fr: fr_ftl,\n ja: ja_ftl,\n ko: ko_ftl,\n \"pt-BR\": ptBR_ftl,\n ru: ru_ftl,\n \"zh-CN\": zhCN_ftl,\n \"zh-TW\": zhTW_ftl,\n};\n\nconst ALLOWED_TAGS = [\"i\", \"strong\", \"br\", \"em\"];\nconst ALLOWED_ATTRIBUTES = [\"title\", \"aria-label\"];\n\nexport class Fluent {\n /**\n * @param {string} locale\n * @param {string[]} resources\n */\n constructor(locale = \"en-US\", resources = []) {\n this.locale = locale;\n\n this.usBundle = Fluent.constructBundle(\n new FluentBundle(locale, { useIsolating: false }),\n [enUS_ftl],\n );\n\n if (resources.length > 0) {\n this.bundle = Fluent.constructBundle(\n new FluentBundle(locale, { useIsolating: false }),\n [enUS_ftl, ...resources],\n );\n }\n }\n\n /**\n * @param {FluentBundle} bundle\n * @param {string[]} resources\n */\n static constructBundle(bundle, resources = []) {\n for (const r of resources) {\n const errors = bundle.addResource(new FluentResource(r), {\n allowOverrides: true,\n });\n if (errors.length > 0) {\n console.error(errors);\n }\n }\n return bundle;\n }\n\n /**\n * @param {string} id\n * @param {string} [attr]\n * @param {Record<string, any>} [args]\n * @param {Record<string, import(\"../types/fluent.js\").Element>} [elements]\n * @returns {string | ReturnType<typeof unsafeHTML> | undefined}\n */\n get(id, attr, args, elements) {\n const message = this.getMessage(id, attr, args);\n if (!message) {\n return;\n }\n return Fluent.sanitize(message, elements);\n }\n\n /**\n * @param {string} message\n * @param {Record<string, import(\"../types/fluent.js\").Element>} [elements]\n * @returns {string | ReturnType<typeof unsafeHTML>}\n */\n static sanitize(message, elements = {}) {\n /** @type { Record<string, string[]> } */\n const allowedAttributes = {};\n for (const t of Object.values(elements)) {\n allowedAttributes[t.tag] = [\n ...Object.keys(t).filter((x) => x !== \"tag\"),\n ...ALLOWED_ATTRIBUTES,\n ];\n }\n\n const allowedTags = [\n ...Object.values(elements).map((t) => t.tag),\n ...ALLOWED_TAGS,\n ];\n\n let safe = true;\n const sanitized = insane(\n message,\n {\n allowedAttributes,\n allowedTags: /** @type {AllowedTags[]} */ (allowedTags),\n allowedSchemes: [\"http\", \"https\", \"mailto\"],\n filter(token) {\n // TODO: use element names directly\n const name = token.attrs[\"data-l10n-name\"];\n if (name) {\n for (const [k, v] of Object.entries(elements[name] || {})) {\n token.attrs[k] = v;\n }\n }\n if (\n ALLOWED_TAGS.includes(token.tag) ||\n (name &&\n Object.keys(elements).includes(name) &&\n elements[name]?.tag === token.tag)\n ) {\n safe = false;\n return true;\n }\n return false;\n },\n },\n true,\n );\n return safe ? sanitized : unsafeHTML(sanitized);\n }\n\n /**\n * @param {string} id\n * @param {string} [attr]\n * @param {Record<string, any>} [args]\n * @param {FluentBundle | undefined} [bundle]\n * @param {boolean} [us]\n * @returns {string | undefined}\n */\n getMessage(id, attr, args = {}, bundle = this.bundle, us = false) {\n const parentMessage = bundle ? bundle.getMessage(id) : undefined;\n let message;\n\n if (this.locale === \"qa\") {\n return `[${id}${attr ? `.${attr}` : \"\"}]`;\n }\n\n if (!parentMessage) {\n if (us) {\n // console.error(`string ${id} doesn't exist`);\n // return `[${id}${attr ? `.${attr}` : \"\"}]`;\n return;\n }\n return this.getMessage(id, attr, args, this.usBundle, true);\n }\n\n if (attr) {\n message = parentMessage.attributes[attr];\n if (!message) {\n if (us) {\n // console.error(`string ${id} with ${attr} attribute doesn't exist`);\n // return `[${id}.${attr}]`;\n return;\n }\n return this.getMessage(id, attr, args, this.usBundle, true);\n }\n } else if (parentMessage.value) {\n message = parentMessage.value;\n }\n\n if (!message || !bundle) {\n return \"\";\n }\n\n /** @type {Error[]} */\n const errors = [];\n const formatted = bundle?.formatPattern(message, args, errors);\n if (errors.length > 0) {\n console.error(errors);\n }\n return formatted;\n }\n}\n\n/** @type {Map<string, Fluent>} */\nconst fluent = new Map();\n\n/**\n * @param {string} [locale]\n */\nfunction getLocale(locale) {\n if (!locale) {\n return;\n }\n if (!fluent.has(locale)) {\n const ftl = ftlMap[locale];\n const localeF = new Fluent(locale, ftl ? [ftl] : undefined);\n fluent.set(locale, localeF);\n }\n return fluent.get(locale);\n}\n\n/**\n * @param {string} [locale]\n */\nexport default function getFluentContext(locale) {\n /**\n * @overload\n * @param {string} id\n * @param {string} [_comment]\n * @returns {import(\"../types/fluent.js\").L10nTag}\n */\n\n /**\n * @overload\n * @param {TemplateStringsArray} strings\n * @returns {string}\n */\n\n /**\n * @param {string | TemplateStringsArray} idOrStrings\n * @param {string} [_comment]\n * @returns {import(\"../types/fluent.js\").L10nTag | string}\n */\n function l10n(idOrStrings, _comment) {\n if (typeof idOrStrings === \"string\") {\n // called as a function, returning a template tag:\n // l10n(\"foobar\")`Foobar`\n const id = idOrStrings;\n const localizedString = getLocale(locale)?.get(id);\n const fallbackString = `[${id}]`;\n /** @type {import(\"../types/fluent.js\").L10nTag} */\n const tag = (strings) => {\n // we don't currently support any expressions in the template string\n // we might in the future, if we use l10n.raw a lot\n const templateString = strings[0];\n return localizedString || templateString || fallbackString;\n };\n tag.toString = () => {\n // called as a function, used as a function:\n // ${l10n(\"foobar\")}\n return (\n (typeof localizedString === \"string\" && localizedString) ||\n fallbackString\n );\n };\n return tag;\n }\n // called directly as a template tag:\n // l10n`Foobar`\n // TODO: create consistent logic for id generation at runtime and scrapetime\n const strings = idOrStrings;\n const templateString = strings[0];\n return templateString || \"\";\n }\n\n /**\n * @param {{ id: string, attr?: string, args?: Record<string, any>, elements?: Record<string, import(\"../types/fluent.js\").Element> }} param0\n */\n l10n.raw = function ({ id, attr, args, elements }) {\n const fluent = getLocale(locale);\n if (fluent) {\n return fluent.get(id, attr, args, elements);\n }\n return `[${id}]`;\n };\n\n return l10n;\n}\n\n// const l10n = getFluentContext(\"en-US\");\n\n// console.log(l10n`Hello`);\n// console.log(l10n(\"hello\")`Hello`);\n// console.log(l10n(\"hello\", \"a greeting to the user\")`Hello`);\n// console.log(l10n.raw({ id: \"hello\" }));\n// console.log(`${l10n(\"hello\")}`);\n\n// should show error:\n// l10n(\"hello\")`Hello ${\"world\"}`;\n","export default `content-feedback-question = War diese Übersetzung hilfreich?\ncontent-feedback-reason = Warum war diese Übersetzung nicht hilfreich?\ncontent-feedback-thanks = Vielen Dank für die Rückmeldung!\n\nreference-toc-header = In diesem Artikel\n\nfooter-tagline = Dein Bauplan für ein besseres Internet.\nfooter-mofo = Besuche die gemeinnützige Muttergesellschaft der <a data-l10n-name=\"moco\">Mozilla Corporation</a>, die <a data-l10n-name=\"mofo\">Mozilla Foundation</a>.\nfooter-copyright = Teile dieses Inhalts sind ©1998–{ \\$year } von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter <a data-l10n-name=\"cc\">einer Creative-Commons-Lizenz</a>.\n\nsearch-modal-site-search = Erweiterte Suche nach <em>{ \\$query }</em>\n\nsite-search-search-stats = { \\$results } Dokumente gefunden.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] mehr als { \\$matches ->\n [one] { \\$matches } Übereinstimmung\n *[other] { \\$matches } Übereinstimmungen\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } Übereinstimmung\n *[other] { \\$matches } Übereinstimmungen\n }\n}\nsite-search-suggestions-text = Meinten Sie:\n\n\ntheme-default = Systemstandard\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } Minute Lesezeit\n *[other] { \\$minutes } Minuten Lesezeit\n}\nblog-post-not-found = Blogartikel nicht gefunden.\n\nblog-previous = Voriger Artikel\nblog-next = Nächster Artikel\n\nNo = Nein\nSubmit = Abschicken\nYes = Ja\n\nobs-report = Report\n\nobs-title = HTTP Observatory\nobs-landing-intro = Seit 2016 verbessert HTTP Observatory die Sicherheit durch Analyse der Einhaltung bewährter Sicherheitspraktiken. Es hat durch 47 Millionen Scans Einblicke in über 6,9 Millionen Websites geliefert.\nobs-assessment = Das von Mozilla entwickelte HTTP Observatory führt eine umfassende Bewertung der HTTP-Header und weiterer zentraler Sicherheitskonfigurationen einer Website durch.\nobs-scanning = Der automatisierte Scan-Prozess liefert Entwicklern und Website-Administratoren detailliertes, handlungsorientiertes Feedback und konzentriert sich darauf, potenzielle Sicherheitslücken zu erkennen und zu beheben.\nobs-security = Das Tool unterstützt Entwickler und Website-Administratoren maßgeblich dabei, ihre Websites in einem sich stetig weiterentwickelnden digitalen Umfeld gegen häufige Sicherheitsbedrohungen abzusichern.\nobs-mdn = Das HTTP Observatory bietet wirksame Sicherheitseinblicke auf Grundlage von Mozillas Expertise und Engagement für ein sichereres Internet sowie basierend auf etablierten Trends und Richtlinien.\n`;","export default `blog-toc-title = En este artículo\n\n`;","export default `article-footer-last-modified = Cette page a été modifiée le <time data-l10n-name=\"date\">{ \\$date }</time> par les <a data-l10n-name=\"contributors\">contributeurs du MDN</a>.\narticle-footer-source-title = Dossier : { \\$folder } (Ouvre un onglet)\n\nbaseline-asterisk = Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.\nbaseline-high-extra = Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis { \\$date }.\nbaseline-low-extra = Depuis { \\$date }, cette fonctionnalité fonctionne sur les appareils et les versions de navigateur les plus récents. Elle peut ne pas fonctionner sur les appareils ou navigateurs plus anciens.\nbaseline-not-extra = Cette fonctionnalité n'est pas Compatible car elle ne fonctionne pas dans certains des navigateurs les plus utilisés.\nbaseline-supported-in = Pris en charge dans { \\$browsers }\nbaseline-unsupported-in = Pas complètement pris en charge dans { \\$browsers }\nbaseline-supported-and-unsupported-in = Pris en charge dans { \\$supported }, mais pas complètement pris en charge dans { \\$unsupported }\n\nhomepage-hero-title = Des ressources pour les Développeuses et Développeurs,<br> par des Développeuses et Développeurs\nhomepage-hero-description = Documenter le <a data-l10n-name=\"css\">CSS</a>, le <a data-l10n-name=\"html\">HTML</a> et le <a data-l10n-name=\"js\">JavaScript</a>, depuis 2005.\n\nnot-found-title = Page non trouvée\nnot-found-description = Désolé, la page <code data-l10n-name=\"url\">{ \\$url }</code> n'a pas été trouvée.\nnot-found-fallback-english = <strong data-l10n-name=\"strong\">Bonne nouvelle :</strong> La page que vous cherchez existe en <em data-l10n-name=\"em\">Anglais</em>.\nnot-found-fallback-search = La page que vous avez demandée n'existe pas, mais vous pouvez essayer une recherche sur le site pour :\nnot-found-back = Retour à la page d'accueil\n\nreference-toc-header = Dans cet article\n\nfooter-mofo = Visitez la société mère à but non lucratif de <a data-l10n-name=\"moco\">Mozilla Corporation</a>, la <a data-l10n-name=\"mofo\">Fondation Mozilla</a>.\nfooter-copyright = Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—{ \\$year } des contributeurs individuels de mozilla.org. Contenu disponible sous <a data-l10n-name=\"cc\">une licence Creative Commons</a>.\n\nsearch-modal-site-search = Rechercher sur le site <em>{ \\$query }</em>\n\nsite-search-search-stats = { \\$results } documents trouvés.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] plus que { \\$matches ->\n [one] { \\$matches } trouvé\n *[other] { \\$matches } trouvés\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } trouvé\n *[other] { \\$matches } trouvés\n }\n}\nsite-search-suggestions-text = Voulez-vous dire :\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } minute de lecture\n *[other] { \\$minutes } minutes de lecture\n}\nblog-post-not-found = Article de blog introuvable.\n\nblog-previous = Article précédent\nblog-next = Article suivant\n\n-brand-name-obs = HTTP Observatory\nobs-report = Signaler\nobs-title = { -brand-name-obs }\nobs-landing-intro = Lancé en 2016, { -brand-name-obs } améliore la sécurité du Web en analysant la conformité aux meilleures pratiques en matière de sécurité. Il a fourni des informations à plus de 6,9 millions de sites web grâce à 47 millions d'analyses.\nobs-assessment = Développé par Mozilla, { -brand-name-obs } effectue une évaluation approfondie des en-têtes HTTP d'un site et d'autres configurations de sécurité clés.\nobs-scanning = Son processus d'analyse automatisé fournit aux développeur·euse·s et aux administrateur·ice·s de sites web des commentaires détaillés et exploitables, axés sur l'identification et la résolution des failles de sécurité potentielles.\nobs-security = Cet outil aide les développeur·euse·s et les administrateur·ice·s de sites web à renforcer la sécurité de leurs sites contre les menaces courantes dans un environnement numérique en constante évolution.\nobs-mdn = { -brand-name-obs } fournit des informations efficaces en matière de sécurité, guidées par l'expertise et l'engagement de Mozilla en faveur d'un Internet plus sûr et plus sécurisé, et basées sur des tendances et des directives bien établies.\n\n\ncompat-loading = Chargement…\ncompat-js-required = Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.\n\ncompat-browser-version-date = { \\$browser } { \\$version } — Date de sortie : { \\$date }\ncompat-browser-version-released = Date de sortie : { \\$date }\n\ncompat-link-report-issue = Signaler des problèmes avec ces données de compatibilité\ncompat-link-report-issue-title = Signaler un problème avec ces données de compatibilité\ncompat-link-report-missing-title = Signaler des données de compatibilité manquantes\ncompat-link-report-missing = Signaler le problème\ncompat-link-source = Voir les données sur GitHub\ncompat-link-source-title = Fichier : { \\$filename }\n\ncompat-deprecated = Obsolète\ncompat-experimental = Expérimental\ncompat-nonstandard = Non standard\ncompat-no = Non\n\ncompat-support-full = Prise en charge complète\ncompat-support-partial = Prise en charge partielle\ncompat-support-no = Pas de prise en charge\ncompat-support-unknown = Prise en charge inconnue\ncompat-support-preview = Pré-version du navigateur\ncompat-support-prefix = Implémenté avec le préfixe vendeur : { \\$prefix }\ncompat-support-altname = Nom alternatif : { \\$altname }\ncompat-support-removed = Supprimé en version { \\$version } et supérieure\ncompat-support-see-impl-url = Voir <a data-l10n-name=\"impl_url\">{ \\$label }</a>\ncompat-support-flags =\n { NUMBER(\\$has_added) ->\n [one] De la version { \\$version_added }\n *[other] {\"\"}\n }{ \\$has_last ->\n [one] { NUMBER(\\$has_added) ->\n *[zero] Jusqu'à { \\$versionLast } des utilisateur·ice·s\n [one] {\" \"}jusqu'à { \\$versionLast } des utilisateur·ice·s\n }\n *[zero] { NUMBER(\\$has_added) ->\n *[zero] Utilisateur·ice·s\n [one] {\" \"}utilisateur·ice·s\n }\n }\n {\" \"}doit explicitement définir\n { \\$flag_type ->\n *[preference] la préférence\n [runtime_flag] l'indicateur d'exécution\n }\n {\" \"}<code data-l10n-name=\"name\">{ \\$flag_name }</code>\n { NUMBER(\\$has_value) ->\n [one] {\" \"}à <code data-l10n-name=\"value\">{ \\$flag_value }</code>\n *[other] {\"\"}\n }{\".\"}\n { NUMBER(\\$has_pref_url) ->\n [one] { \\$flag_type ->\n [preference] Pour changer vos préférences sur le navigateur { \\$browser_name }, visitez { \\$browser_pref_url }.\n *[other] {\"\"}\n }\n *[other] {\"\"}\n }\n\ncompat-legend = Légende\ncompat-legend-tip = Astuce : cliquer/appuyer sur une cellule pour obtenir plus d'informations.\ncompat-legend-yes = { compat-support-full }\ncompat-legend-partial = { compat-support-partial }\ncompat-legend-preview = En cours de développement. Pris en charge dans une pré-version.\ncompat-legend-no = { compat-support-no }\ncompat-legend-unknown = Compatibilité inconnue\ncompat-legend-experimental = { compat-experimental }. Attendez-vous à ce que les comportements changent à l'avenir.\ncompat-legend-nonstandard = { compat-nonstandard }. Vérifiez la compatibilité entre les navigateurs avant utilisation.\ncompat-legend-deprecated = { compat-deprecated }. Ne pas utiliser dans les nouveaux sites web.\ncompat-legend-footnote = Voir les notes de mise en application.\ncompat-legend-disabled = L'utilisateur·ice doit explicitement activer cette fonctionnalité.\ncompat-legend-altname = Utilise un nom hors standard.\ncompat-legend-prefix = Nécessite un préfixe vendeur ou un nom différent pour être utilisé.\ncompat-legend-more = Contient davantage d'informations sur la compatibilité.\n\nplacement-note = Publicité\nplacement-no = Vous ne voulez pas voir de publicités ?\n\npagination-next = Page suivante\npagination-prev = Page précédente\npagination-current = Page actuelle\npagination-goto = Aller à la page { \\$page }\n\nlogout = Se déconnecter\nlogin = Se connecter\nsettings = Mes paramètres\n\nexample-play-button-label = Exécuter\nexample-play-button-title = Exécutez l'exemple dans MDN Playground (ouvre un nouvel onglet)\n\ncontent-feedback-question = Cette page vous a-t-elle été utile ?\ncontent-feedback-reason = Pourquoi cette page ne vous a-t-elle pas été utile ?\ncontent-feedback-thanks = Merci pour votre commentaire !\n\nwriter-reload-polling = Analyse toutes les { \\$seconds }s\n`;","export default `blog-toc-title = この記事では\n\n`;","export default `blog-toc-title = 목차\n`;","export default `blog-toc-title = Neste artigo\n\n`;","export default `blog-toc-title = В этой статье\n`;","export default `blog-toc-title = 在本文中\n`;","export default `blog-toc-title = 在本文中\n`;","import { getSymmetricContext } from \"../symmetric-context/both.js\";\n\nimport getFluentContext from \"./fluent.js\";\n\n/**\n * @import { LitElement } from \"lit\";\n */\n\n/**\n * @template {new (...args: any[]) => LitElement} TBase\n * @param {TBase} Base\n */\nexport const L10nMixin = (Base) =>\n class LocalizedElement extends Base {\n /**\n * @param {...any} args\n */\n constructor(...args) {\n super(...args);\n const context = getSymmetricContext();\n this.locale = context.locale;\n this.l10n = getFluentContext(this.locale);\n }\n };\n","/**\n * Runs on either client or server,\n * and returns the client or server context respectively\n * @returns {import(\"./types.js\").SymmetricContext}\n */\nexport function getSymmetricContext() {\n const serverStore = globalThis.__MDNServerContext?.getStore();\n const clientStore = globalThis.__MDNClientContext;\n return serverStore || clientStore;\n}\n","/**\n * The client-derived values of the symmetric context:\n * this will run within a user's web browser\n * @type {import(\"./types.js\").SymmetricContext}\n */\nglobalThis.__MDNClientContext = {\n locale: globalThis.location.pathname.split(\"/\")[1] || \"en-US\",\n};\n","import GleanMetrics from \"@mozilla/glean/metrics\";\n\n/**\n * Records a click event.\n *\n * Use only if automatic click events are not an option.\n * See: https://mozilla.github.io/glean.js/automatic_instrumentation/click_events/\n *\n * @param {string} source\n */\nexport function gleanClick(source) {\n GleanMetrics.recordElementClick({\n id: source,\n url: globalThis.location.href,\n referrer: document.referrer,\n title: document.title,\n });\n}\n","/**\n * Returns an MDN URL into a Breadcrumb-like string representation.\n *\n * @param {string} url - the full MDN URL (e.g. \"/en-US/docs/Web/HTML/Reference/Elements/a\").\n * @param {string} locale - the locale (to omit)\n * @returns {string} the breadcrumb-like string for the URL.\n */\nexport function mdnUrl2Breadcrumb(url, locale) {\n let parents = url\n .replaceAll(\"_\", \" \")\n .split(\"/\")\n .filter((p) => ![\"\", locale, \"docs\"].includes(p));\n\n // Replace \"API\" for clarity.\n parents = parents.map((p) => (p === \"API\" ? \"Web APIs\" : p));\n\n if (parents.length > 1 && parents.at(0) === \"Web\") {\n // Remove virtual \"Web\" path.\n parents.splice(0, 1);\n }\n\n if (parents.length > 1) {\n // Remove current item.\n parents.splice(-1, 1);\n }\n\n return parents.join(\" / \");\n}\n","const FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME = \"moz-1st-party-data-opt-out\";\n\n/**\n * Checks if user has opted out of first-party data collection.\n * @param {string} [cookie] - An optional mock cookie string to ease unit testing.\n * @returns {boolean} True if user has opted out, false otherwise\n */\nexport function userIsOptedOut(cookie) {\n return (cookie || document.cookie)\n .split(\"; \")\n .includes(`${FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME}=true`);\n}\n"],"names":["n","Promise","Error","Object","document","localStorage","HTMLDetailsElement","e","console","JSON","Number","globalThis","HTMLElement","MDNSearchModal","fetch","t","HTMLInputElement","a","MouseEvent","setTimeout","i","Boolean","URLSearchParams","String","RegExp","customElements","value","HTMLDialogElement","addEventListener","navigator","Array","arguments","encodeURIComponent","Date","Element","HTMLAnchorElement","HTMLIFrameElement","Set","window","Map","decodeURIComponent","WeakMap","IntersectionObserver","Fluent","s"],"mappings":";oNAKI,EAAgC,IAAAA,EAAA,EAAAA,EAAA,QAChC,EAA0B,IAA4B,KACtD,EAAqC,IAAgC,GAEzE,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,CAAC,+tDAA+tD,EAAE,EAAmC,iBAAiB,EAAE,EAAmC,y5BAAy5B,CAAC,CAAE,GAAG,EAEnwF,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,gDCX5B,MAAe,QAAG,CAAC,2NAA2N,CAAC,eCA1Q,IAAI,EAAM,CACR,4BAA6B,CAC3B,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,wBAAyB,CACvB,QACA,OACA,OACD,CACD,kCAAmC,CACjC,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4CAA6C,CAC3C,QACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACA,OACA,OACD,CACD,6BAA8B,CAC5B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACA,OACD,CACD,yBAA0B,CACxB,OACA,OACA,OACA,OACD,CACD,mCAAoC,CAClC,QACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACA,OACD,CACD,4CAA6C,CAC3C,QACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,sBAAuB,CACrB,QACA,OACD,CACD,sCAAuC,CACrC,OACA,OACA,OACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,qBAAsB,CACpB,QACA,OACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,MACD,CACD,iCAAkC,CAChC,MACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACD,CACD,uCAAwC,CACtC,OACA,OACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,gCAAiC,CAC/B,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,6BAA8B,CAC5B,QACA,OACD,CACD,yBAA0B,CACxB,OACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,MACA,MACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,6BAA8B,CAC5B,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACA,OACA,OACA,OACD,CACD,mCAAoC,CAClC,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,0BAA2B,CACzB,QACA,OACD,CACD,0CAA2C,CACzC,QACA,OACA,OACD,CACD,0BAA2B,CACzB,QACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,2BAA4B,CAC1B,QACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,kCAAmC,CACjC,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,MACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,yCAA0C,CACxC,QACA,OACA,OACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACA,OACD,CACD,+CAAgD,CAC9C,QACA,OACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,OACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACD,CACD,6BAA8B,CAC5B,QACA,OACD,AACH,EACA,SAAS,EAAuB,CAAG,EACjC,GAAG,CAAC,EAAoB,CAAC,CAAC,EAAK,GAC7B,OAAOC,QAAQ,OAAO,GAAG,IAAI,CAAC,WAC5B,IAAI,EAAI,AAAIC,MAAM,uBAAyB,EAAM,IAEjD,OADA,EAAE,IAAI,CAAG,mBACH,CACR,GAGF,IAAI,EAAM,CAAG,CAAC,EAAI,CAAE,EAAK,CAAG,CAAC,EAAE,CAC/B,OAAOD,QAAQ,GAAG,CAAC,EAAI,KAAK,CAAC,GAAG,GAAG,CAAC,EAAoB,CAAC,GAAG,IAAI,CAAC,WAC/D,OAAO,EAAoB,EAC7B,EACF,CAEA,EAAuB,IAAI,CAAG,IAAOE,OAAO,IAAI,CAAC,GACjD,EAAuB,EAAE,CAAG,MAC5B,EAAO,OAAO,CAAG,qEC9XjB,GAAI,CACF,IAAM,EAAYC,SAAS,aAAa,CAAC,uBAWzC,SAAS,EAAU,CAAI,EACjB,EACFC,aAAa,OAAO,CAAC,qBAAsB,QAE3CA,aAAa,UAAU,CAAC,qBAE5B,CAhBI,aAAqBC,qBACvB,EAAU,gBAAgB,CAAC,SAAU,KACnC,EAAU,EAAU,IAAI,CAC1B,GACA,EAAU,EAAU,IAAI,EAa5B,CAAE,MAAOC,EAAO,CACdC,QAAQ,IAAI,CAAC,yCAA0CD,EACzD,qJClBO,IAAM,EAAmB,EAAE,CAErB,EAAc,EAAU,cAAe,ICO7C,SAAS,EAAU,CAAI,CAAE,CAAQ,CAAE,CAAO,EAC/C,GAAI,CACF,MAAO,EACLE,KAAK,KAAK,CAAC,EAAO,EAAM,IAAYA,KAAK,SAAS,CAAC,GAEvD,CAAE,KAAM,CACN,OAAO,CACT,CACF,CAOO,SAAS,EAAS,CAAI,CAAE,CAAQ,CAAE,CAAO,EAC9C,IAAM,EAAc,EAAO,EAAM,GAC3B,EAAc,EAAcC,OAAO,QAAQ,CAAC,EAAa,IAAM,EACrE,OAAOA,OAAO,KAAK,CAAC,GAAe,EAAW,CAChD,CAgBA,SAAS,EAAO,CAAI,CAAE,EAAU,CAAC,CAAC,EAChC,GAAM,CAAE,SAAO,CAAE,CAAG,CAAE,QAAS,GAAO,GAAG,CAAO,AAAC,EAC3C,EAAW,CAAC,KAAK,EAAE,EAAK,CAAC,QAC/B,AAAI,GAAW,GACb,EAAiB,IAAI,CAAC,GAEfC,WAAW,OAAO,EAAE,GAAG,CAAC,EAAS,EAAI,EAAO,IAE9C,4EAAqB,CAAC,EAAS,AACxC,CCtDO,IAAM,EDqCJ,ECpCP,uBDmC0C,SClC1C,cAEW,EAAmB,EAAU,mBAAoB,GAAO,CACnE,QAAS,EACX,GACa,EAAO,EAAS,OAAQ,IAAM,CAAE,QAAS,EAAK,GACtB,EAAU,wBAAyB,GAAO,CAC7E,QAAS,EACX,GACO,IAAM,EAAkB,EAAS,kBAAmB,KAAM,CAC/D,QAAS,EACX,GAEa,EDsBJ,ECrBP,iBDoB0C,SCnB1C,iCAEW,EDkBJ,ECjBP,kBDgB0C,SCf1C,2BAGW,EAAa,EAAU,aAAc,IACrC,EDYJ,ECZoC,oBDWD,SCXsB,GAGrD,EAAgB,EAAU,gBAAiB,IAE3C,EDOJ,ECPgC,gBDMG,SCNc,MAC7C,EAAc,EAAU,cAAe,IAOjB,EAAU,sBAAuB,IAE7D,IAAM,EAAc,EAAU,cAAe,GAAO,CAAE,QAAS,EAAK,GAE9D,EDLJ,ECMP,eDP0C,SCQ1C,oCAGW,EDVJ,ECWP,sBDZ0C,SCa1C,mDCnDF,IAAM,EAASP,SAAS,aAAa,CAAC,uCAChC,EAAaA,SAAS,aAAa,CAAC,cACtC,cAAkBQ,aAAe,aAAsBA,aACzD,EAAO,gBAAgB,CAAC,QAAS,KAC/B,IAAM,EAAO,AAAG,CAA4B,SAA5B,EAAW,OAAO,CAAC,IAAI,AAAU,EAAI,QAAQ,EAC7D,GAAW,OAAO,CAAC,IAAI,CAAG,EAC1B,EAAO,YAAY,CAAC,gBAAiB,EACvC,oKCKK,IAAMC,eAAN,MAAMA,sBAAuB,QAAU,IAAU,EACtD,OAAO,IAAM,EAAM,AACnB,QAAO,OAAS,GAAM,AAAC,AAEvB,QAAO,WAAa,CAClB,OAAQ,CAAE,MAAO,EAAK,EACtB,OAAQ,CAAE,MAAO,EAAK,EACtB,UAAW,CAAE,MAAO,EAAK,EACzB,YAAa,CAAE,MAAO,EAAK,CAC7B,CAAE,AAEF,cAAc,CACZ,KAAK,GAEL,IAAI,CAAC,MAAM,CAAG,OACd,IAAI,CAAC,MAAM,CAAG,GACd,IAAI,CAAC,SAAS,CAAG,EACjB,IAAI,CAAC,WAAW,CAAG,GAEnB,IAAI,CAAC,WAAW,CAAG,EACrB,CAEA,MAAM,YAAa,CACb,IAAI,CAAC,MAAM,EAIf,KAAI,CAAC,MAAM,CAAG,IAAI,CAAC,WAAW,EAAC,CACjC,CAEA,MAAM,aAAc,CAClB,IAAM,EAAM,MAAMC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAErD,EAAQ,MAAM,EAAI,IAAI,GAQ5B,MAAO,CACL,KAPW,EAAM,GAAG,CAAC,CAAC,CAAE,OAAK,CAAE,KAAG,CAAE,CAAE,IAAW,EACjD,QACA,MAAO,EAAM,WAAW,GACxB,SAAU,EAAI,KAAK,CAAC,KAAK,GAAG,IAAI,eAAiB,EACnD,IAIE,OACF,CACF,CAEA,WAAY,CACV,IAAI,CAAC,UAAU,GACf,IAAI,CAAC,UAAU,EAAE,cAAc,WAAW,YAC1C,IAAI,CAAC,UAAU,EAAE,cAAc,UAAU,QAC3C,CAGA,OAAO,CAAE,WAAS,CAAEC,OAAAA,CAAM,CAAE,CAAE,CACxBA,aAAkBC,mBACpB,IAAI,CAAC,MAAM,CAAGD,EAAO,KAAK,CACtB,CAAC,IAAI,CAAC,WAAW,EAAI,EAAU,UAAU,CAAC,YAC5C,IAAI,CAAC,WAAW,CAAG,GACnB,QACE,CAAC,qBAAqB,EAAE,AAAc,oBAAd,EAAkC,QAAU,OAAO,CAAC,GAIpF,CAGA,SAASR,CAAK,CAAE,CACd,OAAQA,EAAM,GAAG,EACf,IAAK,UACHA,EAAM,cAAc,GACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAG,GAC9B,KAEF,KAAK,YACHA,EAAM,cAAc,GACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAG,GAC9B,KAEF,KAAK,QAAS,CACZ,GAAM,CAAE,SAAO,CAAE,UAAQ,CAAEU,OAAAA,CAAM,CAAE,SAAO,CAAE,CAAGV,EACzC,EAAO,IAAI,CAAC,gBAAgB,GAC9B,aAAgBK,cAClBL,EAAM,cAAc,GACpB,EAAK,aAAa,CAChB,IAAIW,WAAW,QAAS,CACtB,QAAS,GACT,SAAU,GAGV,UACA,WACAD,OAAAA,EACA,SACF,KAGJ,KACF,CAEA,QACE,MACJ,CACF,CAGA,kBAAmB,CACjB,OAAO,IAAI,CAAC,UAAU,EAAE,cAAc,sBAAwB,IAChE,CAGA,QAAQ,CAAK,CAAE,CACb,IAAM,EAAU,AAAC,KAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAU,GAAK,EAClD,EAAQ,EAAQ,CACtB,KAAI,CAAC,SAAS,CAAG,EAAQ,EAAI,EAAU,EAAQ,EAC/CE,WAAW,KACT,IAAM,EAAO,IAAI,CAAC,gBAAgB,EAC9B,cAAgBP,aAClB,EAAK,cAAc,CAAC,CAClB,SAAU,SACV,MAAO,SACT,EAEJ,EAAG,EACL,CAGA,QAAQL,CAAK,CAAE,CACbA,EAAM,cAAc,GACpB,IAAM,EAAO,IAAI,CAAC,gBAAgB,EAC9B,cAAgBK,aAClB,EAAK,KAAK,EAEd,CAGA,OAAO,CAAE,QAAM,CAAE,CAAE,CACjB,GAAI,aAAkBA,YAAa,CACjC,IAAM,EAAU,EAAO,OAAO,CAAC,iBAC/B,GAAI,aAAmBA,YAAa,CAClC,IAAM,EAAQF,OAAO,QAAQ,CAAC,EAAQ,OAAO,CAAC,MAAM,EAAI,MAAO,IAC1DA,OAAO,KAAK,CAAC,KAChB,IAAI,CAAC,SAAS,CAAG,EACjB,IAAI,CAAC,WAAW,CAAG,GAEvB,MACE,IAAI,CAAC,WAAW,CAAG,EAEvB,CACF,CAGA,eAAeH,CAAK,CAAE,CACpB,IAAMQ,EAASR,EAAM,YAAY,IAAI,CAAC,EAAE,EAAIA,EAAM,MAAM,CAMxD,GAJEQ,aAAkBH,aACjB,EAAC,WAAY,QAAQ,CAAC,QAAQ,CAACG,EAAO,OAAO,GAC5CA,EAAO,iBAAiB,AAAD,EAGzB,OAGF,IAAM,EAAYJ,WAAW,YAAY,IAAI,WACvC,EAAaJ,EAAM,GAAG,CACtB,EAAoBA,EAAM,OAAO,EAAIA,EAAM,OAAO,CAClD,EAAU,AAAe,MAAf,GAAsB,CAAC,EACjCa,EAAU,AAAe,MAAf,GAAsB,GAAqB,CAACb,EAAM,QAAQ,CAEtE,IAAWa,CAAM,IACnBb,EAAM,cAAc,GACpB,QACE,CAAC,+BAA+B,EAAE,EAAU,QAAU,SAAS,CAAC,EAElE,IAAI,CAAC,SAAS,GACV,IACF,IAAI,CAAC,MAAM,CAAG,EACT,IAAI,CAAC,WAAW,GACnB,IAAI,CAAC,WAAW,CAAG,GACnB,QAAW,oCAInB,CAEA,YAAc,IAAI,IAAI,CAAC,IAAI,CAAE,CAC3B,KAAM,IAAM,CAAC,IAAI,CAAC,MAAM,CAAE,IAAI,CAAC,MAAM,CAAC,CACtC,KAAM,MAAO,CAAC,EAAO,EAAM,IACzB,GAAI,AAAC,GAAU,EAGf,KA+He,EAAO,MACpB,EACA,EAjIF,OA+He,EA/HI,EA+HG,EA/HI,MAAM,EAgI9B,EAAe,EAAM,WAAW,GAAG,IAAI,GACvC,EAAI,EAAW,GAWd,AAVc,EAAM,IAAI,CAC5B,MAAM,CAAC,CAAC,CAAE,OAAK,CAAE,GAAK,EAAE,KAAK,CAAC,AAAC,GAAM,EAAM,QAAQ,CAAC,KACpD,GAAG,CAAC,CAAC,CAAE,OAAK,CAAEQ,MAAAA,CAAK,CAAE,UAAQ,CAAE,GAED,CADfL,OAAO,CAACK,EAAO,EAAS,CAAC,QAAQ,CAAC,IACX,EAAM,EAE5C,IAAI,CAAC,CAAC,CAAC,EAAO,CAAE,CAAC,EAAO,GAAK,EAAS,GACtC,GAAG,CAAC,CAAC,CAAC,EAAG,EAAE,GAAK,GAChB,KAAK,CAAC,EAAG,IAEQ,GAAG,CAAC,AAAC,GAAM,GAAK,AAAC,GAAM,KAAK,EAAI,EAAE,AAAD,CAAE,CAAC,EAAE,EAAE,MAAM,CAACM,QA5IzB,CACxC,CACF,EAAG,AAEH,SAAS,CACP,IAAI,CAAC,UAAU,EAAE,cAAc,WAAW,OAC5C,CAEA,mBAAoB,CAClB,KAAK,CAAC,oBACN,IAAI,CAAC,cAAc,CAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EACnDjB,SAAS,gBAAgB,CAAC,UAAW,IAAI,CAAC,cAAc,EACxD,IAAI,CAAC,UAAU,CAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAC3C,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAa,IAAI,CAAC,UAAU,CAC/D,CAEA,sBAAuB,CACrB,KAAK,CAAC,uBACN,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,YAAa,IAAI,CAAC,UAAU,EAChEA,SAAS,mBAAmB,CAAC,UAAW,IAAI,CAAC,cAAc,CAC7D,CAEA,2BAA4B,CAC1B,MAAO,QAAI,CAAC;iBACC,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,CAAC,AACf,CAEA,QAAS,CACP,IAAM,EAAkB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAU,EACpD,EAAY,IAAI,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAIkB,gBAAgB,CAAE,EAAG,IAAI,CAAC,MAAM,AAAC,GAAG,CAAC,CACnE,KACJ,MAAO,QAAI,CAAC;uBACO,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;;;iBAG9C,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;kBAC1B,EAAE,IAAI,CAAC,OAAO,CAAC;;;;;mBAKd,EAAE,IAAI,CAAC,MAAM,CAAC;;;mBAGd,EAAE,IAAI,CAAC,MAAM,CAAC;wBACT,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;uBACrB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;;;;;;gBAO3B,EAAE,GAAQ,CAAC;iBACV,EAAE,IAAI,CAAC,MAAM,CAAC;WACpB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;QAE5B,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CACxB,QAAS,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,EACjD,QAAS,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CACnD,GAAG;;UAED,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CACxB,SAAU,AAAC,GACT,GAAS,IACP,CAAC,CAAE,OAAK,CAAE,KAAG,CAAE,CAAE,SA8FT,MAEhB,EAKA,QArG+B,QAAI,CAAC;qCACP,EAAE,IAAI,CAAC,SAAS,GAAK,EAAE,aAAa,EAAE,EAAE;;2BAElD,EAAE,EAAI;oCACG,EAAE,CAAC,sBAAsB,EAAE,EAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAI,CAAC,CAAC;;yBAE3E,EAAE,QAAkB,EAAK,IAAI,CAAC,MAAM,EAAE;;;yBAGtC,EAqFD,EArFkB,EA4FlC,EAAQ,AAHK,CAFb,EAAQ,EAvFiC,IAAI,CAAC,MAAM,GAyFjC,GAAG,CAAC,AAAC,GAC5B,EAAE,UAAU,CAAC,sBAAuBC,OAAO,GAAG,CAAC,GAAG,CAAC,GAE5B,GAAG,CAAC,AAAC,GAAS,CAAC,CAAC,EAAE,EAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAElD,AADO,EAAM,KAAK,CAAC,AAAIC,OAAO,EAAO,OAEzC,MAAM,CAACH,SACP,GAAG,CAAC,AAAC,GACJ,EAAM,QAAQ,CAAC,EAAK,WAAW,IAAM,QAAI,CAAC,MAAM,EAAE,EAAK,OAAO,CAAC,CAAG,GAjGV;;;;gBAI9C,CAAC,EAEP,GAAG;UACH,EAAE,EACE,QAAI,CAAC;+BACY,EAAE,IAAI,CAAC,SAAS,GAAK,EAAgB;4BACxC,EAAE,EAAgB;;;uBAGvB,EAAE,EAAU;gCACH,EAAE,CAAC,6BAA6B,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;;qBAE3D,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CACf,GAAI,2BACJ,KAAM,CACJ,MAAO,IAAI,CAAC,MAAM,AACpB,EACA,SAAU,CACR,MAAO,CAAE,IAAK,MAAO,CACvB,CACF,GAAG;;;mBAGJ,CAAC,CACN,IAAO,CAAC;;;IAGlB,CAAC,AACH,CAEA,SAAU,CACR,GAAI,IAAI,CAAC,WAAW,CAAE,CACpB,IAAM,EAAW,IAAI,CAAC,gBAAgB,EAClC,cAAoBT,aACtB,EAAS,KAAK,EAElB,CACF,CACF,EA8BO,SAAS,EAAW,CAAI,EAE7B,MAAO,AADP,GAAO,EAAK,IAAI,GAAG,WAAW,EAAC,EACnB,UAAU,CAAC,MAAQ,EAAK,QAAQ,CAAC,KAEzC,EAAK,KAAK,CAAC,SAEX,EAAK,KAAK,CAAC,SACjB,CAnCAa,eAAe,MAAM,CAAC,mBAAoBZ,kCC1StC,kCAnBJ,IAAM,EAAc,CAAE,QAAS,gBAAiB,YAAa,IAAK,EAK5D,EAAe,CACnB,SAAU,KACV,gBAAiB,GACjB,UAAW,KACX,aAAc,GACd,iBAAkB,KAClB,MAAO,KACP,IAAK,EACL,SAAU,IACZ,EAWO,SAAS,WACd,AAAI,IAAW,CACN,IAAIZ,QAAQ,KAAO,IAExB,AAAC,GACH,GAAO,IAAgB,KAAK,CAAC,AAACM,IAC5BC,QAAQ,KAAK,CAACD,GACP,GACR,EAEI,EACT,CAMA,eAAe,IACb,IAAM,EAAW,MAAMO,MAAM,kBAC7B,GAAI,CAAC,EAAS,EAAE,CACd,MAAM,AAAIZ,MAAM,EAAS,UAAU,EAGrC,GAAI,CAIF,IAAM,EAAO,MAAM,EAAS,IAAI,GAC1B,EAAW,GAAM,SACnB,CACE,cACE,AAA0C,WAA1C,OAAO,EAAK,QAAQ,EAAE,gBAClB,EAAK,QAAQ,CAAC,eAAe,CAC7B,KACN,MAAO,EAAK,QAAQ,EAAE,QAAU,IAClC,EACA,EAAa,QAAQ,CAEzB,OADA,EAAS,KAAK,CAAG,GAAU,OAAS,GAC7B,CACL,SAAU,EAAK,QAAQ,EAAI,EAAa,QAAQ,CAChD,gBAAiB,EAAK,gBAAgB,EAAI,EAAa,eAAe,CACtE,UAAW,EAAK,UAAU,EAAI,EAAa,SAAS,CACpD,aAAc,EAAK,aAAa,EAAI,EAAa,YAAY,CAC7D,iBACE,AAA2B,SAA3B,EAAK,iBAAiB,CAClB,WACC,EAAK,iBAAiB,EAAI,EAAa,gBAAgB,CAC9D,MAAO,EAAK,KAAK,EAAI,EAAa,KAAK,CACvC,IAAK,CACH,QAAS,AAAC,GAAK,GAAG,EAAI,EAAK,GAAG,CAAC,OAAO,AAAD,GAAM,EAAY,OAAO,CAC9D,YACE,AAAC,GAAK,GAAG,EAAI,EAAK,GAAG,CAAC,WAAW,AAAD,GAAM,EAAY,WAAW,AACjE,EACA,UACF,CACF,CAAE,KAAM,CACN,MAAM,AAAIA,MAAM,EAAS,UAAU,CACrC,CACF,CAEO,IAAM,EAAW,CACtB,IAAI,MAAMwB,MAAO,CACXA,MACFf,WAAW,YAAY,CAAC,OAAO,CAAC,MAAO,OAEvCA,WAAW,YAAY,CAAC,UAAU,CAAC,MAEvC,EAEA,IAAI,OAAQ,CACV,OAAOA,WAAW,YAAY,EAAE,UAAU,SAAW,KACvD,CACF,qSCvGA,IAAK,IAAM,KAAOP,SAAS,gBAAgB,CACzC,qGACC,CACD,GAAM,CAAE,YAAU,CAAE,CAAG,MAAM,6GAC7B,EAAW,EACb,iCCqBI,AAAE,aAAcuB,kBAAkB,SAAS,EAC7CC,iBAAiB,QAAS,AAACrB,IACzB,IAAM,EAASA,EAAM,YAAY,EAAE,CAAC,EAAE,CACtC,GACE,aAAkBoB,mBAClB,AAAoC,QAApC,EAAO,YAAY,CAAC,YACpB,CACA,IAAM,EAAO,EAAO,qBAAqB,GACnC,CAAE,QAAS,CAAC,CAAE,QAAS,CAAC,CAAE,CAAGpB,CAI/B,AAFF,GAAK,GAAG,EAAI,GAAK,GAAK,EAAK,MAAM,EAAI,EAAK,IAAI,EAAI,GAAK,GAAK,EAAK,KAAK,EAE3D,EAAO,KAAK,EAC3B,CACF,qBC1BI,EAOE,EASA,EAEA,EAGA,4BCxBR,GAAI,IAAU,EAAI,IAAiB,EAAI,CAAC,YDGlC,EACF,AACAsB,UAAU,UAAU,EAEpBlB,WAAW,UAAU,EAErBkB,UAAU,YAAY,CAUlB,EAAU,CATV,EAAkBA,UAAU,SAAS,EASjB,KAAK,CAAC,kBAE1B,EAAO,AADG,gBACK,IAAI,CAAC,GAGpB,EAAW,EAAU,KAAK,CAAC,oBAGjC,AAAI,GAAQ,AAAmC,YAAnC,OAAOC,MAAM,SAAS,CAAC,OAAO,EAmBrB,aAfnB,EAFS,GAAWpB,AAAyC,GAAzCA,OAAO,QAAQ,CAAC,CAAO,CAAC,EAAE,EAAI,IAAK,KAIvD,GACA,GACA,AAtB2B,CAC3B,iBACA,iBACA,iBACD,CAkBsB,QAAQ,CAAC,EAAS,QAAQ,IAGnC,cAKA,EAAE,EAAG,WAAY,EAAG,SAAU,EAAC,CAAC,EAAU,EAAI,gBC3Ca,CACzE,IAAM,EAAWN,SAAS,aAAa,CAAC,UAOxC,SAAS,IACPO,WAAW,SAAS,CAAC,IAAI,CAACoB,UAC5B,CARA,EAAS,KAAK,CAAG,GACjB,EAAS,GAAG,CAAG,CAAC,4CAA4C,EAAEC,mBAAmB,IAAiB,EAAE,CAAC,CACrG5B,SAAS,IAAI,CAAC,MAAM,CAAC,GAErBO,WAAW,SAAS,CAAGA,WAAW,SAAS,EAAI,EAAE,CAMjD,EAAK,KAAM,IAAIsB,MACf,EAAK,SAAU,IAAiB,CAAE,CAChC,aAAc,EAChB,EACF,qDCfA,IAAM,EAAgB,CAAC,kBAAoB,IAAa,AAEpD,KAAW,GACb,mBAAqB,CAAC,WACtB,eAAiB,CAAC,KAGpB,cAAgB,CATK,WASU,EAAe,CAC5C,yBAA0B,GAC1B,6BAA8B,GAC9B,QAAS,IAAa,AACxB,GAEA7B,SAAS,gBAAgB,CAAC,QAAS,AAACG,IAClC,IAAM,EAAiBA,EAAM,YAAY,IAAI,CAAC,EAAE,CAChD,GAAI,IAAmBA,EAAM,MAAM,EAAI,aAA0B2B,QAAS,CAGxE,IAAM,EAAgB,EAAe,OAAO,CAAC,mBAC7C,GAAI,aAAyBtB,YAAa,CACxC,IAAM,EAAU,EAAc,OAAO,CAAC,OAAO,AACzC,IACF,QAAW,EAEf,CACF,CAEA,IAAM,EAAS,GAAkBL,EAAM,MAAM,CAC7C,GAAI,aAAkB2B,QAAS,CAE7B,IAAM,EAAS,EAAO,OAAO,CAAC,IAE5B,cAAkBC,mBAClB,EAAO,IAAI,EACX,EAAO,MAAM,EACb,EAAO,MAAM,GAAK/B,SAAS,QAAQ,CAAC,MAAM,EAE1C,QAAW,CAAC,eAAe,EAAE,EAAO,IAAI,CAAC,CAAC,CAE9C,CACF,+CChDA,IAAK,IAAM,KAAUA,SAAS,gBAAgB,CAAC,wBAC7C,GAAI,aAAkBgC,kBAAmB,CACvC,GAAM,CAAE,QAAM,CAAE,UAAQ,CAAE,CAAG,EAAO,OAAO,CAC3C,GAAI,EAAQ,CAEV,IAAM,EAAiB,CAAC,EAElB,EAAe,EAAE,CAEjB,EAAY,EAAO,UAAU,CAAC,IAAKb,OAAO,GAAG,CAAC,EAAE,CAAC,EACvD,IAAK,IAAMhB,KAAWH,SAAS,gBAAgB,CAC7C,CAAC,eAAe,EAAE,EAAU,iBAAiB,EAAE,EAAU,CAAC,EACzD,CACD,GAAM,CAAE,gBAAc,CAAE,YAAU,CAAE,CAClC,MAAM,6GACF,EACJG,aAAmB,EAAiBA,EAAU,EAAWA,GAC3D,GAAI,EAAa,CACf,EAAa,IAAI,CAAC,GAClB,GAAM,CAAE,UAAQ,CAAE,MAAI,CAAE,CAAG,CAC3B,EAAc,CAAC,EAAS,CACnB,CAAc,CAAC,EAAS,EAAI,EAC5B,CAAc,CAAC,EAAS,CAAG,CAClC,CACF,CAEA,MAAM,yHACN,IAAM,EAASH,SAAS,aAAa,CAAC,0BAStC,IAAK,IAAM,KARX,EAAO,MAAM,CAAG,EAChB,EAAO,IAAI,CAAG,EACd,EAAO,SAAS,CAAG,EACnB,EAAO,KAAK,CAAG,EAAO,KAAK,EAAI,OAC/B,EAAO,OAAO,CAAG,EAAO,OAAO,CAAC,QAAQ,GACxC,EAAO,MAAM,CAAG,EAAO,MAAM,CAC7B,EAAO,OAAO,CAAC,kBAAkB,YAAY,GAEnB,GACxB,EAAY,UAAU,GAAK,CAE/B,CACF,sCC5CF,IAAM,EAAS,IAAIiC,IACnB,IAAK,IAAM9B,KAAWH,SAAS,gBAAgB,CAAC,KAAM,CACpD,IAAMW,EAAMR,EAAQ,OAAO,CAAC,WAAW,GACvC,GAAIQ,EAAI,UAAU,CAAC,SAAWA,AAAQ,wBAARA,EAA+B,CAC3D,IAAM,EAAYA,EAAI,OAAO,CAAC,OAAQ,IACjC,EAAO,GAAG,CAAC,KACd,EAAO,GAAG,CAAC,GAGX,SAAO,CAAC,EAAc,EAAE,EAAU,WAAW,CAAC,EAAE,KAAK,CAAC,AAAC,IACrDP,QAAQ,KAAK,CACX,CAAC,wBAAwB,EAAE,EAAU,uDAAuD,CAAC,CAC7F,EAEJ,GAEJ,CACF,WCjBA,IAAM,EAAUJ,SAAS,aAAa,CAAC,iBACjC,EAAU,GAAS,cAAc,wBACnC,IAAW,aAAmBQ,aAChC,EAAQ,QAAQ,CAAC,CACf,IAAK,EAAQ,SAAS,CAAG0B,OAAO,WAAW,CAAG,CAChD,gCCHF,IAAM,EAAelC,SAAS,aAAa,CAAC,gCAE5C,GAAI,aAAwB+B,kBAAmB,CAC7C,IAAM,EAAS/B,SAAS,aAAa,CAAC,UAElC,cAAkB,gBAAc,CAClC,EAAa,gBAAgB,CAAC,QAAS,AAAC,IACtC,GAAM,CAAE,QAAM,CAAE,CAAG,EAEf,aAAkBQ,cACpB,EAAO,IAAI,GACX,EAAM,cAAc,IAGtB,EAAO,SAAS,EAClB,IAEAJ,QAAQ,KAAK,CAAC,6BACd,EAAa,MAAM,CAAG,GAE1B,WCkEA,IAAK,IAAM,KAAOJ,SAAS,gBAAgB,CACzC,0DAEI,aAAeQ,aACjB,AAxFJ,SAAsB,CAAG,EAEvB,IAAMG,EAAW,IAAI,EAAI,gBAAgB,CAAC,KAAK,CAIzC,EAAmB,IAAIwB,IAC7B,IAAK,IAAM,KAAQxB,EAAS,OAAO,GAAI,CACrC,IAAMA,EAASX,SAAS,aAAa,CACnC,CAAC,KAAK,EAAEoC,mBAAmB,EAAK,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAGpD,GAAI,CAACzB,EACH,SAIF,IAAI,EAAUA,EAAO,OAAO,CAAC,WAE7B,KACE,GACA,aAAmBH,aACnB,CAAC,EAAiB,GAAG,CAAC,IAEtB,EAAiB,GAAG,CAAC,EAAS,GAE9B,EADa,EAAQ,kBAAkB,AAG3C,CAGA,IAAM,EAAwB,IAAI6B,QAG5B,EAAsB,IAAIJ,IAiC1B,EAAU,CACd,UAAW,CACb,EACM,EAASjC,SAAS,aAAa,CAAC,SAClC,cAAkBQ,aACpB,GAAQ,UAAU,CAAG,CAAC,CAAC,EAAE,EAAO,YAAY,CAAC,cAAc,CAAC,AAAD,EAI7D,IAAM,EAAW,IAAI8B,qBAvCD,AAA4CnC,IAC9D,IAAK,GAAM,CAAEQ,OAAAA,CAAM,CAAE,gBAAc,CAAE,GAAIR,EAAS,CAChD,GAAI,CAAEQ,CAAAA,aAAkBH,WAAU,EAChC,SAGF,GAAI,CAAC,EAAoB,GAAG,CAACG,GAC3B,IAAI,EAGF,cAFA,EAAoB,GAAG,CAACA,GAM5B,IAAM,EAAO,EAAiB,GAAG,CAACA,GAElC,GAAI,CAAC,EACH,SAGF,IAAM,EACJ,AAAC,GAAsB,GAAG,CAAC,IAAS,GAAM,GAAiB,EAAI,EAAC,CAElE,GAAK,WAAW,CAAG,EAAe,EAAI,OAAS,KAC/C,EAAsB,GAAG,CAAC,EAAM,EAClC,CACF,EAauD,GAGvD,IAAK,IAAM,KAAW,EAAiB,IAAI,GACzC,EAAS,OAAO,CAAC,EAErB,EAMiB,8DC1FjB,GAAI,CACF,IAAM,EAAO,MAAM,UACb,EAAW,IAAIkB,KAAK5B,aAAa,OAAO,CAAC,cAAgB,GAC/D,GAAIwB,UAAU,UAAU,EAAI,EAAK,eAAe,EAAI,EAAW,IAAII,KAAQ,CACzE,IAAM,EAAS,IAAIX,gBAEnBO,UAAU,UAAU,CAAC,eAAgB,GAErC,IAAM,EAAc,IAAII,KACxB,EAAY,UAAU,CAAC,EAAY,UAAU,GAAK,GAClD,EAAY,WAAW,CAAC,GACxB,EAAY,aAAa,CAAC,GAC1B,EAAY,aAAa,CAAC,GAC1B,EAAY,kBAAkB,CAAC,GAC/B5B,aAAa,OAAO,CAAC,YAAa,EAAY,WAAW,GAC3D,CACF,CAAE,MAAOE,EAAO,CACdC,QAAQ,KAAK,CAAC,sBAAuBD,EACvC,4FCpBA,MAAe,CAAC;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC,CCvIK,EAAS,CACb,QAAS,EACT,GCtBa,CAAC;AAChB;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CD1BC,GEvBa,CAAC;;AAEhB,CAAC,CFsBC,GGxBa,CAAC;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC,CHjIC,GIzBa,CAAC;;AAEhB,CAAC,CJwBC,GK1Ba,CAAC;AAChB,CAAC,CL0BC,QM3Ba,CAAC;;AAEhB,CAAC,CN0BC,GO5Ba,CAAC;AAChB,CAAC,CP4BC,QQ7Ba,CAAC;AAChB,CAAC,CR6BC,QS9Ba,CAAC;AAChB,CAAC,AT8BD,EAEM,EAAe,CAAC,IAAK,SAAU,KAAM,KAAK,CAC1C,EAAqB,CAAC,QAAS,aAAa,CAE3C,IAAMoC,OAAN,MAAMA,OAKX,YAAY,EAAS,OAAO,CAAE,EAAY,EAAE,CAAE,CAC5C,IAAI,CAAC,MAAM,CAAG,EAEd,IAAI,CAAC,QAAQ,CAAGA,OAAO,eAAe,CACpC,IAAI,IAAY,CAAC,EAAQ,CAAE,aAAc,EAAM,GAC/C,CAAC,EAAS,EAGR,EAAU,MAAM,CAAG,GACrB,KAAI,CAAC,MAAM,CAAGA,OAAO,eAAe,CAClC,IAAI,IAAY,CAAC,EAAQ,CAAE,aAAc,EAAM,GAC/C,CAAC,KAAa,EAAU,CAC1B,CAEJ,CAMA,OAAO,gBAAgB,CAAM,CAAE,EAAY,EAAE,CAAE,CAC7C,IAAK,IAAM,KAAK,EAAW,CACzB,IAAM,EAAS,EAAO,WAAW,CAAC,IAAI,IAAc,CAAC,GAAI,CACvD,eAAgB,EAClB,EACI,GAAO,MAAM,CAAG,GAClBnC,QAAQ,KAAK,CAAC,EAElB,CACA,OAAO,CACT,CASA,IAAI,CAAE,CAAE,CAAI,CAAE,CAAI,CAAE,CAAQ,CAAE,CAC5B,IAAM,EAAU,IAAI,CAAC,UAAU,CAAC,EAAI,EAAM,GAC1C,GAAK,EAGL,OAAOmC,OAAO,QAAQ,CAAC,EAAS,EAClC,CAOA,OAAO,SAAS,CAAO,CAAE,EAAW,CAAC,CAAC,CAAE,CAEtC,IAAM,EAAoB,CAAC,EAC3B,IAAK,IAAM,KAAKxC,OAAO,MAAM,CAAC,GAC5B,CAAiB,CAAC,EAAE,GAAG,CAAC,CAAG,IACtBA,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,AAAC,GAAM,AAAM,QAAN,MAC7B,EACJ,CAGH,IAAMc,EAAc,IACfd,OAAO,MAAM,CAAC,GAAU,GAAG,CAAC,AAAC,GAAM,EAAE,GAAG,KACxC,EACJ,CAEGyC,EAAO,GACL,EAAY,EAChB,EACA,CACE,oBACA,YAA2C3B,EAC3C,eAAgB,CAAC,OAAQ,QAAS,SAAS,CAC3C,OAAO,CAAK,EAEV,IAAMjB,EAAO,EAAM,KAAK,CAAC,iBAAiB,CAC1C,GAAIA,EACF,IAAK,GAAM,CAAC,EAAG,EAAE,GAAIG,OAAO,OAAO,CAAC,CAAQ,CAACH,EAAK,EAAI,CAAC,GACrD,EAAM,KAAK,CAAC,EAAE,CAAG,QAGrB,EACE,GAAa,QAAQ,CAAC,EAAM,GAAG,GAC9BA,GACCG,OAAO,IAAI,CAAC,GAAU,QAAQ,CAACH,IAC/B,CAAQ,CAACA,EAAK,EAAE,MAAQ,EAAM,GAAG,IAEnC4C,EAAO,GACA,GAGX,CACF,EACA,IAEF,OAAOA,EAAO,EAAY,QAAW,EACvC,CAUA,WAAW,CAAE,CAAE,CAAI,CAAE,EAAO,CAAC,CAAC,CAAE,EAAS,IAAI,CAAC,MAAM,CAAE,EAAK,EAAK,CAAE,CAChE,IACI,EADE,EAAgB,EAAS,EAAO,UAAU,CAAC,GAAM,OAGvD,GAAI,AAAgB,OAAhB,IAAI,CAAC,MAAM,CACb,MAAO,CAAC,CAAC,EAAE,EAAG,EAAE,EAAO,CAAC,CAAC,EAAE,EAAK,CAAC,CAAG,GAAG,CAAC,CAAC,CAG3C,GAAI,CAAC,EAAe,CAClB,GAAI,EAGF,OAEF,OAAO,IAAI,CAAC,UAAU,CAAC,EAAI,EAAM,EAAM,IAAI,CAAC,QAAQ,CAAE,GACxD,CAEA,GAAI,EAEF,IAAI,CADJ,GAAU,EAAc,UAAU,CAAC,EAAK,AAAD,EACzB,CACZ,GAAI,EAGF,OAEF,OAAO,IAAI,CAAC,UAAU,CAAC,EAAI,EAAM,EAAM,IAAI,CAAC,QAAQ,CAAE,GACxD,OACS,EAAc,KAAK,EAC5B,GAAU,EAAc,KAAK,AAAD,EAG9B,GAAI,CAAC,GAAW,CAAC,EACf,MAAO,GAIT,IAAM,EAAS,EAAE,CACX,EAAY,GAAQ,cAAc,EAAS,EAAM,GAIvD,OAHI,EAAO,MAAM,CAAG,GAClBpC,QAAQ,KAAK,CAAC,GAET,CACT,CACF,EAGA,IAAM,EAAS,IAAI+B,IAKnB,SAAS,EAAU,CAAM,EACvB,GAAK,GAGL,GAAI,CAAC,EAAO,GAAG,CAAC,GAAS,CACvB,IAAM,EAAM,CAAM,CAAC,EAAO,CACpB,EAAU,IAAII,OAAO,EAAQ,EAAM,CAAC,EAAI,CAAG,QACjD,EAAO,GAAG,CAAC,EAAQ,EACrB,CACA,OAAO,EAAO,GAAG,CAAC,GACpB,CUrMO,IAAM,EAAY,AAAC,GACxB,cAA+B,EAI7B,YAAY,GAAG,CAAI,CAAE,KCXjB,EACA,EDWF,KAAK,IAAI,GACT,IAAM,GCbJ,EAAchC,WAAW,kBAAkB,EAAE,WAC7C,EAAcA,WAAW,kBAAkB,CAC1C,GAAe,EDYlB,KAAI,CAAC,MAAM,CAAG,EAAQ,MAAM,CAC5B,IAAI,CAAC,IAAI,CAAG,AViMH,SAA0B,CAAM,EAmB7C,SAAS,EAAK,CAAW,CAAE,CAAQ,EACjC,GAAI,AAAuB,UAAvB,OAAO,EAA0B,CAInC,IAAM,EAAkB,EAAU,IAAS,IADhC,GAEL,EAAiB,CAAC,CAAC,EAFd,EAEmB,CAAC,CAAC,CAE1B,EAAM,AAAC,IAGX,IAAMI,EAAiB,CAAO,CAAC,EAAE,CACjC,OAAO,GAAmBA,GAAkB,CAC9C,EASA,OARA,EAAI,QAAQ,CAAG,IAIX,AAA4B,UAA3B,OAAO,GAAgC,GACxC,EAGG,CACT,CAMA,OAAO,AADgB,AADP,CACc,CAAC,EAAE,EACR,EAC3B,CAaA,OARA,EAAK,GAAG,CAAG,SAAU,CAAE,IAAE,CAAE,MAAI,CAAEE,KAAAA,CAAI,CAAE,UAAQ,CAAE,EAC/C,IAAM,EAAS,EAAU,UACzB,AAAI,EACK,EAAO,GAAG,CAAC,EAAI,EAAMA,EAAM,GAE7B,CAAC,CAAC,EAAE,EAAG,CAAC,CAAC,AAClB,EAEO,CACT,EUhQmC,IAAI,CAAC,MAAM,CAC1C,CACF,WElBFN,WAAW,kBAAkB,CAAG,CAC9B,OAAQA,WAAW,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAI,OACxD,gDCGO,SAAS,EAAW,CAAM,EAC/B,sBAA+B,CAAC,CAC9B,GAAI,EACJ,IAAKA,WAAW,QAAQ,CAAC,IAAI,CAC7B,SAAUP,SAAS,QAAQ,CAC3B,MAAOA,SAAS,KAAK,AACvB,EACF,iCCVO,SAAS,EAAkB,CAAG,CAAE,CAAM,EAC3C,IAAI,EAAU,EACX,UAAU,CAAC,IAAK,KAChB,KAAK,CAAC,KACN,MAAM,CAAC,AAAC,GAAM,CAAC,CAAC,GAAI,EAAQ,OAAO,CAAC,QAAQ,CAAC,IAehD,MAVI,AAFJ,GAAU,EAAQ,GAAG,CAAC,AAAC,GAAO,AAAM,QAAN,EAAc,WAAa,EAAE,EAE/C,MAAM,CAAG,GAAK,AAAkB,QAAlB,EAAQ,EAAE,CAAC,IAEnC,EAAQ,MAAM,CAAC,EAAG,GAGhB,EAAQ,MAAM,CAAG,GAEnB,EAAQ,MAAM,CAAC,GAAI,GAGd,EAAQ,IAAI,CAAC,MACtB,iCCpBO,SAAS,EAAe,CAAM,EACnC,MAAO,AAAC,IAAUA,SAAS,MAAM,AAAD,EAC7B,KAAK,CAAC,MACN,QAAQ,CAAC,kCACd"}
1
+ {"version":3,"file":"index.a845f20de1913b16.js","sources":["webpack://@mdn/fred/./components/search-modal/element.css","webpack://@mdn/fred/./components/icon/cancel.svg","webpack://@mdn/fred/./components|lazy|/^\\.\\/.*\\/element\\.js$/|groupOptions: {}|strict namespace object","webpack://@mdn/fred/./components/baseline-indicator/hook.js","webpack://@mdn/fred/./components/env/runtime.js","webpack://@mdn/fred/./components/env/utils.js","webpack://@mdn/fred/./components/env/index.js","webpack://@mdn/fred/./components/navigation/hook.js","webpack://@mdn/fred/./components/search-modal/element.js","webpack://@mdn/fred/./components/user/context.js","webpack://@mdn/fred/./hooks/code-examples.js","webpack://@mdn/fred/./hooks/dialog-closedby.js","webpack://@mdn/fred/./utils/dnt-helper.js","webpack://@mdn/fred/./hooks/ga-init.js","webpack://@mdn/fred/./hooks/glean-init.js","webpack://@mdn/fred/./hooks/live-samples.js","webpack://@mdn/fred/./hooks/load-elements.js","webpack://@mdn/fred/./hooks/sidebar-scroll-to-current.js","webpack://@mdn/fred/./hooks/skip-to-search.js","webpack://@mdn/fred/./hooks/toc-highlight.js","webpack://@mdn/fred/./hooks/user-ping.js","webpack://@mdn/fred/./l10n/en-US.ftl","webpack://@mdn/fred/./l10n/fluent.js","webpack://@mdn/fred/./l10n/de.ftl","webpack://@mdn/fred/./l10n/es.ftl","webpack://@mdn/fred/./l10n/fr.ftl","webpack://@mdn/fred/./l10n/ja.ftl","webpack://@mdn/fred/./l10n/ko.ftl","webpack://@mdn/fred/./l10n/pt-BR.ftl","webpack://@mdn/fred/./l10n/ru.ftl","webpack://@mdn/fred/./l10n/zh-CN.ftl","webpack://@mdn/fred/./l10n/zh-TW.ftl","webpack://@mdn/fred/./l10n/mixin.js","webpack://@mdn/fred/./symmetric-context/both.js","webpack://@mdn/fred/./symmetric-context/client.js","webpack://@mdn/fred/./utils/glean.js","webpack://@mdn/fred/./utils/mdn-url2breadcrumb.js","webpack://@mdn/fred/./utils/telemetry-opt-out.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/search.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*,:after,:before{box-sizing:border-box}dialog{border:0;padding:0}@media (width > 1006px){dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;font-size:var(--font-size-large);margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}dialog::backdrop{--csstools-light-dark-toggle-dee8eb9e-0:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle-dee8eb9e-0,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}}@media (width <= 1006px){dialog{font-size:var(--font-size-normal);height:100%;margin:0;max-height:100%;max-width:100%;width:100%}}dialog[open]{display:grid;grid-template-areas:\"search close\" \"progress progress\" \"results results\";grid-template-columns:1fr min-content;grid-template-rows:var(--navigation-height) min-content min-content}progress{grid-area:progress;margin:0 1rem .5rem}@media (width <= 1006px){progress{margin-inline:.3rem}}.close{font-size:1.37rem;grid-area:close}@media (width > 1006px){.close{display:none}}form{display:grid;gap:.5rem;grid-area:search;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}@media (width <= 1006px){form{align-self:center;background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;margin-left:.3rem;padding:.5rem}}form:before{background-color:var(--color-border-secondary);content:\"\";height:1em;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{grid-area:results;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue);border-color:var(--color-blue-50)}li{border-inline-start:2px solid #0000;list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{background-color:var(--color-background-yellow);color:var(--color-text-primary)}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>`;","var map = {\n \"./code-example/element.js\": [\n \"84352\",\n \"6703\",\n \"6203\",\n \"1861\",\n \"6475\",\n \"7065\",\n \"7517\"\n ],\n \"./dropdown/element.js\": [\n \"58623\",\n \"2868\",\n \"4740\"\n ],\n \"./live-sample-result/element.js\": [\n \"47849\",\n \"6703\",\n \"3611\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"1861\",\n \"5330\"\n ],\n \"./observatory-tests-and-scores/element.js\": [\n \"56538\",\n \"6407\"\n ],\n \"./play-runner/element.js\": [\n \"63657\",\n \"6703\",\n \"5950\",\n \"4098\",\n \"4074\"\n ],\n \"./search-button/element.js\": [\n \"23745\",\n \"3690\"\n ],\n \"./survey/element.js\": [\n \"70134\",\n \"6703\",\n \"6203\",\n \"2105\",\n \"2283\"\n ],\n \"./ix-tab-wrapper/element.js\": [\n \"49979\",\n \"2568\"\n ],\n \"./placement-sidebar/element.js\": [\n \"57468\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"2173\"\n ],\n \"./placement-hp-main/element.js\": [\n \"44394\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"4759\"\n ],\n \"./record-visit/element.js\": [\n \"55237\",\n \"5562\",\n \"3094\"\n ],\n \"./toggle-sidebar/element.js\": [\n \"27486\",\n \"6203\",\n \"2415\"\n ],\n \"./user-menu/element.js\": [\n \"7247\",\n \"6203\",\n \"2105\",\n \"7748\"\n ],\n \"./interactive-example/element.js\": [\n \"81505\",\n \"6703\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"1356\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"6760\",\n \"3047\",\n \"1861\",\n \"2448\",\n \"6475\",\n \"4419\",\n \"7065\",\n \"2568\",\n \"5338\",\n \"5722\"\n ],\n \"./copy-button/element.js\": [\n \"38262\",\n \"6203\",\n \"6475\",\n \"4660\"\n ],\n \"./observatory-comparison-table/element.js\": [\n \"50117\",\n \"9410\",\n \"2006\"\n ],\n \"./sidebar-filter/element.js\": [\n \"83703\",\n \"9324\"\n ],\n \"./issues-table/element.js\": [\n \"37511\",\n \"4204\"\n ],\n \"./scrim-inline/element.js\": [\n \"43602\",\n \"3611\",\n \"5183\"\n ],\n \"./switch/element.js\": [\n \"41798\",\n \"9099\"\n ],\n \"./collection-save-button/element.js\": [\n \"1355\",\n \"6203\",\n \"3000\",\n \"4920\"\n ],\n \"./contributor-list/element.js\": [\n \"23082\",\n \"9127\"\n ],\n \"./button/element.js\": [\n \"17398\",\n \"6203\",\n \"9898\"\n ],\n \"./homepage-search/element.js\": [\n \"27373\",\n \"7678\"\n ],\n \"./modal/element.js\": [\n \"14903\",\n \"6203\",\n \"3000\"\n ],\n \"./color-theme/element.js\": [\n \"55269\",\n \"2868\",\n \"544\"\n ],\n \"./about-team-member/element.js\": [\n \"612\",\n \"8981\"\n ],\n \"./content-feedback/element.js\": [\n \"83818\",\n \"6203\",\n \"4891\"\n ],\n \"./play-console/element.js\": [\n \"71787\",\n \"6760\"\n ],\n \"./ix-tab/element.js\": [\n \"18977\",\n \"4419\",\n \"5338\"\n ],\n \"./observatory-header-link/element.js\": [\n \"1879\",\n \"9410\",\n \"3676\"\n ],\n \"./curriculum-tabs/element.js\": [\n \"52500\",\n \"9717\"\n ],\n \"./placement-bottom/element.js\": [\n \"7895\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"4060\"\n ],\n \"./image-history/element.js\": [\n \"47706\",\n \"1975\"\n ],\n \"./not-found/element.js\": [\n \"2622\",\n \"8926\",\n \"3555\"\n ],\n \"./placement-note/element.js\": [\n \"47764\",\n \"1477\"\n ],\n \"./compat-table-lazy/element.js\": [\n \"96678\",\n \"2105\",\n \"718\",\n \"251\"\n ],\n \"./site-search/element.js\": [\n \"41425\",\n \"6203\",\n \"9578\"\n ],\n \"./placement-no/element.js\": [\n \"13755\",\n \"8280\"\n ],\n \"./play-controller/element.js\": [\n \"23731\",\n \"2448\"\n ],\n \"./placement-top/element.js\": [\n \"9951\",\n \"6703\",\n \"3611\",\n \"8280\",\n \"1477\",\n \"5649\",\n \"9204\"\n ],\n \"./observatory-form/element.js\": [\n \"17547\",\n \"6703\",\n \"6203\",\n \"6110\",\n \"8364\"\n ],\n \"./observatory-results/element.js\": [\n \"13430\",\n \"6203\",\n \"9410\",\n \"2868\",\n \"6110\",\n \"2006\",\n \"7593\",\n \"3676\",\n \"4070\",\n \"3259\"\n ],\n \"./about-tabs/element.js\": [\n \"54842\",\n \"7047\"\n ],\n \"./observatory-human-duration/element.js\": [\n \"37077\",\n \"9410\",\n \"4070\"\n ],\n \"./playground/element.js\": [\n \"93075\",\n \"6703\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"6203\",\n \"5950\",\n \"4098\",\n \"6760\",\n \"3047\",\n \"2448\",\n \"3000\",\n \"7584\"\n ],\n \"./ix-tab-panel/element.js\": [\n \"89854\",\n \"4419\"\n ],\n \"./play-editor/element.js\": [\n \"63386\",\n \"749\",\n \"3730\",\n \"3106\",\n \"993\",\n \"6216\",\n \"2080\",\n \"640\",\n \"9515\",\n \"5950\",\n \"3047\"\n ],\n \"./themed-image/element.js\": [\n \"48125\",\n \"5102\"\n ],\n \"./writer-open-editor/element.js\": [\n \"51310\",\n \"6203\",\n \"9967\"\n ],\n \"./progress-bar/element.js\": [\n \"20141\",\n \"6110\"\n ],\n \"./compat-table/element.js\": [\n \"72301\",\n \"2105\",\n \"718\"\n ],\n \"./login-button/element.js\": [\n \"70242\",\n \"6203\",\n \"6067\"\n ],\n \"./observatory-rescan-button/element.js\": [\n \"14416\",\n \"6203\",\n \"7593\",\n \"3140\"\n ],\n \"./recently-visited/element.js\": [\n \"95821\",\n \"5562\",\n \"5246\"\n ],\n \"./language-always-redirect-button/element.js\": [\n \"77108\",\n \"8300\",\n \"5685\"\n ],\n \"./language-switcher/element.js\": [\n \"64786\",\n \"2868\",\n \"9099\",\n \"8926\",\n \"8300\",\n \"5667\"\n ],\n \"./search-modal/element.js\": [\n \"97154\"\n ],\n \"./writer-reload/element.js\": [\n \"14925\",\n \"4366\"\n ]\n};\nfunction __rspack_async_context(req) {\n if(!__webpack_require__.o(map, req)) {\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n }\n\n var ids = map[req], id = ids[0];\n return Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n return __webpack_require__(id);\n });\n}\n\n__rspack_async_context.keys = () => (Object.keys(map));\n__rspack_async_context.id = 98693;\nmodule.exports = __rspack_async_context;\n","try {\n const indicator = document.querySelector(\".baseline-indicator\");\n if (indicator instanceof HTMLDetailsElement) {\n indicator.addEventListener(\"toggle\", () => {\n saveState(indicator.open);\n });\n saveState(indicator.open);\n }\n\n /**\n * @param {boolean} open\n */\n function saveState(open) {\n if (open) {\n localStorage.setItem(\"baseline-indicator\", \"open\");\n } else {\n localStorage.removeItem(\"baseline-indicator\");\n }\n }\n} catch (error) {\n console.warn(\"Unable to attach to baseline indicator\", error);\n}\n","import { parseBool } from \"./utils.js\";\n\n/** @type {string[]} */\nexport const runtimeVariables = [];\n/** Overriden to prod default (false) in rspack config, set to true so it works in dev server by default. */\nexport const RUNTIME_ENV = parseBool(\"RUNTIME_ENV\", true);\n","import { RUNTIME_ENV, runtimeVariables } from \"./runtime.js\";\n\n/**\n * @typedef {object} Options\n * @property {boolean} [runtime] Allow setting this value at runtime\n */\n\n/**\n * @param {string} name\n * @param {boolean} fallback\n * @param {Options} [options]\n */\nexport function parseBool(name, fallback, options) {\n try {\n return Boolean(\n JSON.parse(getEnv(name, options) || JSON.stringify(fallback)),\n );\n } catch {\n return fallback;\n }\n}\n\n/**\n * @param {string} name\n * @param {number} fallback\n * @param {Options} [options]\n */\nexport function parseInt(name, fallback, options) {\n const stringValue = getEnv(name, options);\n const numberValue = stringValue ? Number.parseInt(stringValue, 10) : fallback;\n return Number.isNaN(numberValue) ? fallback : numberValue;\n}\n\n/**\n * @param {string} name\n * @param {string} fallback\n * @param {Options} [options]\n */\nexport function parseString(name, fallback, options) {\n return getEnv(name, options) || fallback;\n}\n\n/**\n * @param {string} name\n * @param {Options} [options]\n * @returns {string | undefined}\n */\nfunction getEnv(name, options = {}) {\n const { runtime } = { runtime: false, ...options };\n const fullName = `FRED_${name}`;\n if (runtime && RUNTIME_ENV) {\n runtimeVariables.push(fullName);\n // safely navigate if process is not defined\n return globalThis.process?.env[fullName] || getEnv(name);\n }\n return globalThis.__MDNEnv?.[fullName];\n}\n","import { parseBool, parseInt, parseString } from \"./utils.js\";\n\nexport const PLAYGROUND_BASE_HOST = parseString(\n \"PLAYGROUND_BASE_HOST\",\n \"mdnplay.dev\",\n);\nexport const PLAYGROUND_LOCAL = parseBool(\"PLAYGROUND_LOCAL\", false, {\n runtime: true,\n});\nexport const PORT = parseInt(\"PORT\", 3000, { runtime: true });\nexport const OPEN_BROWSER_ON_START = parseBool(\"OPEN_BROWSER_ON_START\", false, {\n runtime: true,\n});\nexport const PLAYGROUND_PORT = parseInt(\"PLAYGROUND_PORT\", 3001, {\n runtime: true,\n});\n\nexport const FXA_SIGNIN_URL = parseString(\n \"FXA_SIGNIN_URL\",\n \"/users/fxa/login/authenticate/\",\n);\nexport const FXA_SIGNOUT_URL = parseString(\n \"FXA_SIGNOUT_URL\",\n \"/users/fxa/login/logout/\",\n);\n\nexport const GA_ENABLED = parseBool(\"GA_ENABLED\", false);\nexport const GA_MEASUREMENT_ID = parseString(\"GA_MEASUREMENT_ID\", \"\");\n\n/** Set to non-prod default, because we don't want glean to run without explicitly enabling. */\nexport const GLEAN_ENABLED = parseBool(\"GLEAN_ENABLED\", false);\n/** Set to non-prod default, because we don't want glean to run without explicitly enabling. */\nexport const GLEAN_CHANNEL = parseString(\"GLEAN_CHANNEL\", \"dev\");\nexport const GLEAN_DEBUG = parseBool(\"GLEAN_DEBUG\", false);\n\n/**\n * While there is a risk from not including the `noindex` meta tag on stage etc, we have a\n * `robots.txt` in place, and the effect of accidentally including it on prod is far worse:\n * so this must be the prod default.\n */\nexport const ROBOTS_GLOBAL_ALLOW = parseBool(\"ROBOTS_GLOBAL_ALLOW\", true);\n\nexport const WRITER_MODE = parseBool(\"WRITER_MODE\", false, { runtime: true });\n\nexport const BCD_BASE_URL = parseString(\n \"BCD_BASE_URL\",\n \"https://bcd.developer.mozilla.org\",\n);\n\nexport const OBSERVATORY_API_URL = parseString(\n \"OBSERVATORY_API_URL\",\n \"https://observatory-api.mdn.mozilla.net\",\n);\n","const button = document.querySelector(`[aria-controls=\"navigation__popup\"]`);\nconst navigation = document.querySelector(\".navigation\");\nif (button instanceof HTMLElement && navigation instanceof HTMLElement) {\n button.addEventListener(\"click\", () => {\n const open = (!(navigation.dataset.open === \"true\")).toString();\n navigation.dataset.open = open;\n button.setAttribute(\"aria-expanded\", open);\n });\n}\n","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\n\nimport { gleanClick } from \"../../utils/glean.js\";\nimport { mdnUrl2Breadcrumb } from \"../../utils/mdn-url2breadcrumb.js\";\n\nimport exitIcon from \"../icon/cancel.svg?lit\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNSearchModal extends L10nMixin(LitElement) {\n static ssr = false;\n static styles = styles;\n\n static properties = {\n _index: { state: true },\n _query: { state: true },\n _selected: { state: true },\n _shiftFocus: { state: true },\n };\n\n constructor() {\n super();\n /** @type {Promise<import(\"./types.js\").SearchIndex> | undefined} */\n this._index = undefined;\n this._query = \"\";\n this._selected = 0;\n this._shiftFocus = false;\n /** Capture whether user has engaged with the search. */\n this._hasEngaged = false;\n }\n\n async _loadIndex() {\n if (this._index) {\n return;\n }\n\n this._index = this._fetchIndex();\n }\n\n async _fetchIndex() {\n const res = await fetch(`/${this.locale}/search-index.json`);\n /** @type {import(\"./types.js\").SearchIndexItem[]} */\n const items = await res.json();\n /** @type {import(\"./types.js\").SearchIndexFlexItem[]} */\n const flex = items.map(({ title, url }, index) => ({\n index,\n title: title.toLowerCase(),\n slugTail: url.split(\"/\").pop()?.toLowerCase() || \"\",\n }));\n\n return {\n flex,\n items,\n };\n }\n\n showModal() {\n this._loadIndex();\n this.shadowRoot?.querySelector(\"dialog\")?.showModal();\n this.shadowRoot?.querySelector(\"input\")?.select();\n }\n\n /** @param {InputEvent} event */\n _input({ inputType, target }) {\n if (target instanceof HTMLInputElement) {\n this._query = target.value;\n if (!this._hasEngaged && inputType.startsWith(\"insert\")) {\n this._hasEngaged = true;\n gleanClick(\n `quick-search-change: ${inputType === \"insertFromPaste\" ? \"paste\" : \"type\"}`,\n );\n }\n }\n }\n\n /** @param {KeyboardEvent} event */\n _keydown(event) {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n this._select(this._selected - 1);\n break;\n }\n case \"ArrowDown\":\n event.preventDefault();\n this._select(this._selected + 1);\n break;\n\n case \"Enter\": {\n const { ctrlKey, shiftKey, altKey, metaKey } = event;\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n event.preventDefault();\n item.dispatchEvent(\n new MouseEvent(\"click\", {\n bubbles: true,\n composed: true,\n // we attempt to pass modifier keys through\n // but browser support is incredibly varied:\n ctrlKey,\n shiftKey,\n altKey,\n metaKey,\n }),\n );\n }\n break;\n }\n\n default:\n return;\n }\n }\n\n /** @returns {HTMLElement|null} */\n _getSelectedItem() {\n return this.shadowRoot?.querySelector(\"[data-selected] a\") ?? null;\n }\n\n /** @param {number} index */\n _select(index) {\n const results = (this._queryIndex.value?.length || 0) + 1;\n const value = index % results;\n this._selected = value < 0 ? results + index : value;\n setTimeout(() => {\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, 0);\n }\n\n /** @param {SubmitEvent} event */\n _submit(event) {\n event.preventDefault();\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.click();\n }\n }\n\n /** @param {FocusEvent} event */\n _focus({ target }) {\n if (target instanceof HTMLElement) {\n const focused = target.closest(\"[data-result]\");\n if (focused instanceof HTMLElement) {\n const index = Number.parseInt(focused.dataset.result || \"NaN\", 10);\n if (!Number.isNaN(index)) {\n this._selected = index;\n this._shiftFocus = true;\n }\n } else {\n this._shiftFocus = false;\n }\n }\n }\n\n /** @param {KeyboardEvent} event */\n _globalKeydown(event) {\n const target = event.composedPath()?.[0] || event.target;\n const isTextField =\n target instanceof HTMLElement &&\n ([\"TEXTAREA\", \"INPUT\"].includes(target.tagName) ||\n target.isContentEditable);\n\n if (isTextField) {\n return;\n }\n\n const selection = globalThis.getSelection()?.toString();\n const keyPressed = event.key;\n const ctrlOrMetaPressed = event.ctrlKey || event.metaKey;\n const isSlash = keyPressed === \"/\" && !ctrlOrMetaPressed;\n const isCtrlK = keyPressed === \"k\" && ctrlOrMetaPressed && !event.shiftKey;\n\n if (isSlash || isCtrlK) {\n event.preventDefault();\n gleanClick(\n `quick-search-open: keyboard -> ${isSlash ? \"slash\" : \"ctrl-k\"}`,\n );\n this.showModal();\n if (selection) {\n this._query = selection;\n if (!this._hasEngaged) {\n this._hasEngaged = true;\n gleanClick(\"quick-search-change: selection\");\n }\n }\n }\n }\n\n _queryIndex = new Task(this, {\n args: () => [this._index, this._query],\n task: async ([index, query]) => {\n if (!index || !query) {\n return;\n }\n return quickSearch(query, await index);\n },\n });\n\n _close() {\n this.shadowRoot?.querySelector(\"dialog\")?.close();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._globalKeydown = this._globalKeydown.bind(this);\n document.addEventListener(\"keydown\", this._globalKeydown);\n this._loadIndex = this._loadIndex.bind(this);\n this.renderRoot.addEventListener(\"mouseover\", this._loadIndex);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.renderRoot.removeEventListener(\"mouseover\", this._loadIndex);\n document.removeEventListener(\"keydown\", this._globalKeydown);\n }\n\n _renderLoadingSearchIndex() {\n return html`<progress\n aria-label=${this.l10n`Loading search index…`}\n ></progress>`;\n }\n\n render() {\n const siteSearchIndex = this._queryIndex.value?.length || 0;\n const searchUrl = this._query\n ? `/${this.locale}/search?${new URLSearchParams({ q: this._query })}`\n : null;\n return html`\n <dialog @keydown=${this._keydown} @focusin=${this._focus} closedby=\"any\">\n <form\n method=\"get\"\n action=${`/${this.locale}/search`}\n @submit=${this._submit}\n >\n <input\n type=\"search\"\n name=\"q\"\n .value=${this._query}\n autocomplete=\"off\"\n autofocus\n @input=${this._input}\n placeholder=${this.l10n`Search`}\n aria-label=${this.l10n`Search`}\n />\n </form>\n <mdn-button\n class=\"close\"\n variant=\"plain\"\n icon-only\n .icon=${exitIcon}\n @click=${this._close}\n >${this.l10n`Exit search`}</mdn-button\n >\n ${this._queryIndex.render({\n initial: this._renderLoadingSearchIndex.bind(this),\n pending: this._renderLoadingSearchIndex.bind(this),\n })}\n <ul>\n ${this._queryIndex.render({\n complete: (results) =>\n results?.map(\n ({ title, url }, i) => html`\n <li ?data-selected=${this._selected === i} data-result=${i}>\n <a\n href=${url}\n data-glean-id=${`quick-search: results[${1 + i}] -> ${this._query} -> ${url}`}\n ><span class=\"slug\"\n >${mdnUrl2Breadcrumb(url, this.locale)}</span\n >\n <span class=\"title\"\n >${HighlightMatch(title, this._query)}</span\n ></a\n >\n </li>\n `,\n ),\n })}\n ${searchUrl\n ? html`<li\n ?data-selected=${this._selected === siteSearchIndex}\n data-result=${siteSearchIndex}\n >\n <a\n href=${searchUrl}\n data-glean-id=${`quick-search: site-search -> ${this._query}`}\n ><span class=\"title\"\n >${this.l10n.raw({\n id: \"search-modal-site-search\",\n args: {\n query: this._query,\n },\n elements: {\n query: { tag: \"code\" },\n },\n })}</span\n ></a\n >\n </li>`\n : nothing}\n </ul>\n </dialog>\n `;\n }\n\n updated() {\n if (this._shiftFocus) {\n const selected = this._getSelectedItem();\n if (selected instanceof HTMLElement) {\n selected.focus();\n }\n }\n }\n}\n\ncustomElements.define(\"mdn-search-modal\", MDNSearchModal);\n\n/**\n * @param {string} input\n * @param {import(\"./types.js\").SearchIndex} index\n * @returns {import(\"./types.js\").SearchResultItem[]}\n */\nfunction quickSearch(input, index) {\n const inputValueLC = input.toLowerCase().trim();\n const q = splitQuery(input);\n const indexResults = index.flex\n .filter(({ title }) => q.every((q) => title.includes(q)))\n .map(({ index, title, slugTail }) => {\n const exact = Number([title, slugTail].includes(inputValueLC));\n return /** @type {const} */ ([exact, index]);\n })\n .sort(([aExact], [bExact]) => bExact - aExact) // Boost exact matches.\n .map(([_, i]) => i)\n .slice(0, 10);\n\n return indexResults.map((i) => i && (index.items || [])[i]).filter(Boolean);\n}\n\n/**\n * Used by quicksearch and sidebar filters.\n * @param {string} term\n * @returns {string[]}\n */\nexport function splitQuery(term) {\n term = term.trim().toLowerCase();\n return term.startsWith(\".\") || term.endsWith(\".\")\n ? // Dot is probably meaningful.\n term.split(/[ ,]+/)\n : // Dot is probably just a word separator.\n term.split(/[ ,.]+/);\n}\n\n/**\n * @param {string} title\n * @param {string} query\n */\nfunction HighlightMatch(title, query) {\n // Split on highlight term and include term into parts, ignore case.\n const words = splitQuery(query);\n // $& means the whole matched string\n const regexWords = words.map((s) =>\n s.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`),\n );\n const regex = regexWords.map((word) => `(${word})`).join(\"|\");\n const parts = title.split(new RegExp(regex, \"gi\"));\n return parts\n .filter(Boolean)\n .map((part) =>\n words.includes(part.toLowerCase()) ? html`<mark>${part}</mark>` : part,\n );\n}\n","/**\n * @import * as User from \"../user/types.js\";\n */\n\nimport { WRITER_MODE } from \"../env/index.js\";\n\nconst DEFAULT_GEO = { country: \"United States\", country_iso: \"US\" };\n\n/**\n * @type {User.User}\n */\nconst DEFAULT_USER = {\n username: null,\n isAuthenticated: false,\n avatarUrl: null,\n isSubscriber: false,\n subscriptionType: null,\n email: null,\n geo: DEFAULT_GEO,\n settings: null,\n};\n\n/**\n * @type {Promise<User.User> | undefined}\n */\nlet USER;\n\n/**\n *\n * @returns {Promise<User.User>}\n */\nexport function globalUser() {\n if (WRITER_MODE) {\n return new Promise(() => {});\n }\n if (!USER) {\n USER = fetchUserData().catch((error) => {\n console.error(error);\n return DEFAULT_USER;\n });\n }\n return USER;\n}\n\n/**\n *\n * @returns {Promise<User.User>}\n */\nasync function fetchUserData() {\n const response = await fetch(\"/api/v1/whoami\");\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n\n try {\n /**\n * @type {User.WhoamiResponse}\n */\n const data = await response.json();\n const settings = data?.settings\n ? {\n aiHelpHistory:\n typeof data.settings?.ai_help_history === \"boolean\"\n ? data.settings.ai_help_history\n : null,\n noAds: data.settings?.no_ads ?? null,\n }\n : DEFAULT_USER.settings;\n Settings.noAds = settings?.noAds || false;\n return {\n username: data.username ?? DEFAULT_USER.username,\n isAuthenticated: data.is_authenticated ?? DEFAULT_USER.isAuthenticated,\n avatarUrl: data.avatar_url ?? DEFAULT_USER.avatarUrl,\n isSubscriber: data.is_subscriber ?? DEFAULT_USER.isSubscriber,\n subscriptionType:\n data.subscription_type === \"core\"\n ? \"mdn_core\"\n : (data.subscription_type ?? DEFAULT_USER.subscriptionType),\n email: data.email ?? DEFAULT_USER.email,\n geo: {\n country: (data.geo && data.geo.country) ?? DEFAULT_GEO.country,\n country_iso:\n (data.geo && data.geo.country_iso) ?? DEFAULT_GEO.country_iso,\n },\n settings,\n };\n } catch {\n throw new Error(response.statusText);\n }\n}\n\nexport const Settings = {\n set noAds(value) {\n if (value) {\n globalThis.localStorage.setItem(\"nop\", \"yes\");\n } else {\n globalThis.localStorage.removeItem(\"nop\");\n }\n },\n\n get noAds() {\n return globalThis.localStorage?.getItem?.(\"nop\") === \"yes\";\n },\n};\n","for (const pre of document.querySelectorAll(\n `div.code-example pre:not(.hidden):not([class*=\"live-sample\"]):not([class*=\"interactive-example\"])`,\n)) {\n const { upgradePre } = await import(\"../components/code-example/element.js\");\n upgradePre(pre);\n}\n","/**\n * dialog closedby polyfill based on https://github.com/tak-dcxi/dialog-closedby-polyfill\n *\n * @license MIT\n *\n * Copyright (c) 2025 Takahiro Arai\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!(\"closedBy\" in HTMLDialogElement.prototype)) {\n addEventListener(\"click\", (event) => {\n const source = event.composedPath()[0];\n if (\n source instanceof HTMLDialogElement &&\n source.getAttribute(\"closedby\") === \"any\"\n ) {\n const rect = source.getBoundingClientRect();\n const { clientX: x, clientY: y } = event;\n const inside =\n rect.top <= y && y <= rect.bottom && rect.left <= x && x <= rect.right;\n\n if (!inside) source.close();\n }\n });\n}\n","/**\n * Returns true or false based on whether doNotTrack is enabled. It also takes into account the\n * anomalies, such as !bugzilla 887703, which effect versions of Fx 31 and lower. It also handles\n * IE versions on Windows 7, 8 and 8.1, where the DNT implementation does not honor the spec.\n * Based on https://github.com/mozmeao/dnt-helper/blob/main/src/mozilla-dnt-helper.js\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=1217896 for more details\n * @param {string} [dnt] - An optional mock doNotTrack string to ease unit testing.\n * @param {string} [ua] - An optional mock userAgent string to ease unit testing.\n * @returns {boolean} true if enabled else false\n */\nexport function dntEnabled(dnt, ua) {\n // for old version of IE we need to use the msDoNotTrack property of navigator\n // on newer versions, and newer platforms, this is doNotTrack but, on the window object\n // Safari also exposes the property on the window object.\n let dntStatus =\n dnt ||\n navigator.doNotTrack ||\n // @ts-expect-error - non-standard property\n globalThis.doNotTrack ||\n // @ts-expect-error - non-standard property\n navigator.msDoNotTrack;\n const userAgent = ua || navigator.userAgent;\n\n // List of Windows versions known to not implement DNT according to the standard.\n const anomalousWinVersions = [\n \"Windows NT 6.1\",\n \"Windows NT 6.2\",\n \"Windows NT 6.3\",\n ];\n\n const fxMatch = userAgent.match(/Firefox\\/(\\d+)/);\n const ieRegEx = /MSIE|Trident/i;\n const isIE = ieRegEx.test(userAgent);\n // Matches from Windows up to the first occurance of ; un-greedily\n // http://www.regexr.com/3c2el\n const platform = userAgent.match(/Windows.+?(?=;)/g);\n\n // With old versions of IE, DNT did not exist so we simply return false;\n if (isIE && typeof Array.prototype.indexOf !== \"function\") {\n return false;\n } else if (fxMatch && Number.parseInt(fxMatch[1] || \"0\", 10) < 32) {\n // Can't say for sure if it is 1 or 0, due to Fx bug 887703\n dntStatus = \"Unspecified\";\n } else if (\n isIE &&\n platform &&\n anomalousWinVersions.includes(platform.toString())\n ) {\n // default is on, which does not honor the specification\n dntStatus = \"Unspecified\";\n } else {\n // sets dntStatus to Disabled or Enabled based on the value returned by the browser.\n // If dntStatus is undefined, it will be set to Unspecified\n // @ts-expect-error - DNT status can be various types\n dntStatus = { 0: \"Disabled\", 1: \"Enabled\" }[dntStatus] || \"Unspecified\";\n }\n\n return dntStatus === \"Enabled\";\n}\n","/**\n * Google Analytics, enabled if:\n * 1. FRED_GA_ENABLED and FRED_GA_MEASUREMENT_ID are set\n * 2. User has not opted out via moz-1st-party-data-opt-out cookie\n * 3. User has not enabled Do Not Track (DNT)\n */\n\nimport { GA_ENABLED, GA_MEASUREMENT_ID } from \"../components/env/index.js\";\nimport { dntEnabled } from \"../utils/dnt-helper.js\";\nimport { userIsOptedOut } from \"../utils/telemetry-opt-out.js\";\n\nif (GA_ENABLED && GA_MEASUREMENT_ID && !userIsOptedOut() && !dntEnabled()) {\n const gaScript = document.createElement(\"script\");\n gaScript.async = true;\n gaScript.src = `https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(GA_MEASUREMENT_ID)}`;\n document.head.append(gaScript);\n\n globalThis.dataLayer = globalThis.dataLayer || [];\n\n function gtag() {\n globalThis.dataLayer.push(arguments);\n }\n\n gtag(\"js\", new Date());\n gtag(\"config\", GA_MEASUREMENT_ID, {\n anonymize_ip: true,\n });\n}\n","import Glean from \"@mozilla/glean/web\";\n\nimport {\n GLEAN_CHANNEL,\n GLEAN_DEBUG,\n GLEAN_ENABLED,\n} from \"../components/env/index.js\";\nimport { gleanClick } from \"../utils/glean.js\";\nimport { userIsOptedOut } from \"../utils/telemetry-opt-out.js\";\n\nconst GLEAN_APP_ID = \"mdn-fred\";\n\nconst uploadEnabled = !userIsOptedOut() && GLEAN_ENABLED;\n\nif (GLEAN_DEBUG) {\n Glean.setDebugViewTag(\"mdn-dev\");\n Glean.setLogPings(true);\n}\n\nGlean.initialize(GLEAN_APP_ID, uploadEnabled, {\n enableAutoPageLoadEvents: true,\n enableAutoElementClickEvents: true,\n channel: GLEAN_CHANNEL,\n});\n\ndocument.addEventListener(\"click\", (event) => {\n const composedTarget = event.composedPath()?.[0];\n if (composedTarget !== event.target && composedTarget instanceof Element) {\n // Workaround for automatic click events in shadow DOM.\n // See: https://bugzil.la/1988206\n const taggedElement = composedTarget.closest(\"[data-glean-id]\");\n if (taggedElement instanceof HTMLElement) {\n const gleanId = taggedElement.dataset.gleanId;\n if (gleanId) {\n gleanClick(gleanId);\n }\n }\n }\n\n const target = composedTarget ?? event.target;\n if (target instanceof Element) {\n // External link measurement.\n const anchor = target.closest(\"a\");\n if (\n anchor instanceof HTMLAnchorElement &&\n anchor.href &&\n anchor.origin &&\n anchor.origin !== document.location.origin\n ) {\n gleanClick(`external-link: ${anchor.href}`);\n }\n }\n});\n","/**\n * @import { MDNCodeExample } from \"../components/code-example/element.js\";\n */\n\nfor (const iframe of document.querySelectorAll(\"iframe[data-live-id]\")) {\n if (iframe instanceof HTMLIFrameElement) {\n const { liveId, livePath } = iframe.dataset;\n if (liveId) {\n /** @type {Record<string, string>} */\n const liveSampleCode = {};\n /** @type {MDNCodeExample[]} */\n const codeExamples = [];\n\n const escapedId = liveId.replaceAll(\".\", String.raw`\\.`);\n for (const element of document.querySelectorAll(\n `.live-sample___${escapedId}, .live-sample---${escapedId}`,\n )) {\n const { MDNCodeExample, upgradePre } =\n await import(\"../components/code-example/element.js\");\n const codeExample =\n element instanceof MDNCodeExample ? element : upgradePre(element);\n if (codeExample) {\n codeExamples.push(codeExample);\n const { language, code } = codeExample;\n liveSampleCode[language]\n ? (liveSampleCode[language] += code)\n : (liveSampleCode[language] = code);\n }\n }\n\n await import(\"../components/live-sample-result/element.js\");\n const result = document.createElement(\"mdn-live-sample-result\");\n result.liveId = liveId;\n result.code = liveSampleCode;\n result.srcPrefix = livePath;\n result.allow = iframe.allow || undefined;\n result.sandbox = iframe.sandbox.toString();\n result.height = iframe.height;\n iframe.closest(\".code-example\")?.replaceWith(result);\n\n for (const codeExample of codeExamples) {\n codeExample.liveSample ||= result;\n }\n }\n }\n}\n","const loaded = new Set();\nfor (const element of document.querySelectorAll(\"*\")) {\n const tag = element.tagName.toLowerCase();\n if (tag.startsWith(\"mdn-\") || tag === \"interactive-example\") {\n const component = tag.replace(\"mdn-\", \"\");\n if (!loaded.has(component)) {\n loaded.add(component);\n // we don't want to await, because we want these to load in parallel\n // eslint-disable-next-line unicorn/prefer-top-level-await\n import(`../components/${component}/element.js`).catch((error) => {\n console.error(\n `couldn't load code for <${component}>: does the element's code not match the naming schema?`,\n error,\n );\n });\n }\n }\n}\n","const sidebar = document.querySelector(\".left-sidebar\");\nconst current = sidebar?.querySelector('[aria-current=\"page\"]');\nif (sidebar && current instanceof HTMLElement) {\n sidebar.scrollTo({\n top: current.offsetTop - window.innerHeight / 4,\n });\n}\n","import { MDNSearchModal } from \"../components/search-modal/element.js\";\n\nconst skipToSearch = document.querySelector(`.a11y-menu a[href=\"#search\"]`);\n\nif (skipToSearch instanceof HTMLAnchorElement) {\n const search = document.querySelector(\"#search\");\n\n if (search instanceof MDNSearchModal) {\n skipToSearch.addEventListener(\"click\", (event) => {\n const { target } = event;\n\n if (target instanceof HTMLElement) {\n target.blur();\n event.preventDefault();\n }\n\n search.showModal();\n });\n } else {\n console.error(\"MDNSearchModal not found!\");\n skipToSearch.hidden = true;\n }\n}\n","/**\n * @param {HTMLElement} toc\n * @returns {void}\n */\nfunction highlightTOC(toc) {\n // 1. Collect TOC items\n const tocItems = [...toc.querySelectorAll(\"a\")];\n\n // 2. Map sections to TOC item\n /** @type {Map<HTMLElement, HTMLAnchorElement>} */\n const tocItemBySection = new Map();\n for (const item of tocItems.reverse()) {\n const target = document.querySelector(\n `[id=\"${decodeURIComponent(item.hash).slice(1)}\"]`,\n );\n\n if (!target) {\n continue;\n }\n\n /** @type {Element|null} */\n let section = target.closest(\"section\");\n\n while (\n section &&\n section instanceof HTMLElement &&\n !tocItemBySection.has(section)\n ) {\n tocItemBySection.set(section, item);\n const next = section.nextElementSibling;\n section = next;\n }\n }\n\n /** @type {WeakMap<HTMLElement,number>} */\n const visibleSectionsByItem = new WeakMap();\n\n /** @type {Set<HTMLElement>} */\n const everVisibleSections = new Set();\n\n // 3. Handle visibility transitions\n const onIntersect = (/** @type {IntersectionObserverEntry[]} */ entries) => {\n for (const { target, isIntersecting } of entries) {\n if (!(target instanceof HTMLElement)) {\n continue;\n }\n\n if (!everVisibleSections.has(target)) {\n if (isIntersecting) {\n everVisibleSections.add(target);\n } else {\n continue;\n }\n }\n\n const item = tocItemBySection.get(target);\n\n if (!item) {\n continue;\n }\n\n const visibleCount =\n (visibleSectionsByItem.get(item) ?? 0) + (isIntersecting ? 1 : -1);\n\n item.ariaCurrent = visibleCount > 0 ? \"true\" : null;\n visibleSectionsByItem.set(item, visibleCount);\n }\n };\n\n // 5. Determine options.\n /** @type {IntersectionObserverInit} */\n const options = {\n threshold: 0,\n };\n const header = document.querySelector(\"header\");\n if (header instanceof HTMLElement) {\n options.rootMargin = `-${header.clientHeight}px 0px 0px 0px`;\n }\n\n // 5. Init observer.\n const observer = new IntersectionObserver(onIntersect, options);\n\n // 6. Observe sections.\n for (const section of tocItemBySection.keys()) {\n observer.observe(section);\n }\n}\n\nfor (const toc of document.querySelectorAll(\n \".generic-toc, .reference-toc, .document-toc, .blog-toc\",\n)) {\n if (toc instanceof HTMLElement) {\n highlightTOC(toc);\n }\n}\n","import { globalUser } from \"../components/user/context.js\";\n\ntry {\n const user = await globalUser();\n const nextPing = new Date(localStorage.getItem(\"next-ping\") || 0);\n if (navigator.sendBeacon && user.isAuthenticated && nextPing < new Date()) {\n const params = new URLSearchParams();\n\n navigator.sendBeacon(\"/api/v1/ping\", params);\n\n const newNextPing = new Date();\n newNextPing.setUTCDate(newNextPing.getUTCDate() + 1);\n newNextPing.setUTCHours(0);\n newNextPing.setUTCMinutes(0);\n newNextPing.setUTCSeconds(0);\n newNextPing.setUTCMilliseconds(0);\n localStorage.setItem(\"next-ping\", newNextPing.toISOString());\n }\n} catch (error) {\n console.error(\"Failed to send ping\", error);\n}\n","export default `# TODO Use comments, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#comments\n# TODO Consider using terms, see: https://firefox-source-docs.mozilla.org/l10n/fluent/review.html#terms and https://projectfluent.org/fluent/guide/references.html#message-references\n\narticle-footer-last-modified = This page was last modified on <time data-l10n-name=\"date\">{ \\$date }</time> by <a data-l10n-name=\"contributors\">MDN contributors</a>.\narticle-footer-source-title = Folder: { \\$folder } (Opens in a new tab)\n\nbaseline-asterisk = Some parts of this feature may have varying levels of support.\nbaseline-high-extra = This feature is well established and works across many devices and browser versions. It’s been available across browsers since { \\$date }.\nbaseline-low-extra = Since { \\$date }, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.\nbaseline-not-extra = This feature is not Baseline because it does not work in some of the most widely-used browsers.\nbaseline-supported-in = Supported in { \\$browsers }\nbaseline-unsupported-in = Not widely supported in { \\$browsers }\nbaseline-supported-and-unsupported-in = Supported in { \\$supported }, but not widely supported in { \\$unsupported }\n\nhomepage-hero-title = Resources for Developers,<br> by Developers\nhomepage-hero-description = Documenting <a data-l10n-name=\"css\">CSS</a>, <a data-l10n-name=\"html\">HTML</a>, and <a data-l10n-name=\"js\">JavaScript</a>, since 2005.\n\nnot-found-title = Page not found\nnot-found-description = Sorry, the page <code data-l10n-name=\"url\">{ \\$url }</code> could not be found.\nnot-found-fallback-english = <strong data-l10n-name=\"strong\">Good news:</strong> The page you requested exists in <em data-l10n-name=\"em\">English</em>.\nnot-found-fallback-search = The page you requested doesn't exist, but you could try a site search for:\nnot-found-back = Go back to the home page\n\nreference-toc-header = In this article\n\nfooter-mofo = Visit <a data-l10n-name=\"moco\">Mozilla Corporation’s</a> not-for-profit parent, the <a data-l10n-name=\"mofo\">Mozilla Foundation</a>.\nfooter-copyright = Portions of this content are ©1998–{ \\$year } by individual mozilla.org contributors. Content available under <a data-l10n-name=\"cc\">a Creative Commons license</a>.\n\nsearch-modal-site-search = Site search for <em>{ \\$query }</em>\n\nsite-search-search-stats = Found { \\$results } documents.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] more than { \\$matches ->\n [one] { \\$matches } match\n *[other] { \\$matches } matches\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } match\n *[other] { \\$matches } matches\n }\n}\nsite-search-suggestions-text = Did you mean:\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } minute read\n *[other] { \\$minutes } minutes read\n}\nblog-post-not-found = Blog post not found.\n\nblog-previous = Previous post\nblog-next = Next post\n\n-brand-name-obs = HTTP Observatory\nobs-report = Report\nobs-title = { -brand-name-obs }\nobs-landing-intro = Launched in 2016, the { -brand-name-obs } enhances web security by analyzing compliance with best security practices. It has provided insights to over 6.9 million websites through 47 million scans.\nobs-assessment = Developed by Mozilla, the { -brand-name-obs } performs an in-depth assessment of a site’s HTTP headers and other key security configurations.\nobs-scanning = Its automated scanning process provides developers and website administrators with detailed, actionable feedback, focusing on identifying and addressing potential security vulnerabilities.\nobs-security = The tool is instrumental in helping developers and website administrators strengthen their sites against common security threats in a constantly advancing digital environment.\nobs-mdn = The { -brand-name-obs } provides effective security insights, guided by Mozilla's expertise and commitment to a safer and more secure internet and based on well-established trends and guidelines.\n\n\ncompat-loading = Loading…\ncompat-js-required = Enable JavaScript to view this browser compatibility table.\n\ncompat-browser-version-date = { \\$browser } { \\$version } – Release date: { \\$date }\ncompat-browser-version-released = Release date: { \\$date }\n\ncompat-link-report-issue = Report problems with this compatibility data\ncompat-link-report-issue-title = Report an issue with this compatibility data\ncompat-link-report-missing-title = Report missing compatibility data\ncompat-link-report-missing = Report this issue\ncompat-link-source = View data on GitHub\ncompat-link-source-title = File: { \\$filename }\n\ncompat-deprecated = Deprecated\ncompat-experimental = Experimental\ncompat-nonstandard = Non-standard\ncompat-no = No\n\ncompat-support-full = Full support\ncompat-support-partial = Partial support\ncompat-support-no = No support\ncompat-support-unknown = Support unknown\ncompat-support-preview = Preview browser support\ncompat-support-prefix = Implemented with the vendor prefix: { \\$prefix }\ncompat-support-altname = Alternate name: { \\$altname }\ncompat-support-removed = Removed in { \\$version } and later\ncompat-support-see-impl-url = See <a data-l10n-name=\"impl_url\">{ \\$label }</a>\ncompat-support-flags =\n { NUMBER(\\$has_added) ->\n [one] From version { \\$version_added }\n *[other] {\"\"}\n }{ \\$has_last ->\n [one] { NUMBER(\\$has_added) ->\n *[zero] Until { \\$versionLast } users\n [one] {\" \"}until { \\$versionLast } users\n }\n *[zero] { NUMBER(\\$has_added) ->\n *[zero] Users\n [one] {\" \"}users\n }\n }\n {\" \"}must explicitly set the <code data-l10n-name=\"name\">{ \\$flag_name }</code>{\" \"}\n { \\$flag_type ->\n *[preference] preference\n [runtime_flag] runtime flag\n }{ NUMBER(\\$has_value) ->\n [one] {\" \"}to <code data-l10n-name=\"value\">{ \\$flag_value }</code>\n *[other] {\"\"}\n }{\".\"}\n { NUMBER(\\$has_pref_url) ->\n [one] { \\$flag_type ->\n [preference] To change preferences in { \\$browser_name }, visit { \\$browser_pref_url }.\n *[other] {\"\"}\n }\n *[other] {\"\"}\n }\n\ncompat-legend = Legend\ncompat-legend-tip = Tip: you can click/tap on a cell for more information.\ncompat-legend-yes = { compat-support-full }\ncompat-legend-partial = { compat-support-partial }\ncompat-legend-preview = In development. Supported in a pre-release version.\ncompat-legend-no = { compat-support-no }\ncompat-legend-unknown = Compatibility unknown\ncompat-legend-experimental = { compat-experimental }. Expect behavior to change in the future.\ncompat-legend-nonstandard = { compat-nonstandard }. Check cross-browser support before using.\ncompat-legend-deprecated = { compat-deprecated }. Not for use in new websites.\ncompat-legend-footnote = See implementation notes.\ncompat-legend-disabled = User must explicitly enable this feature.\ncompat-legend-altname = Uses a non-standard name.\ncompat-legend-prefix = Requires a vendor prefix or different name for use.\ncompat-legend-more = Has more compatibility info.\n\nplacement-note = Ad\nplacement-no = Don't want to see ads?\n\npagination-next = Next page\npagination-prev = Previous page\npagination-current = Current page\npagination-goto = Go to page { \\$page }\n\nlogout = Sign out\nlogin = Log in\nsettings = My settings\n\nexample-play-button-label = Play\nexample-play-button-title = Run example in MDN Playground (opens in new tab)\n\ncontent-feedback-question = Was this page helpful to you?\ncontent-feedback-reason = Why was this page not helpful to you?\ncontent-feedback-thanks = Thank you for your feedback!\n\nwriter-reload-polling = Polling every { \\$seconds }s\n`;","import { FluentBundle, FluentResource } from \"@fluent/bundle\";\nimport insane from \"insane\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport de_ftl from \"../l10n/de.ftl\";\nimport enUS_ftl from \"../l10n/en-US.ftl\";\nimport es_ftl from \"../l10n/es.ftl\";\nimport fr_ftl from \"../l10n/fr.ftl\";\nimport ja_ftl from \"../l10n/ja.ftl\";\nimport ko_ftl from \"../l10n/ko.ftl\";\nimport ptBR_ftl from \"../l10n/pt-BR.ftl\";\nimport ru_ftl from \"../l10n/ru.ftl\";\nimport zhCN_ftl from \"../l10n/zh-CN.ftl\";\nimport zhTW_ftl from \"../l10n/zh-TW.ftl\";\n\n/**\n * @import { AllowedTags } from \"insane\";\n */\n\n/** @type {Record<string, string>} */\nconst ftlMap = {\n \"en-US\": enUS_ftl,\n de: de_ftl,\n es: es_ftl,\n fr: fr_ftl,\n ja: ja_ftl,\n ko: ko_ftl,\n \"pt-BR\": ptBR_ftl,\n ru: ru_ftl,\n \"zh-CN\": zhCN_ftl,\n \"zh-TW\": zhTW_ftl,\n};\n\nconst ALLOWED_TAGS = [\"i\", \"strong\", \"br\", \"em\"];\nconst ALLOWED_ATTRIBUTES = [\"title\", \"aria-label\"];\n\nexport class Fluent {\n /**\n * @param {string} locale\n * @param {string[]} resources\n */\n constructor(locale = \"en-US\", resources = []) {\n this.locale = locale;\n\n this.usBundle = Fluent.constructBundle(\n new FluentBundle(locale, { useIsolating: false }),\n [enUS_ftl],\n );\n\n if (resources.length > 0) {\n this.bundle = Fluent.constructBundle(\n new FluentBundle(locale, { useIsolating: false }),\n [enUS_ftl, ...resources],\n );\n }\n }\n\n /**\n * @param {FluentBundle} bundle\n * @param {string[]} resources\n */\n static constructBundle(bundle, resources = []) {\n for (const r of resources) {\n const errors = bundle.addResource(new FluentResource(r), {\n allowOverrides: true,\n });\n if (errors.length > 0) {\n console.error(errors);\n }\n }\n return bundle;\n }\n\n /**\n * @param {string} id\n * @param {string} [attr]\n * @param {Record<string, any>} [args]\n * @param {Record<string, import(\"../types/fluent.js\").Element>} [elements]\n * @returns {string | ReturnType<typeof unsafeHTML> | undefined}\n */\n get(id, attr, args, elements) {\n const message = this.getMessage(id, attr, args);\n if (!message) {\n return;\n }\n return Fluent.sanitize(message, elements);\n }\n\n /**\n * @param {string} message\n * @param {Record<string, import(\"../types/fluent.js\").Element>} [elements]\n * @returns {string | ReturnType<typeof unsafeHTML>}\n */\n static sanitize(message, elements = {}) {\n /** @type { Record<string, string[]> } */\n const allowedAttributes = {};\n for (const t of Object.values(elements)) {\n allowedAttributes[t.tag] = [\n ...Object.keys(t).filter((x) => x !== \"tag\"),\n ...ALLOWED_ATTRIBUTES,\n ];\n }\n\n const allowedTags = [\n ...Object.values(elements).map((t) => t.tag),\n ...ALLOWED_TAGS,\n ];\n\n let safe = true;\n const sanitized = insane(\n message,\n {\n allowedAttributes,\n allowedTags: /** @type {AllowedTags[]} */ (allowedTags),\n allowedSchemes: [\"http\", \"https\", \"mailto\"],\n filter(token) {\n // TODO: use element names directly\n const name = token.attrs[\"data-l10n-name\"];\n if (name) {\n for (const [k, v] of Object.entries(elements[name] || {})) {\n token.attrs[k] = v;\n }\n }\n if (\n ALLOWED_TAGS.includes(token.tag) ||\n (name &&\n Object.keys(elements).includes(name) &&\n elements[name]?.tag === token.tag)\n ) {\n safe = false;\n return true;\n }\n return false;\n },\n },\n true,\n );\n return safe ? sanitized : unsafeHTML(sanitized);\n }\n\n /**\n * @param {string} id\n * @param {string} [attr]\n * @param {Record<string, any>} [args]\n * @param {FluentBundle | undefined} [bundle]\n * @param {boolean} [us]\n * @returns {string | undefined}\n */\n getMessage(id, attr, args = {}, bundle = this.bundle, us = false) {\n const parentMessage = bundle ? bundle.getMessage(id) : undefined;\n let message;\n\n if (this.locale === \"qa\") {\n return `[${id}${attr ? `.${attr}` : \"\"}]`;\n }\n\n if (!parentMessage) {\n if (us) {\n // console.error(`string ${id} doesn't exist`);\n // return `[${id}${attr ? `.${attr}` : \"\"}]`;\n return;\n }\n return this.getMessage(id, attr, args, this.usBundle, true);\n }\n\n if (attr) {\n message = parentMessage.attributes[attr];\n if (!message) {\n if (us) {\n // console.error(`string ${id} with ${attr} attribute doesn't exist`);\n // return `[${id}.${attr}]`;\n return;\n }\n return this.getMessage(id, attr, args, this.usBundle, true);\n }\n } else if (parentMessage.value) {\n message = parentMessage.value;\n }\n\n if (!message || !bundle) {\n return \"\";\n }\n\n /** @type {Error[]} */\n const errors = [];\n const formatted = bundle?.formatPattern(message, args, errors);\n if (errors.length > 0) {\n console.error(errors);\n }\n return formatted;\n }\n}\n\n/** @type {Map<string, Fluent>} */\nconst fluent = new Map();\n\n/**\n * @param {string} [locale]\n */\nfunction getLocale(locale) {\n if (!locale) {\n return;\n }\n if (!fluent.has(locale)) {\n const ftl = ftlMap[locale];\n const localeF = new Fluent(locale, ftl ? [ftl] : undefined);\n fluent.set(locale, localeF);\n }\n return fluent.get(locale);\n}\n\n/**\n * @param {string} [locale]\n */\nexport default function getFluentContext(locale) {\n /**\n * @overload\n * @param {string} id\n * @param {string} [_comment]\n * @returns {import(\"../types/fluent.js\").L10nTag}\n */\n\n /**\n * @overload\n * @param {TemplateStringsArray} strings\n * @returns {string}\n */\n\n /**\n * @param {string | TemplateStringsArray} idOrStrings\n * @param {string} [_comment]\n * @returns {import(\"../types/fluent.js\").L10nTag | string}\n */\n function l10n(idOrStrings, _comment) {\n if (typeof idOrStrings === \"string\") {\n // called as a function, returning a template tag:\n // l10n(\"foobar\")`Foobar`\n const id = idOrStrings;\n const localizedString = getLocale(locale)?.get(id);\n const fallbackString = `[${id}]`;\n /** @type {import(\"../types/fluent.js\").L10nTag} */\n const tag = (strings) => {\n // we don't currently support any expressions in the template string\n // we might in the future, if we use l10n.raw a lot\n const templateString = strings[0];\n return localizedString || templateString || fallbackString;\n };\n tag.toString = () => {\n // called as a function, used as a function:\n // ${l10n(\"foobar\")}\n return (\n (typeof localizedString === \"string\" && localizedString) ||\n fallbackString\n );\n };\n return tag;\n }\n // called directly as a template tag:\n // l10n`Foobar`\n // TODO: create consistent logic for id generation at runtime and scrapetime\n const strings = idOrStrings;\n const templateString = strings[0];\n return templateString || \"\";\n }\n\n /**\n * @param {{ id: string, attr?: string, args?: Record<string, any>, elements?: Record<string, import(\"../types/fluent.js\").Element> }} param0\n */\n l10n.raw = function ({ id, attr, args, elements }) {\n const fluent = getLocale(locale);\n if (fluent) {\n return fluent.get(id, attr, args, elements);\n }\n return `[${id}]`;\n };\n\n return l10n;\n}\n\n// const l10n = getFluentContext(\"en-US\");\n\n// console.log(l10n`Hello`);\n// console.log(l10n(\"hello\")`Hello`);\n// console.log(l10n(\"hello\", \"a greeting to the user\")`Hello`);\n// console.log(l10n.raw({ id: \"hello\" }));\n// console.log(`${l10n(\"hello\")}`);\n\n// should show error:\n// l10n(\"hello\")`Hello ${\"world\"}`;\n","export default `content-feedback-question = War diese Übersetzung hilfreich?\ncontent-feedback-reason = Warum war diese Übersetzung nicht hilfreich?\ncontent-feedback-thanks = Vielen Dank für die Rückmeldung!\n\nreference-toc-header = In diesem Artikel\n\nfooter-tagline = Dein Bauplan für ein besseres Internet.\nfooter-mofo = Besuche die gemeinnützige Muttergesellschaft der <a data-l10n-name=\"moco\">Mozilla Corporation</a>, die <a data-l10n-name=\"mofo\">Mozilla Foundation</a>.\nfooter-copyright = Teile dieses Inhalts sind ©1998–{ \\$year } von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter <a data-l10n-name=\"cc\">einer Creative-Commons-Lizenz</a>.\n\nsearch-modal-site-search = Erweiterte Suche nach <em>{ \\$query }</em>\n\nsite-search-search-stats = { \\$results } Dokumente gefunden.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] mehr als { \\$matches ->\n [one] { \\$matches } Übereinstimmung\n *[other] { \\$matches } Übereinstimmungen\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } Übereinstimmung\n *[other] { \\$matches } Übereinstimmungen\n }\n}\nsite-search-suggestions-text = Meinten Sie:\n\n\ntheme-default = Systemstandard\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } Minute Lesezeit\n *[other] { \\$minutes } Minuten Lesezeit\n}\nblog-post-not-found = Blogartikel nicht gefunden.\n\nblog-previous = Voriger Artikel\nblog-next = Nächster Artikel\n\nNo = Nein\nSubmit = Abschicken\nYes = Ja\n\nobs-report = Report\n\nobs-title = HTTP Observatory\nobs-landing-intro = Seit 2016 verbessert HTTP Observatory die Sicherheit durch Analyse der Einhaltung bewährter Sicherheitspraktiken. Es hat durch 47 Millionen Scans Einblicke in über 6,9 Millionen Websites geliefert.\nobs-assessment = Das von Mozilla entwickelte HTTP Observatory führt eine umfassende Bewertung der HTTP-Header und weiterer zentraler Sicherheitskonfigurationen einer Website durch.\nobs-scanning = Der automatisierte Scan-Prozess liefert Entwicklern und Website-Administratoren detailliertes, handlungsorientiertes Feedback und konzentriert sich darauf, potenzielle Sicherheitslücken zu erkennen und zu beheben.\nobs-security = Das Tool unterstützt Entwickler und Website-Administratoren maßgeblich dabei, ihre Websites in einem sich stetig weiterentwickelnden digitalen Umfeld gegen häufige Sicherheitsbedrohungen abzusichern.\nobs-mdn = Das HTTP Observatory bietet wirksame Sicherheitseinblicke auf Grundlage von Mozillas Expertise und Engagement für ein sichereres Internet sowie basierend auf etablierten Trends und Richtlinien.\n`;","export default `blog-toc-title = En este artículo\n\n`;","export default `article-footer-last-modified = Cette page a été modifiée le <time data-l10n-name=\"date\">{ \\$date }</time> par les <a data-l10n-name=\"contributors\">contributeurs du MDN</a>.\narticle-footer-source-title = Dossier : { \\$folder } (Ouvre un onglet)\n\nbaseline-asterisk = Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.\nbaseline-high-extra = Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis { \\$date }.\nbaseline-low-extra = Depuis { \\$date }, cette fonctionnalité fonctionne sur les appareils et les versions de navigateur les plus récents. Elle peut ne pas fonctionner sur les appareils ou navigateurs plus anciens.\nbaseline-not-extra = Cette fonctionnalité n'est pas Compatible car elle ne fonctionne pas dans certains des navigateurs les plus utilisés.\nbaseline-supported-in = Pris en charge dans { \\$browsers }\nbaseline-unsupported-in = Pas complètement pris en charge dans { \\$browsers }\nbaseline-supported-and-unsupported-in = Pris en charge dans { \\$supported }, mais pas complètement pris en charge dans { \\$unsupported }\n\nhomepage-hero-title = Des ressources pour les Développeuses et Développeurs,<br> par des Développeuses et Développeurs\nhomepage-hero-description = Documenter le <a data-l10n-name=\"css\">CSS</a>, le <a data-l10n-name=\"html\">HTML</a> et le <a data-l10n-name=\"js\">JavaScript</a>, depuis 2005.\n\nnot-found-title = Page non trouvée\nnot-found-description = Désolé, la page <code data-l10n-name=\"url\">{ \\$url }</code> n'a pas été trouvée.\nnot-found-fallback-english = <strong data-l10n-name=\"strong\">Bonne nouvelle :</strong> La page que vous cherchez existe en <em data-l10n-name=\"em\">Anglais</em>.\nnot-found-fallback-search = La page que vous avez demandée n'existe pas, mais vous pouvez essayer une recherche sur le site pour :\nnot-found-back = Retour à la page d'accueil\n\nreference-toc-header = Dans cet article\n\nfooter-mofo = Visitez la société mère à but non lucratif de <a data-l10n-name=\"moco\">Mozilla Corporation</a>, la <a data-l10n-name=\"mofo\">Fondation Mozilla</a>.\nfooter-copyright = Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—{ \\$year } des contributeurs individuels de mozilla.org. Contenu disponible sous <a data-l10n-name=\"cc\">une licence Creative Commons</a>.\n\nsearch-modal-site-search = Rechercher sur le site <em>{ \\$query }</em>\n\nsite-search-search-stats = { \\$results } documents trouvés.\nsite-search-suggestion-matches = { \\$relation ->\n [gt] plus que { \\$matches ->\n [one] { \\$matches } trouvé\n *[other] { \\$matches } trouvés\n }\n *[eq] { \\$matches ->\n [one] { \\$matches } trouvé\n *[other] { \\$matches } trouvés\n }\n}\nsite-search-suggestions-text = Voulez-vous dire :\n\nblog-time-to-read = { \\$minutes ->\n [one] { \\$minutes } minute de lecture\n *[other] { \\$minutes } minutes de lecture\n}\nblog-post-not-found = Article de blog introuvable.\n\nblog-previous = Article précédent\nblog-next = Article suivant\n\n-brand-name-obs = HTTP Observatory\nobs-report = Signaler\nobs-title = { -brand-name-obs }\nobs-landing-intro = Lancé en 2016, { -brand-name-obs } améliore la sécurité du Web en analysant la conformité aux meilleures pratiques en matière de sécurité. Il a fourni des informations à plus de 6,9 millions de sites web grâce à 47 millions d'analyses.\nobs-assessment = Développé par Mozilla, { -brand-name-obs } effectue une évaluation approfondie des en-têtes HTTP d'un site et d'autres configurations de sécurité clés.\nobs-scanning = Son processus d'analyse automatisé fournit aux développeur·euse·s et aux administrateur·ice·s de sites web des commentaires détaillés et exploitables, axés sur l'identification et la résolution des failles de sécurité potentielles.\nobs-security = Cet outil aide les développeur·euse·s et les administrateur·ice·s de sites web à renforcer la sécurité de leurs sites contre les menaces courantes dans un environnement numérique en constante évolution.\nobs-mdn = { -brand-name-obs } fournit des informations efficaces en matière de sécurité, guidées par l'expertise et l'engagement de Mozilla en faveur d'un Internet plus sûr et plus sécurisé, et basées sur des tendances et des directives bien établies.\n\n\ncompat-loading = Chargement…\ncompat-js-required = Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.\n\ncompat-browser-version-date = { \\$browser } { \\$version } — Date de sortie : { \\$date }\ncompat-browser-version-released = Date de sortie : { \\$date }\n\ncompat-link-report-issue = Signaler des problèmes avec ces données de compatibilité\ncompat-link-report-issue-title = Signaler un problème avec ces données de compatibilité\ncompat-link-report-missing-title = Signaler des données de compatibilité manquantes\ncompat-link-report-missing = Signaler le problème\ncompat-link-source = Voir les données sur GitHub\ncompat-link-source-title = Fichier : { \\$filename }\n\ncompat-deprecated = Obsolète\ncompat-experimental = Expérimental\ncompat-nonstandard = Non standard\ncompat-no = Non\n\ncompat-support-full = Prise en charge complète\ncompat-support-partial = Prise en charge partielle\ncompat-support-no = Pas de prise en charge\ncompat-support-unknown = Prise en charge inconnue\ncompat-support-preview = Pré-version du navigateur\ncompat-support-prefix = Implémenté avec le préfixe vendeur : { \\$prefix }\ncompat-support-altname = Nom alternatif : { \\$altname }\ncompat-support-removed = Supprimé en version { \\$version } et supérieure\ncompat-support-see-impl-url = Voir <a data-l10n-name=\"impl_url\">{ \\$label }</a>\ncompat-support-flags =\n { NUMBER(\\$has_added) ->\n [one] De la version { \\$version_added }\n *[other] {\"\"}\n }{ \\$has_last ->\n [one] { NUMBER(\\$has_added) ->\n *[zero] Jusqu'à { \\$versionLast } des utilisateur·ice·s\n [one] {\" \"}jusqu'à { \\$versionLast } des utilisateur·ice·s\n }\n *[zero] { NUMBER(\\$has_added) ->\n *[zero] Utilisateur·ice·s\n [one] {\" \"}utilisateur·ice·s\n }\n }\n {\" \"}doit explicitement définir\n { \\$flag_type ->\n *[preference] la préférence\n [runtime_flag] l'indicateur d'exécution\n }\n {\" \"}<code data-l10n-name=\"name\">{ \\$flag_name }</code>\n { NUMBER(\\$has_value) ->\n [one] {\" \"}à <code data-l10n-name=\"value\">{ \\$flag_value }</code>\n *[other] {\"\"}\n }{\".\"}\n { NUMBER(\\$has_pref_url) ->\n [one] { \\$flag_type ->\n [preference] Pour changer vos préférences sur le navigateur { \\$browser_name }, visitez { \\$browser_pref_url }.\n *[other] {\"\"}\n }\n *[other] {\"\"}\n }\n\ncompat-legend = Légende\ncompat-legend-tip = Astuce : cliquer/appuyer sur une cellule pour obtenir plus d'informations.\ncompat-legend-yes = { compat-support-full }\ncompat-legend-partial = { compat-support-partial }\ncompat-legend-preview = En cours de développement. Pris en charge dans une pré-version.\ncompat-legend-no = { compat-support-no }\ncompat-legend-unknown = Compatibilité inconnue\ncompat-legend-experimental = { compat-experimental }. Attendez-vous à ce que les comportements changent à l'avenir.\ncompat-legend-nonstandard = { compat-nonstandard }. Vérifiez la compatibilité entre les navigateurs avant utilisation.\ncompat-legend-deprecated = { compat-deprecated }. Ne pas utiliser dans les nouveaux sites web.\ncompat-legend-footnote = Voir les notes de mise en application.\ncompat-legend-disabled = L'utilisateur·ice doit explicitement activer cette fonctionnalité.\ncompat-legend-altname = Utilise un nom hors standard.\ncompat-legend-prefix = Nécessite un préfixe vendeur ou un nom différent pour être utilisé.\ncompat-legend-more = Contient davantage d'informations sur la compatibilité.\n\nplacement-note = Publicité\nplacement-no = Vous ne voulez pas voir de publicités ?\n\npagination-next = Page suivante\npagination-prev = Page précédente\npagination-current = Page actuelle\npagination-goto = Aller à la page { \\$page }\n\nlogout = Se déconnecter\nlogin = Se connecter\nsettings = Mes paramètres\n\nexample-play-button-label = Exécuter\nexample-play-button-title = Exécutez l'exemple dans MDN Playground (ouvre un nouvel onglet)\n\ncontent-feedback-question = Cette page vous a-t-elle été utile ?\ncontent-feedback-reason = Pourquoi cette page ne vous a-t-elle pas été utile ?\ncontent-feedback-thanks = Merci pour votre commentaire !\n\nwriter-reload-polling = Analyse toutes les { \\$seconds }s\n`;","export default `blog-toc-title = この記事では\n\n`;","export default `blog-toc-title = 목차\n`;","export default `blog-toc-title = Neste artigo\n\n`;","export default `blog-toc-title = В этой статье\n`;","export default `blog-toc-title = 在本文中\n`;","export default `blog-toc-title = 在本文中\n`;","import { getSymmetricContext } from \"../symmetric-context/both.js\";\n\nimport getFluentContext from \"./fluent.js\";\n\n/**\n * @import { LitElement } from \"lit\";\n */\n\n/**\n * @template {new (...args: any[]) => LitElement} TBase\n * @param {TBase} Base\n */\nexport const L10nMixin = (Base) =>\n class LocalizedElement extends Base {\n /**\n * @param {...any} args\n */\n constructor(...args) {\n super(...args);\n const context = getSymmetricContext();\n this.locale = context.locale;\n this.l10n = getFluentContext(this.locale);\n }\n };\n","/**\n * Runs on either client or server,\n * and returns the client or server context respectively\n * @returns {import(\"./types.js\").SymmetricContext}\n */\nexport function getSymmetricContext() {\n const serverStore = globalThis.__MDNServerContext?.getStore();\n const clientStore = globalThis.__MDNClientContext;\n return serverStore || clientStore;\n}\n","/**\n * The client-derived values of the symmetric context:\n * this will run within a user's web browser\n * @type {import(\"./types.js\").SymmetricContext}\n */\nglobalThis.__MDNClientContext = {\n locale: globalThis.location.pathname.split(\"/\")[1] || \"en-US\",\n};\n","import GleanMetrics from \"@mozilla/glean/metrics\";\n\n/**\n * Records a click event.\n *\n * Use only if automatic click events are not an option.\n * See: https://mozilla.github.io/glean.js/automatic_instrumentation/click_events/\n *\n * @param {string} source\n */\nexport function gleanClick(source) {\n GleanMetrics.recordElementClick({\n id: source,\n url: globalThis.location.href,\n referrer: document.referrer,\n title: document.title,\n });\n}\n","/**\n * Returns an MDN URL into a Breadcrumb-like string representation.\n *\n * @param {string} url - the full MDN URL (e.g. \"/en-US/docs/Web/HTML/Reference/Elements/a\").\n * @param {string} locale - the locale (to omit)\n * @returns {string} the breadcrumb-like string for the URL.\n */\nexport function mdnUrl2Breadcrumb(url, locale) {\n let parents = url\n .replaceAll(\"_\", \" \")\n .split(\"/\")\n .filter((p) => ![\"\", locale, \"docs\"].includes(p));\n\n // Replace \"API\" for clarity.\n parents = parents.map((p) => (p === \"API\" ? \"Web APIs\" : p));\n\n if (parents.length > 1 && parents.at(0) === \"Web\") {\n // Remove virtual \"Web\" path.\n parents.splice(0, 1);\n }\n\n if (parents.length > 1) {\n // Remove current item.\n parents.splice(-1, 1);\n }\n\n return parents.join(\" / \");\n}\n","const FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME = \"moz-1st-party-data-opt-out\";\n\n/**\n * Checks if user has opted out of first-party data collection.\n * @param {string} [cookie] - An optional mock cookie string to ease unit testing.\n * @returns {boolean} True if user has opted out, false otherwise\n */\nexport function userIsOptedOut(cookie) {\n return (cookie || document.cookie)\n .split(\"; \")\n .includes(`${FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME}=true`);\n}\n"],"names":["n","Promise","Error","Object","document","localStorage","HTMLDetailsElement","e","console","JSON","Number","globalThis","HTMLElement","MDNSearchModal","fetch","t","HTMLInputElement","a","MouseEvent","setTimeout","i","Boolean","URLSearchParams","String","RegExp","customElements","value","HTMLDialogElement","addEventListener","navigator","Array","arguments","encodeURIComponent","Date","Element","HTMLAnchorElement","HTMLIFrameElement","Set","window","Map","decodeURIComponent","WeakMap","IntersectionObserver","Fluent","s"],"mappings":";oNAKI,EAAgC,IAAAA,EAAA,EAAAA,EAAA,QAChC,EAA0B,IAA4B,KACtD,EAAqC,IAAgC,GAEzE,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,CAAC,+tDAA+tD,EAAE,EAAmC,iBAAiB,EAAE,EAAmC,y5BAAy5B,CAAC,CAAE,GAAG,EAEnwF,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,gDCX5B,MAAe,QAAG,CAAC,2NAA2N,CAAC,eCA1Q,IAAI,EAAM,CACR,4BAA6B,CAC3B,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,wBAAyB,CACvB,QACA,OACA,OACD,CACD,kCAAmC,CACjC,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4CAA6C,CAC3C,QACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACA,OACA,OACD,CACD,6BAA8B,CAC5B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACA,OACD,CACD,yBAA0B,CACxB,OACA,OACA,OACA,OACD,CACD,mCAAoC,CAClC,QACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACA,OACD,CACD,4CAA6C,CAC3C,QACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,sBAAuB,CACrB,QACA,OACD,CACD,sCAAuC,CACrC,OACA,OACA,OACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,qBAAsB,CACpB,QACA,OACA,OACD,CACD,2BAA4B,CAC1B,QACA,OACA,MACD,CACD,iCAAkC,CAChC,MACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,sBAAuB,CACrB,QACA,OACA,OACD,CACD,uCAAwC,CACtC,OACA,OACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,gCAAiC,CAC/B,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,6BAA8B,CAC5B,QACA,OACD,CACD,yBAA0B,CACxB,OACA,OACA,OACD,CACD,8BAA+B,CAC7B,QACA,OACD,CACD,iCAAkC,CAChC,QACA,OACA,MACA,MACD,CACD,2BAA4B,CAC1B,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,+BAAgC,CAC9B,QACA,OACD,CACD,6BAA8B,CAC5B,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,gCAAiC,CAC/B,QACA,OACA,OACA,OACA,OACD,CACD,mCAAoC,CAClC,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,0BAA2B,CACzB,QACA,OACD,CACD,0CAA2C,CACzC,QACA,OACA,OACD,CACD,0BAA2B,CACzB,QACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,2BAA4B,CAC1B,QACA,MACA,OACA,OACA,MACA,OACA,OACA,MACA,OACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,kCAAmC,CACjC,QACA,OACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACD,CACD,4BAA6B,CAC3B,QACA,OACA,MACD,CACD,4BAA6B,CAC3B,QACA,OACA,OACD,CACD,yCAA0C,CACxC,QACA,OACA,OACA,OACD,CACD,gCAAi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O,MAAM,UACb,EAAW,IAAIkB,KAAK5B,aAAa,OAAO,CAAC,cAAgB,GAC/D,GAAIwB,UAAU,UAAU,EAAI,EAAK,eAAe,EAAI,EAAW,IAAII,KAAQ,CACzE,IAAM,EAAS,IAAIX,gBAEnBO,UAAU,UAAU,CAAC,eAAgB,GAErC,IAAM,EAAc,IAAII,KACxB,EAAY,UAAU,CAAC,EAAY,UAAU,GAAK,GAClD,EAAY,WAAW,CAAC,GACxB,EAAY,aAAa,CAAC,GAC1B,EAAY,aAAa,CAAC,GAC1B,EAAY,kBAAkB,CAAC,GAC/B5B,aAAa,OAAO,CAAC,YAAa,EAAY,WAAW,GAC3D,CACF,CAAE,MAAOE,EAAO,CACdC,QAAQ,KAAK,CAAC,sBAAuBD,EACvC,4FCpBA,MAAe,CAAC;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC,CCvIK,EAAS,CACb,QAAS,EACT,GCtBa,CAAC;AAChB;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CD1BC,GEvBa,CAAC;;AAEhB,CAAC,CFsBC,GGxBa,CAAC;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC,CHjIC,GIzBa,CAAC;;AAEhB,CAAC,CJwBC,GK1Ba,CAAC;AAChB,CAAC,CL0BC,QM3Ba,CAAC;;AAEhB,CAAC,CN0BC,GO5Ba,CAAC;AAChB,CAAC,CP4BC,QQ7Ba,CAAC;AAChB,CAAC,CR6BC,QS9Ba,CAAC;AAChB,CAAC,AT8BD,EAEM,EAAe,CAAC,IAAK,SAAU,KAAM,KAAK,CAC1C,EAAqB,CAAC,QAAS,aAAa,CAE3C,IAAMoC,OAAN,MAAMA,OAKX,YAAY,EAAS,OAAO,CAAE,EAAY,EAAE,CAAE,CAC5C,IAAI,CAAC,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"}