chrome-devtools-frontend 1.0.1037221 → 1.0.1038113

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 (373) hide show
  1. package/config/gni/devtools_grd_files.gni +9 -2
  2. package/front_end/panels/sources/NavigatorView.ts +4 -0
  3. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +244 -244
  4. package/front_end/third_party/lighthouse/locales/en-US.json +2 -2
  5. package/front_end/third_party/lighthouse/locales/en-XL.json +2 -2
  6. package/front_end/third_party/puppeteer/package/README.md +20 -0
  7. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.d.ts +3 -3
  8. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.js +4 -4
  9. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Accessibility.js.map +1 -1
  10. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts.map +1 -1
  11. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.js +10 -8
  12. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
  13. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.d.ts +19 -6
  14. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.d.ts.map +1 -1
  15. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.js +23 -10
  16. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Browser.js.map +1 -1
  17. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.d.ts.map +1 -1
  18. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +3 -2
  19. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  20. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.d.ts.map +1 -1
  21. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.js +35 -20
  22. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ChromeTargetManager.js.map +1 -1
  23. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.d.ts +9 -2
  24. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.d.ts.map +1 -1
  25. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.js +19 -7
  26. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Connection.js.map +1 -1
  27. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.d.ts +5 -4
  28. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.d.ts.map +1 -1
  29. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.js +6 -5
  30. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Coverage.js.map +1 -1
  31. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.d.ts +1 -0
  32. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.d.ts.map +1 -1
  33. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.js +1 -0
  34. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Debug.js.map +1 -1
  35. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.d.ts +2 -0
  36. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.d.ts.map +1 -1
  37. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.js +3 -1
  38. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Dialog.js.map +1 -1
  39. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.d.ts +168 -131
  40. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.d.ts.map +1 -1
  41. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.js +208 -206
  42. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ElementHandle.js.map +1 -1
  43. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +1 -0
  44. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
  45. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +1 -0
  46. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
  47. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts +2 -2
  48. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.js +2 -2
  49. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.d.ts +74 -75
  50. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.d.ts.map +1 -1
  51. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.js +82 -97
  52. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ExecutionContext.js.map +1 -1
  53. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.d.ts +16 -8
  54. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.d.ts.map +1 -1
  55. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.js +17 -9
  56. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FileChooser.js.map +1 -1
  57. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.d.ts +2 -1
  58. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.d.ts.map +1 -1
  59. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.js +3 -2
  60. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FirefoxTargetManager.js.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.d.ts +634 -0
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.d.ts.map +1 -0
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.js +713 -0
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Frame.js.map +1 -0
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.d.ts +9 -679
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.d.ts.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.js +77 -803
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.d.ts +11 -10
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.js +11 -10
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.d.ts +2 -2
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/HTTPResponse.js +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.d.ts +34 -13
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.js +35 -14
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Input.js.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/{DOMWorld.d.ts → IsolatedWorld.d.ts} +58 -13
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/IsolatedWorld.d.ts.map +1 -0
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/{DOMWorld.js → IsolatedWorld.js} +124 -151
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/IsolatedWorld.js.map +1 -0
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.d.ts +40 -58
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.d.ts.map +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.js +53 -76
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/JSHandle.js.map +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +2 -1
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.js +23 -6
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkEventManager.js +17 -17
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.d.ts +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.js +8 -8
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.d.ts +2 -0
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/PDFOptions.js.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.d.ts +395 -296
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.js +398 -313
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Page.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.d.ts +14 -7
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.d.ts.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.js +14 -7
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Puppeteer.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.d.ts +38 -17
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.d.ts.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.js +49 -31
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/QueryHandler.js.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.d.ts +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.js +7 -3
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Target.js.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.d.ts +1 -0
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.d.ts.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.js +4 -2
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Tracing.js.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.d.ts +8 -4
  121. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.js +8 -4
  123. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WebWorker.js.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.d.ts +1 -34
  125. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.js +5 -53
  127. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/util.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +3 -0
  129. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -0
  130. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +6 -0
  131. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -0
  132. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.js +2 -2
  136. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/initializePuppeteer.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.d.ts +28 -0
  138. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.d.ts.map +1 -0
  139. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.js +148 -0
  140. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/Poller.js.map +1 -0
  141. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +2 -0
  142. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts.map +1 -0
  143. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.js +18 -0
  144. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.js.map +1 -0
  145. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +3 -1
  146. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.js +4 -2
  148. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserFetcher.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.js +4 -3
  151. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -2
  154. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.d.ts.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.js +2 -2
  157. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/FirefoxLauncher.js.map +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PipeTransport.js +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/PipeTransport.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.d.ts +3 -1
  161. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.d.ts.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.js +3 -1
  163. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/Puppeteer.js.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.d.ts +3 -2
  165. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.d.ts.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.js +3 -2
  167. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/types.js.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.d.ts +25 -0
  169. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.d.ts.map +1 -0
  170. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.js +78 -0
  171. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/DeferredPromise.js.map +1 -0
  172. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.d.ts +17 -0
  173. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.d.ts.map +1 -0
  174. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.js +22 -0
  175. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/ErrorLike.js.map +1 -0
  176. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/{common → util}/assert.d.ts +0 -0
  177. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/assert.d.ts.map +1 -0
  178. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/{common → util}/assert.js +0 -0
  179. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/assert.js.map +1 -0
  180. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.d.ts +2 -0
  181. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.d.ts.map +1 -0
  182. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.js +19 -0
  183. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/getPackageDirectory.js.map +1 -0
  184. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.d.ts +3 -3
  185. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.js +4 -4
  186. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Accessibility.js.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.d.ts.map +1 -1
  188. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.js +10 -8
  189. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
  190. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.d.ts +19 -6
  191. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.d.ts.map +1 -1
  192. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.js +23 -10
  193. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Browser.js.map +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.d.ts.map +1 -1
  195. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +3 -2
  196. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
  197. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.d.ts.map +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.js +36 -21
  199. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ChromeTargetManager.js.map +1 -1
  200. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.d.ts +9 -2
  201. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.d.ts.map +1 -1
  202. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.js +19 -7
  203. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Connection.js.map +1 -1
  204. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.d.ts +5 -4
  205. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.d.ts.map +1 -1
  206. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.js +6 -5
  207. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Coverage.js.map +1 -1
  208. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.d.ts +1 -0
  209. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.d.ts.map +1 -1
  210. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.js +1 -0
  211. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Debug.js.map +1 -1
  212. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.d.ts +2 -0
  213. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.d.ts.map +1 -1
  214. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.js +3 -1
  215. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Dialog.js.map +1 -1
  216. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.d.ts +168 -131
  217. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.d.ts.map +1 -1
  218. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.js +208 -206
  219. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ElementHandle.js.map +1 -1
  220. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +1 -0
  221. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
  222. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +1 -0
  223. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
  224. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts +2 -2
  225. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.js +2 -2
  226. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.d.ts +74 -75
  227. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.d.ts.map +1 -1
  228. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.js +83 -98
  229. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ExecutionContext.js.map +1 -1
  230. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.d.ts +16 -8
  231. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.d.ts.map +1 -1
  232. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.js +17 -9
  233. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FileChooser.js.map +1 -1
  234. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.d.ts +2 -1
  235. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.d.ts.map +1 -1
  236. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.js +3 -2
  237. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FirefoxTargetManager.js.map +1 -1
  238. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.d.ts +634 -0
  239. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.d.ts.map +1 -0
  240. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.js +709 -0
  241. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Frame.js.map +1 -0
  242. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.d.ts +9 -679
  243. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.d.ts.map +1 -1
  244. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.js +72 -797
  245. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
  246. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.d.ts +11 -10
  247. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  248. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.js +11 -10
  249. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
  250. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.d.ts +2 -2
  251. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  252. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/HTTPResponse.js +1 -1
  253. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.d.ts +34 -13
  254. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.d.ts.map +1 -1
  255. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.js +35 -14
  256. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Input.js.map +1 -1
  257. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/{DOMWorld.d.ts → IsolatedWorld.d.ts} +58 -13
  258. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/IsolatedWorld.d.ts.map +1 -0
  259. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/{DOMWorld.js → IsolatedWorld.js} +123 -150
  260. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/IsolatedWorld.js.map +1 -0
  261. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.d.ts +40 -58
  262. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.d.ts.map +1 -1
  263. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.js +54 -77
  264. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/JSHandle.js.map +1 -1
  265. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +2 -1
  266. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  267. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.js +24 -7
  268. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
  269. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkEventManager.js +17 -17
  270. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.d.ts +1 -1
  271. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
  272. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.js +8 -8
  273. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
  274. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.d.ts +2 -0
  275. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.d.ts.map +1 -1
  276. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/PDFOptions.js.map +1 -1
  277. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.d.ts +395 -296
  278. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.d.ts.map +1 -1
  279. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.js +398 -313
  280. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Page.js.map +1 -1
  281. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.d.ts +14 -7
  282. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.d.ts.map +1 -1
  283. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.js +14 -7
  284. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Puppeteer.js.map +1 -1
  285. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.d.ts +38 -17
  286. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.d.ts.map +1 -1
  287. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.js +49 -31
  288. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/QueryHandler.js.map +1 -1
  289. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.d.ts +1 -1
  290. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.d.ts.map +1 -1
  291. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.js +7 -3
  292. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Target.js.map +1 -1
  293. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.d.ts +1 -0
  294. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.d.ts.map +1 -1
  295. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.js +4 -2
  296. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Tracing.js.map +1 -1
  297. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.d.ts +8 -4
  298. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.d.ts.map +1 -1
  299. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.js +8 -4
  300. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WebWorker.js.map +1 -1
  301. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.d.ts +1 -34
  302. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.d.ts.map +1 -1
  303. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.js +3 -48
  304. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/util.js.map +1 -1
  305. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +3 -0
  306. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -0
  307. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +3 -0
  308. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -0
  309. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
  310. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
  311. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.d.ts.map +1 -1
  312. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.js +2 -2
  313. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/initializePuppeteer.js.map +1 -1
  314. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.d.ts +28 -0
  315. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.d.ts.map +1 -0
  316. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.js +142 -0
  317. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/Poller.js.map +1 -0
  318. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.d.ts +2 -0
  319. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.d.ts.map +1 -0
  320. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.js +2 -0
  321. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/injected/injected.js.map +1 -0
  322. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.d.ts +3 -1
  323. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.d.ts.map +1 -1
  324. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.js +4 -2
  325. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserFetcher.js.map +1 -1
  326. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  327. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.js +3 -2
  328. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
  329. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  330. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -2
  331. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
  332. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.d.ts.map +1 -1
  333. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.js +2 -2
  334. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/FirefoxLauncher.js.map +1 -1
  335. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PipeTransport.js +1 -1
  336. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/PipeTransport.js.map +1 -1
  337. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.d.ts +3 -1
  338. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.d.ts.map +1 -1
  339. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.js +3 -1
  340. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/Puppeteer.js.map +1 -1
  341. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.d.ts +3 -2
  342. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.d.ts.map +1 -1
  343. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.js +3 -2
  344. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/types.js.map +1 -1
  345. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.d.ts +25 -0
  346. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.d.ts.map +1 -0
  347. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.js +73 -0
  348. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/DeferredPromise.js.map +1 -0
  349. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.d.ts +17 -0
  350. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.d.ts.map +1 -0
  351. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.js +17 -0
  352. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/ErrorLike.js.map +1 -0
  353. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/{common → util}/assert.d.ts +0 -0
  354. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/assert.d.ts.map +1 -0
  355. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/{common → util}/assert.js +0 -0
  356. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/assert.js.map +1 -0
  357. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.d.ts +2 -0
  358. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.d.ts.map +1 -0
  359. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.js +15 -0
  360. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/getPackageDirectory.js.map +1 -0
  361. package/front_end/third_party/puppeteer/package/lib/types.d.ts +1069 -878
  362. package/front_end/third_party/puppeteer/package/package.json +32 -28
  363. package/front_end/third_party/puppeteer/package/typescript-if-required.js +1 -1
  364. package/front_end/third_party/puppeteer/puppeteer.ts +1 -1
  365. package/package.json +1 -1
  366. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DOMWorld.d.ts.map +0 -1
  367. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DOMWorld.js.map +0 -1
  368. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/assert.d.ts.map +0 -1
  369. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/assert.js.map +0 -1
  370. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DOMWorld.d.ts.map +0 -1
  371. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DOMWorld.js.map +0 -1
  372. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/assert.d.ts.map +0 -1
  373. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/assert.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Lighthouse v9.6.2 bf2665f0c6dfe20f969f2891b42d23650c10fcfd (Jun 08 2022)
2
+ * Lighthouse v9.6.6 86ee553a3dfe0f6f49f55f87837953f848a2a33c (Aug 16 2022)
3
3
  *
4
4
  * Automated auditing, performance metrics, and best practices for the web.
5
5
  *
@@ -98,16 +98,16 @@ for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};return function(e,t){fun
98
98
  return t?Cn({},e||{},t||{},Object.keys(e).reduce((function(r,a){return r[a]=Cn({},e[a],t[a]||{}),r}),{})):e}(e[a],t[a]),r}),Cn({},e)):e}var In=function(e){function FormatError(t,r){var a=e.call(this,t)||this;return a.variableId=r,a}return Dn(FormatError,e),FormatError}(Error);function createDefaultFormatters(){return{getNumberFormat:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.NumberFormat).bind.apply(e,[void 0].concat(t)))},getDateTimeFormat:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.DateTimeFormat).bind.apply(e,[void 0].concat(t)))},getPluralRules:function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return new((e=Intl.PluralRules).bind.apply(e,[void 0].concat(t)))}}}var Nn=function(){function IntlMessageFormat(e,t,r,a){var n=this;if(void 0===t&&(t=IntlMessageFormat.defaultLocale),this.format=function(e){try{return formatPatterns(n.pattern,e)}catch(e){
99
99
  throw e.variableId?new Error("The intl string context variable '"+e.variableId+"' was not provided to the string '"+n.message+"'"):e}},"string"==typeof e){if(!IntlMessageFormat.__parse)throw new TypeError("IntlMessageFormat.__parse must be set to process `message` of type `string`");this.ast=IntlMessageFormat.__parse(e)}else this.ast=e;if(this.message=e,!this.ast||"messageFormatPattern"!==this.ast.type)throw new TypeError("A message must be provided as a String or AST.");var i=mergeConfigs(IntlMessageFormat.formats,r);this.locale=resolveLocale(t||[]);var o=a&&a.formatters||createDefaultFormatters();this.pattern=new En(t,i,o).compile(this.ast)}return IntlMessageFormat.prototype.resolvedOptions=function(){return{locale:this.locale}},IntlMessageFormat.prototype.getAst=function(){return this.ast},IntlMessageFormat.defaultLocale="en",IntlMessageFormat.__parse=void 0,IntlMessageFormat.formats={number:{currency:{style:"currency"},percent:{style:"percent"}},date:{short:{month:"numeric",
100
100
  day:"numeric",year:"2-digit"},medium:{month:"short",day:"numeric",year:"numeric"},long:{month:"long",day:"numeric",year:"numeric"},full:{weekday:"long",month:"long",day:"numeric",year:"numeric"}},time:{short:{hour:"numeric",minute:"numeric"},medium:{hour:"numeric",minute:"numeric",second:"numeric"},long:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"},full:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"}}},IntlMessageFormat}();Nn.__parse=Sn.parse;var Ln=getAugmentedNamespace(Object.freeze({__proto__:null,default:Nn,createDefaultFormatters,IntlMessageFormat:Nn}));var Mn={isObjectOfUnknownValues:function isObjectOfUnknownValues$1(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)},isObjectOrArrayOfUnknownValues:function isObjectOrArrayOfUnknownValues$1(e){return"object"==typeof e&&null!==e}},Pn=getAugmentedNamespace(Object.freeze({__proto__:null,default:{}}))
101
- ;const On=Ln,{isObjectOfUnknownValues:Fn,isObjectOrArrayOfUnknownValues:Un}=Mn,jn=Pn.default||Pn,Bn="en-US",$n=["ar-XB.json","ar.json","bg.json","ca.json","cs.json","da.json","de.json","el.json","en-GB.json","en-US.json","en-XA.json","en-XL.json","es-419.json","es.json","fi.json","fil.json","fr.json","he.json","hi.json","hr.json","hu.json","id.json","it.json","ja.json","ko.json","lt.json","lv.json","nl.json","no.json","pl.json","pt-PT.json","pt.json","ro.json","ru.json","sk.json","sl.json","sr-Latn.json","sr.json","sv.json","ta.json","te.json","th.json","tr.json","uk.json","vi.json","zh-HK.json","zh-TW.json","zh.json"].filter((e=>e.endsWith(".json")&&!e.endsWith(".ctc.json"))).map((e=>e.replace(".json",""))).sort(),qn=/ | [^\s]+$/,zn={number:{bytes:{maximumFractionDigits:0},milliseconds:{maximumFractionDigits:0},seconds:{minimumFractionDigits:1,maximumFractionDigits:1},extendedPercent:{maximumFractionDigits:2,style:"percent"}}};function collectAllCustomElementsFromICU(e,t=new Map){
102
- for(const r of e)if("argumentElement"===r.type&&(t.set(r.id,r),r.format&&"pluralFormat"===r.format.type))for(const e of r.format.options)collectAllCustomElementsFromICU(e.value.elements,t);return t}function formatMessage$1(e,t={},r){const a="en-XA"===r||"en-XL"===r?"de-DE":r,n=new(On.IntlMessageFormat||On)(e,a,zn),i=function _preformatValues(e,t,r){const a=[...collectAllCustomElementsFromICU(e.getAst().elements).values()],n={};for(const{id:e,format:i}of a){if(e&&e in t==0)throw new Error(`ICU Message "${r}" contains a value reference ("${e}") that wasn't provided`);const a=t[e];if(i&&"numberFormat"===i.type){if("number"!=typeof a)throw new Error(`ICU Message "${r}" contains a numeric reference ("${e}") but provided value was not a number`);"milliseconds"===i.style?n[e]=10*Math.round(a/10):"seconds"===i.style&&"timeInMs"===e?n[e]=Math.round(a/100)/10:"bytes"===i.style?n[e]=a/1024:n[e]=a}else n[e]=a}for(const e of Object.keys(t))if(!(e in n)){
103
- if("errorCode"!==e)throw new Error(`Provided value "${e}" does not match any placeholder in ICU message "${r}"`);n.errorCode=t.errorCode}return n}(n,t,e);return n.format(i)}function isIcuMessage$2(e){if(!Fn(e))return!1;const{i18nId:t,values:r,formattedDefault:a}=e;if("string"!=typeof t)return!1;if("string"!=typeof a)return!1;if(void 0!==r){if(!Fn(r))return!1;for(const e of Object.values(r))if("string"!=typeof e&&"number"!=typeof e)return!1}return qn.test(t)}function getFormatted(e,t){if(isIcuMessage$2(e))return function _localizeIcuMessage(e,t){const r=_getLocaleMessages(t)[e.i18nId];return r?formatMessage$1(r.message,e.values,t):e.formattedDefault}(e,t);if("string"==typeof e)return e;throw new Error("Attempted to format invalid icuMessage type")}function _formatPathAsString(e){let t="";for(const r of e)if(/^[a-z]+$/i.test(r))t.length&&(t+="."),t+=r;else{if(/]|"|'|\s/.test(r))throw new Error(`Cannot handle "${r}" in i18n`);t+=`[${r}]`}return t}function _getLocaleMessages(e){
104
- const t=jn[e];if(!t){if(e===Bn)return{};throw new Error(`Unsupported locale '${e}'`)}return t}function getIcuMessageIdParts(e){if(!qn.test(e))throw Error(`"${e}" does not appear to be a valid ICU message id`);const[t,r]=e.split(" | ");return{filename:t,key:r}}var Vn={DEFAULT_LOCALE:Bn,_formatPathAsString,collectAllCustomElementsFromICU,isIcuMessage:isIcuMessage$2,getFormatted,getRendererFormattedStrings:function getRendererFormattedStrings(e){const t=_getLocaleMessages(e),r=Object.keys(t).filter((e=>e.startsWith("report/"))),a={};for(const e of r){const{filename:r,key:n}=getIcuMessageIdParts(e);if(!r.endsWith("util.js"))throw new Error(`Unexpected message: ${e}`);a[n]=t[e].message}return a},replaceIcuMessages:function replaceIcuMessages(e,t){const r={};return function replaceInObject(e,r,a=[]){if(Un(e))for(const[n,i]of Object.entries(e)){const o=a.concat([n]);if(isIcuMessage$2(i)){const a=getFormatted(i,t),s=r[i.i18nId]||[],c=_formatPathAsString(o);s.push(i.values?{values:i.values,
105
- path:c}:c),e[n]=a,r[i.i18nId]=s}else replaceInObject(i,r,o)}}(e,r),r},hasLocale:function hasLocale(e){if(e===Bn)return!0;const t=Intl.NumberFormat.supportedLocalesOf([e]).length>0,r=Boolean(jn[e]);return t&&r},registerLocaleData:function registerLocaleData(e,t){jn[e]=t},formatMessage:formatMessage$1,getIcuMessageIdParts,getAvailableLocales:function getAvailableLocales$1(){return[...new Set([...Object.keys(jn),Bn])].sort()},getCanonicalLocales:function getCanonicalLocales(){return $n}};const Wn=globalThis.URL;var Gn=getAugmentedNamespace(Object.freeze({__proto__:null,URL:Wn}));const Hn=wn,Yn=bn,Kn=Gn;var Jn={LH_ROOT:"",readJson(e,t){const r=t?Yn.dirname(Kn.fileURLToPath(t.url)):"";return e=Yn.resolve(r,e),JSON.parse(Hn.readFileSync(e,"utf-8"))}};const Xn=bn,Zn=function lookupClosestLocale(e,t){if("string"==typeof e&&t[e])return e;for(var r=[].concat(e||[]),a=0,n=r.length;a<n;++a)for(var i=r[a].split("-");i.length;){var o=i.join("-");if(t[o])return o;i.pop()}
106
- },{getAvailableLocales:Qn}=Vn,ei=on.default,{LH_ROOT:ti}=Jn,{isIcuMessage:ri,formatMessage:ai,DEFAULT_LOCALE:ni}=Vn,ii={ms:"{timeInMs, number, milliseconds} ms",seconds:"{timeInMs, number, seconds} s",displayValueByteSavings:"Potential savings of {wastedBytes, number, bytes} KiB",displayValueMsSavings:"Potential savings of {wastedMs, number, milliseconds} ms",displayValueElementsFound:"{nodeCount, plural, =1 {1 element found} other {# elements found}}",columnURL:"URL",columnSize:"Size",columnResourceSize:"Resource Size",columnTransferSize:"Transfer Size",columnCacheTTL:"Cache TTL",columnWastedBytes:"Potential Savings",columnWastedMs:"Potential Savings",columnBlockingTime:"Main-Thread Blocking Time",columnTimeSpent:"Time Spent",columnLocation:"Location",columnResourceType:"Resource Type",columnRequests:"Requests",columnName:"Name",columnSource:"Source",columnOverBudget:"Over Budget",columnElement:"Element",columnStartTime:"Start Time",columnDuration:"Duration",
107
- columnFailingElem:"Failing Elements",columnDescription:"Description",totalResourceType:"Total",documentResourceType:"Document",scriptResourceType:"Script",stylesheetResourceType:"Stylesheet",imageResourceType:"Image",mediaResourceType:"Media",fontResourceType:"Font",otherResourceType:"Other",thirdPartyResourceType:"Third-party",otherResourcesLabel:"Other resources",firstContentfulPaintMetric:"First Contentful Paint",interactiveMetric:"Time to Interactive",firstMeaningfulPaintMetric:"First Meaningful Paint",totalBlockingTimeMetric:"Total Blocking Time",maxPotentialFIDMetric:"Max Potential First Input Delay",speedIndexMetric:"Speed Index",largestContentfulPaintMetric:"Largest Contentful Paint",cumulativeLayoutShiftMetric:"Cumulative Layout Shift",interactionToNextPaint:"Interaction to Next Paint",itemSeverityLow:"Low",itemSeverityMedium:"Medium",itemSeverityHigh:"High"};function createIcuMessageFn(e,t){const r={...ii,...t};return(a,n)=>{const i=Object.keys(r).find((e=>r[e]===a))
108
- ;if(!i)throw new Error(`Could not locate: ${a}`);const o=i in t?e:"lighthouse-core/lib/i18n/i18n.js";return{i18nId:`${Xn.relative(ti,o).replace(/\\/g,"/")} | ${i}`,values:n,formattedDefault:ai(a,n,ni)}}}var oi={UIStrings:ii,lookupLocale:function lookupLocale(e,t){if("object"!=typeof Intl)throw new Error("Lighthouse must be run in Node with `Intl` support. See https://nodejs.org/api/intl.html for help");const r=Intl.getCanonicalLocales(e),a=Intl.NumberFormat.supportedLocalesOf(r),n=t||Qn(),i=Object.fromEntries(n.map((e=>[e,{}]))),o=Zn(a,i);return o||(0===Intl.NumberFormat.supportedLocalesOf("es").length&&ei.warn("i18n","Requested locale not available in this version of node. The `full-icu` npm module can provide additional locales. For help, see https://github.com/GoogleChrome/lighthouse/blob/master/readme.md#how-do-i-get-localized-lighthouse-results-via-the-cli"),ei.warn("i18n",`locale(s) '${e}' not available. Falling back to default '${ni}'`)),o||ni},createIcuMessageFn,
109
- isStringOrIcuMessage:function isStringOrIcuMessage(e){return"string"==typeof e||ri(e)},createMessageInstanceIdFn:createIcuMessageFn};const si=on.default,ci=mn,li=hn,ui={warningSlowHostCpu:"The tested device appears to have a slower CPU than Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#cpu-throttling)."},di=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/environment.js",ui);function getSlowHostCpuWarning(e){const{settings:t,baseArtifacts:r}=e,{throttling:a,throttlingMethod:n}=t,i=ci.defaultSettings.throttling;if("cli"!==t.channel)return;const o="simulate"===n||"devtools"===n,s=a.cpuSlowdownMultiplier===i.cpuSlowdownMultiplier;return!o||!s||r.BenchmarkIndex>1e3?void 0:di(ui.warningSlowHostCpu)}var mi={UIStrings:ui,getBrowserVersion:async function getBrowserVersion$3(e){const t={msg:"Getting browser version",
110
- id:"lh:gather:getVersion"};si.time(t,"verbose");const r=await e.sendCommand("Browser.getVersion"),a=r.product.match(/\/(\d+)/),n=a?parseInt(a[1]):0;return si.timeEnd(t),Object.assign(r,{milestone:n})},getBenchmarkIndex:async function getBenchmarkIndex$2(e){const t={msg:"Benchmarking machine",id:"lh:gather:getBenchmarkIndex"};si.time(t);const r=await e.evaluate(li.computeBenchmarkIndex,{args:[]});return si.timeEnd(t),r},getSlowHostCpuWarning,getEnvironmentWarnings:function getEnvironmentWarnings$2(e){return[getSlowHostCpuWarning(e)].filter((e=>!!e))}};
101
+ ;const On=Ln,{isObjectOfUnknownValues:Fn,isObjectOrArrayOfUnknownValues:Un}=Mn,jn=Pn.default||Pn,Bn="en-US",$n=["ar-XB.json","ar.json","bg.json","ca.json","cs.json","da.json","de.json","el.json","en-GB.json","en-US.ctc.json","en-US.json","en-XA.json","en-XL.ctc.json","en-XL.json","es-419.json","es.json","fi.json","fil.json","fr.json","he.json","hi.json","hr.json","hu.json","id.json","it.json","ja.json","ko.json","lt.json","lv.json","nl.json","no.json","pl.json","pt-PT.json","pt.json","ro.json","ru.json","sk.json","sl.json","sr-Latn.json","sr.json","sv.json","ta.json","te.json","th.json","tr.json","uk.json","vi.json","zh-HK.json","zh-TW.json","zh.json"].filter((e=>e.endsWith(".json")&&!e.endsWith(".ctc.json"))).map((e=>e.replace(".json",""))).sort(),qn=/ | [^\s]+$/,zn={number:{bytes:{maximumFractionDigits:0},milliseconds:{maximumFractionDigits:0},seconds:{minimumFractionDigits:1,maximumFractionDigits:1},extendedPercent:{maximumFractionDigits:2,style:"percent"}}}
102
+ ;function collectAllCustomElementsFromICU(e,t=new Map){for(const r of e)if("argumentElement"===r.type&&(t.set(r.id,r),r.format&&"pluralFormat"===r.format.type))for(const e of r.format.options)collectAllCustomElementsFromICU(e.value.elements,t);return t}function formatMessage$1(e,t={},r){const a="en-XA"===r||"en-XL"===r?"de-DE":r,n=new(On.IntlMessageFormat||On)(e,a,zn),i=function _preformatValues(e,t,r){const a=[...collectAllCustomElementsFromICU(e.getAst().elements).values()],n={};for(const{id:e,format:i}of a){if(e&&e in t==0)throw new Error(`ICU Message "${r}" contains a value reference ("${e}") that wasn't provided`);const a=t[e];if(i&&"numberFormat"===i.type){if("number"!=typeof a)throw new Error(`ICU Message "${r}" contains a numeric reference ("${e}") but provided value was not a number`);"milliseconds"===i.style?n[e]=10*Math.round(a/10):"seconds"===i.style&&"timeInMs"===e?n[e]=Math.round(a/100)/10:"bytes"===i.style?n[e]=a/1024:n[e]=a}else n[e]=a}
103
+ for(const e of Object.keys(t))if(!(e in n)){if("errorCode"!==e)throw new Error(`Provided value "${e}" does not match any placeholder in ICU message "${r}"`);n.errorCode=t.errorCode}return n}(n,t,e);return n.format(i)}function isIcuMessage$2(e){if(!Fn(e))return!1;const{i18nId:t,values:r,formattedDefault:a}=e;if("string"!=typeof t)return!1;if("string"!=typeof a)return!1;if(void 0!==r){if(!Fn(r))return!1;for(const e of Object.values(r))if("string"!=typeof e&&"number"!=typeof e)return!1}return qn.test(t)}function getFormatted(e,t){if(isIcuMessage$2(e))return function _localizeIcuMessage(e,t){const r=_getLocaleMessages(t)[e.i18nId];return r?formatMessage$1(r.message,e.values,t):e.formattedDefault}(e,t);if("string"==typeof e)return e;throw new Error("Attempted to format invalid icuMessage type")}function _formatPathAsString(e){let t="";for(const r of e)if(/^[a-z]+$/i.test(r))t.length&&(t+="."),t+=r;else{if(/]|"|'|\s/.test(r))throw new Error(`Cannot handle "${r}" in i18n`);t+=`[${r}]`}
104
+ return t}function _getLocaleMessages(e){const t=jn[e];if(!t){if(e===Bn)return{};throw new Error(`Unsupported locale '${e}'`)}return t}function getIcuMessageIdParts(e){if(!qn.test(e))throw Error(`"${e}" does not appear to be a valid ICU message id`);const[t,r]=e.split(" | ");return{filename:t,key:r}}var Vn={DEFAULT_LOCALE:Bn,_formatPathAsString,collectAllCustomElementsFromICU,isIcuMessage:isIcuMessage$2,getFormatted,getRendererFormattedStrings:function getRendererFormattedStrings(e){const t=_getLocaleMessages(e),r=Object.keys(t).filter((e=>e.startsWith("report/"))),a={};for(const e of r){const{filename:r,key:n}=getIcuMessageIdParts(e);if(!r.endsWith("util.js"))throw new Error(`Unexpected message: ${e}`);a[n]=t[e].message}return a},replaceIcuMessages:function replaceIcuMessages(e,t){const r={};return function replaceInObject(e,r,a=[]){if(Un(e))for(const[n,i]of Object.entries(e)){const o=a.concat([n]);if(isIcuMessage$2(i)){
105
+ const a=getFormatted(i,t),s=r[i.i18nId]||[],c=_formatPathAsString(o);s.push(i.values?{values:i.values,path:c}:c),e[n]=a,r[i.i18nId]=s}else replaceInObject(i,r,o)}}(e,r),r},hasLocale:function hasLocale(e){if(e===Bn)return!0;const t=Intl.NumberFormat.supportedLocalesOf([e]).length>0,r=Boolean(jn[e]);return t&&r},registerLocaleData:function registerLocaleData(e,t){jn[e]=t},formatMessage:formatMessage$1,getIcuMessageIdParts,getAvailableLocales:function getAvailableLocales$1(){return[...new Set([...Object.keys(jn),Bn])].sort()},getCanonicalLocales:function getCanonicalLocales(){return $n}};const Wn=globalThis.URL;var Gn=getAugmentedNamespace(Object.freeze({__proto__:null,URL:Wn}));const Hn=wn,Yn=bn,Kn=Gn;var Jn={LH_ROOT:"",readJson(e,t){const r=t?Yn.dirname(Kn.fileURLToPath(t.url)):"";return e=Yn.resolve(r,e),JSON.parse(Hn.readFileSync(e,"utf-8"))}};const Xn=bn,Zn=function lookupClosestLocale(e,t){if("string"==typeof e&&t[e])return e
106
+ ;for(var r=[].concat(e||[]),a=0,n=r.length;a<n;++a)for(var i=r[a].split("-");i.length;){var o=i.join("-");if(t[o])return o;i.pop()}},{getAvailableLocales:Qn}=Vn,ei=on.default,{LH_ROOT:ti}=Jn,{isIcuMessage:ri,formatMessage:ai,DEFAULT_LOCALE:ni}=Vn,ii={ms:"{timeInMs, number, milliseconds} ms",seconds:"{timeInMs, number, seconds} s",displayValueByteSavings:"Potential savings of {wastedBytes, number, bytes} KiB",displayValueMsSavings:"Potential savings of {wastedMs, number, milliseconds} ms",displayValueElementsFound:"{nodeCount, plural, =1 {1 element found} other {# elements found}}",columnURL:"URL",columnSize:"Size",columnResourceSize:"Resource Size",columnTransferSize:"Transfer Size",columnCacheTTL:"Cache TTL",columnWastedBytes:"Potential Savings",columnWastedMs:"Potential Savings",columnBlockingTime:"Main-Thread Blocking Time",columnTimeSpent:"Time Spent",columnLocation:"Location",columnResourceType:"Resource Type",columnRequests:"Requests",columnName:"Name",columnSource:"Source",
107
+ columnOverBudget:"Over Budget",columnElement:"Element",columnStartTime:"Start Time",columnDuration:"Duration",columnFailingElem:"Failing Elements",columnDescription:"Description",totalResourceType:"Total",documentResourceType:"Document",scriptResourceType:"Script",stylesheetResourceType:"Stylesheet",imageResourceType:"Image",mediaResourceType:"Media",fontResourceType:"Font",otherResourceType:"Other",thirdPartyResourceType:"Third-party",otherResourcesLabel:"Other resources",firstContentfulPaintMetric:"First Contentful Paint",interactiveMetric:"Time to Interactive",firstMeaningfulPaintMetric:"First Meaningful Paint",totalBlockingTimeMetric:"Total Blocking Time",maxPotentialFIDMetric:"Max Potential First Input Delay",speedIndexMetric:"Speed Index",largestContentfulPaintMetric:"Largest Contentful Paint",cumulativeLayoutShiftMetric:"Cumulative Layout Shift",interactionToNextPaint:"Interaction to Next Paint",itemSeverityLow:"Low",itemSeverityMedium:"Medium",itemSeverityHigh:"High"}
108
+ ;function createIcuMessageFn(e,t){const r={...ii,...t};return(a,n)=>{const i=Object.keys(r).find((e=>r[e]===a));if(!i)throw new Error(`Could not locate: ${a}`);const o=i in t?e:"lighthouse-core/lib/i18n/i18n.js";return{i18nId:`${Xn.relative(ti,o).replace(/\\/g,"/")} | ${i}`,values:n,formattedDefault:ai(a,n,ni)}}}var oi={UIStrings:ii,lookupLocale:function lookupLocale(e,t){if("object"!=typeof Intl)throw new Error("Lighthouse must be run in Node with `Intl` support. See https://nodejs.org/api/intl.html for help");const r=Intl.getCanonicalLocales(e),a=Intl.NumberFormat.supportedLocalesOf(r),n=t||Qn(),i=Object.fromEntries(n.map((e=>[e,{}]))),o=Zn(a,i);return o||(0===Intl.NumberFormat.supportedLocalesOf("es").length&&ei.warn("i18n","Requested locale not available in this version of node. The `full-icu` npm module can provide additional locales. For help, see https://github.com/GoogleChrome/lighthouse/blob/master/readme.md#how-do-i-get-localized-lighthouse-results-via-the-cli"),
109
+ ei.warn("i18n",`locale(s) '${e}' not available. Falling back to default '${ni}'`)),o||ni},createIcuMessageFn,isStringOrIcuMessage:function isStringOrIcuMessage(e){return"string"==typeof e||ri(e)},createMessageInstanceIdFn:createIcuMessageFn};const si=on.default,ci=mn,li=hn,ui={warningSlowHostCpu:"The tested device appears to have a slower CPU than Lighthouse expects. This can negatively affect your performance score. Learn more about [calibrating an appropriate CPU slowdown multiplier](https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#cpu-throttling)."},di=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/environment.js",ui);function getSlowHostCpuWarning(e){const{settings:t,baseArtifacts:r}=e,{throttling:a,throttlingMethod:n}=t,i=ci.defaultSettings.throttling;if("cli"!==t.channel)return;const o="simulate"===n||"devtools"===n,s=a.cpuSlowdownMultiplier===i.cpuSlowdownMultiplier;return!o||!s||r.BenchmarkIndex>1e3?void 0:di(ui.warningSlowHostCpu)}
110
+ var mi={UIStrings:ui,getBrowserVersion:async function getBrowserVersion$3(e){const t={msg:"Getting browser version",id:"lh:gather:getVersion"};si.time(t,"verbose");const r=await e.sendCommand("Browser.getVersion"),a=r.product.match(/\/(\d+)/),n=a?parseInt(a[1]):0;return si.timeEnd(t),Object.assign(r,{milestone:n})},getBenchmarkIndex:async function getBenchmarkIndex$2(e){const t={msg:"Benchmarking machine",id:"lh:gather:getBenchmarkIndex"};si.time(t);const r=await e.evaluate(li.computeBenchmarkIndex,{args:[]});return si.timeEnd(t),r},getSlowHostCpuWarning,getEnvironmentWarnings:function getEnvironmentWarnings$2(e){return[getSlowHostCpuWarning(e)].filter((e=>!!e))}};
111
111
  /**
112
112
  * @license Copyright 2020 Google Inc. All Rights Reserved.
113
113
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
@@ -138,7 +138,7 @@ opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Esti
138
138
  viewTraceLabel:"View Trace",viewOriginalTraceLabel:"View Original Trace",dropdownPrintSummary:"Print Summary",dropdownPrintExpanded:"Print Expanded",dropdownCopyJSON:"Copy JSON",dropdownSaveHTML:"Save as HTML",dropdownSaveJSON:"Save as JSON",dropdownViewer:"Open in Viewer",dropdownSaveGist:"Save as Gist",dropdownDarkTheme:"Toggle Dark Theme",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G4",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page load",runtimeAnalysisWindow:"Initial page load",runtimeSingleLoadTooltip:"This data is taken from a single page load, as opposed to field data summarizing many sessions.",
139
139
  throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expandView:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling"};Util$3.UIStrings=Ii;var Ni={Util:Util$3,UIStrings:Ii};const{Util:Li}=Ni,Mi=vi.exports,Pi=["https:","http:","chrome:","chrome-extension:"],Oi=["data","https","wss","blob","chrome","chrome-extension","about","filesystem"],Fi=["localhost","127.0.0.1"],Ui=["blob","data","intent","file","filesystem"];function rewriteChromeInternalUrl(e){return e&&e.startsWith("chrome://")?(e.endsWith("/")&&(e=e.replace(/\/$/,"")),e.replace(/^chrome:\/\/chrome\//,"chrome://")):e}class URLShim extends URL{static isValid(e){try{return new URL(e),!0}catch(e){return!1}}static hostsMatch(e,t){try{return new URL(e).host===new URL(t).host}catch(e){return!1}}static originsMatch(e,t){try{return new URL(e).origin===new URL(t).origin}catch(e){return!1}}static getOrigin(e){try{const t=new URL(e);return t.host&&t.origin||null
140
140
  }catch(e){return null}}static rootDomainsMatch(e,t){let r,a;try{r=Li.createOrReturnURL(e),a=Li.createOrReturnURL(t)}catch(e){return!1}if(!r.hostname||!a.hostname)return!1;return Li.getRootDomain(r)===Li.getRootDomain(a)}static getURLDisplayName(e,t){return Li.getURLDisplayName(new URL(e),t)}static elideDataURI(e){try{return"data:"===new URL(e).protocol?e.slice(0,100):e}catch(t){return e}}static equalWithExcludedFragments(e,t){[e,t]=[e,t].map(rewriteChromeInternalUrl);try{const r=new URL(e);r.hash="";const a=new URL(t);return a.hash="",r.href===a.href}catch(e){return!1}}static isProtocolAllowed(e){try{const t=new URL(e);return Pi.includes(t.protocol)}catch(e){return!1}}static isLikeLocalhost(e){return Fi.includes(e)||e.endsWith(".localhost")}static isSecureScheme(e){return Oi.includes(e)}static isNonNetworkProtocol(e){const t=e.includes(":")?e.slice(0,e.indexOf(":")):e;return Ui.includes(t)}static guessMimeType(e){let t;try{t=new URL(e)}catch{return}if("data:"===t.protocol){
141
- const e=t.pathname.match(/image\/(png|jpeg|svg\+xml|webp|gif|avif)(?=;)/);if(!e)return;return e[0]}const r=t.pathname.toLowerCase().match(/\.(png|jpeg|jpg|svg|webp|gif|avif)$/);if(!r)return;const a=r[1];return"svg"===a?"image/svg+xml":"jpg"===a?"image/jpeg":`image/${a}`}static normalizeUrl(e){if(e&&this.isValid(e)&&this.isProtocolAllowed(e))return new URL(e).href;throw new Mi(Mi.errors.INVALID_URL)}}URLShim.URL=URL,URLShim.INVALID_URL_DEBUG_STRING="Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.";var ji=URLShim;const Bi=ji,$i="X-TCPMs",qi="X-SSLMs",zi="X-RequestMs",Vi="X-ResponseMs",Wi="X-TotalMs",Gi="X-TotalFetchedSize",Hi="X-ProtocolIsH2",Yi={XHR:"XHR",Fetch:"Fetch",EventSource:"EventSource",Script:"Script",Stylesheet:"Stylesheet",Image:"Image",Media:"Media",Font:"Font",Document:"Document",TextTrack:"TextTrack",WebSocket:"WebSocket",Other:"Other",Manifest:"Manifest",
141
+ const e=t.pathname.match(/^(image\/(png|jpeg|svg\+xml|webp|gif|avif))[;,]/);if(!e)return;return e[1]}const r=t.pathname.toLowerCase().match(/\.(png|jpeg|jpg|svg|webp|gif|avif)$/);if(!r)return;const a=r[1];return"svg"===a?"image/svg+xml":"jpg"===a?"image/jpeg":`image/${a}`}static normalizeUrl(e){if(e&&this.isValid(e)&&this.isProtocolAllowed(e))return new URL(e).href;throw new Mi(Mi.errors.INVALID_URL)}}URLShim.URL=URL,URLShim.INVALID_URL_DEBUG_STRING="Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.";var ji=URLShim;const Bi=ji,$i="X-TCPMs",qi="X-SSLMs",zi="X-RequestMs",Vi="X-ResponseMs",Wi="X-TotalMs",Gi="X-TotalFetchedSize",Hi="X-ProtocolIsH2",Yi={XHR:"XHR",Fetch:"Fetch",EventSource:"EventSource",Script:"Script",Stylesheet:"Stylesheet",Image:"Image",Media:"Media",Font:"Font",Document:"Document",TextTrack:"TextTrack",WebSocket:"WebSocket",Other:"Other",Manifest:"Manifest",
142
142
  SignedExchange:"SignedExchange",Ping:"Ping",Preflight:"Preflight",CSPViolationReport:"CSPViolationReport"};class NetworkRequest$p{constructor(){this.requestId="",this.connectionId="0",this.connectionReused=!1,this.url="",this.protocol="",this.isSecure=!1,this.isValid=!1,this.parsedURL={scheme:""},this.documentURL="",this.startTime=-1,this.endTime=-1,this.responseReceivedTime=-1,this.transferSize=0,this.resourceSize=0,this.fromDiskCache=!1,this.fromMemoryCache=!1,this.fromPrefetchCache=!1,this.lrStatistics=void 0,this.finished=!1,this.requestMethod="",this.statusCode=-1,this.redirectSource=void 0,this.redirectDestination=void 0,this.redirects=void 0,this.failed=!1,this.localizedFailDescription="",this.initiator={type:"other"},this.timing=void 0,this.resourceType=void 0,this.mimeType="",this.priority="Low",this.initiatorRequest=void 0,this.responseHeaders=[],this.responseHeadersText="",this.fetchedViaServiceWorker=!1,this.frameId="",this.sessionId=void 0,this.isLinkPreload=!1}
143
143
  hasErrorStatusCode(){return this.statusCode>=400}setInitiatorRequest(e){this.initiatorRequest=e}onRequestWillBeSent(e){let t;this.requestId=e.requestId;try{t=new Bi(e.request.url)}catch(e){return}this.url=e.request.url,this.documentURL=e.documentURL,this.parsedURL={scheme:t.protocol.split(":")[0],host:t.hostname,securityOrigin:t.origin},this.isSecure=Bi.isSecureScheme(this.parsedURL.scheme),this.startTime=e.timestamp,this.requestMethod=e.request.method,this.initiator=e.initiator,this.resourceType=e.type&&Yi[e.type],this.priority=e.request.initialPriority,this.frameId=e.frameId,this.isLinkPreload="preload"===e.initiator.type||!!e.request.isLinkPreload,this.isValid=!0}onRequestServedFromCache(){this.fromMemoryCache=!0}onResponseReceived(e){this._onResponse(e.response,e.timestamp,e.type),this._updateProtocolForLightrider(),this.frameId=e.frameId}onDataReceived(e){this.resourceSize+=e.dataLength,-1!==e.encodedDataLength&&(this.transferSize+=e.encodedDataLength)}onLoadingFinished(e){
144
144
  this.finished||(this.finished=!0,this.endTime=e.timestamp,e.encodedDataLength>=0&&(this.transferSize=e.encodedDataLength),this._updateResponseReceivedTimeIfNecessary(),this._updateTransferSizeForLightrider(),this._updateTimingsForLightrider())}onLoadingFailed(e){this.finished||(this.finished=!0,this.endTime=e.timestamp,this.failed=!0,this.resourceType=e.type&&Yi[e.type],this.localizedFailDescription=e.errorText,this._updateResponseReceivedTimeIfNecessary(),this._updateTransferSizeForLightrider(),this._updateTimingsForLightrider())}onResourceChangedPriority(e){this.priority=e.newPriority}onRedirectResponse(e){if(!e.redirectResponse)throw new Error("Missing redirectResponse data");this._onResponse(e.redirectResponse,e.timestamp,e.type),this.resourceType=void 0,this.finished=!0,this.endTime=e.timestamp,this._updateResponseReceivedTimeIfNecessary()}setSession(e){this.sessionId=e}_onResponse(e,t,r){this.url=e.url,this.connectionId=String(e.connectionId),
@@ -178,7 +178,7 @@ if(!Number.isFinite(r.receiveHeadersEnd)||r.receiveHeadersEnd<0)return;if(!Numbe
178
178
  static estimateRTTByOrigin(e,t){const{forceCoarseEstimates:r=!1,coarseEstimateMultiplier:a=.3,useDownloadEstimates:n=!0,useSendStartEstimates:i=!0,useHeadersEndEstimates:o=!0}=t||{};let s=NetworkAnalyzer$b._estimateRTTByOriginViaTCPTiming(e);if(!s.size||r){s=new Map;const t=NetworkAnalyzer$b._estimateRTTByOriginViaDownloadTiming(e),r=NetworkAnalyzer$b._estimateRTTByOriginViaSendStartTiming(e),c=NetworkAnalyzer$b._estimateRTTByOriginViaHeadersEndTiming(e);for(const[e,r]of t.entries())n&&s.set(e,r);for(const[e,t]of r.entries()){if(!i)continue;const r=s.get(e)||[];s.set(e,r.concat(t))}for(const[e,t]of c.entries()){if(!o)continue;const r=s.get(e)||[];s.set(e,r.concat(t))}for(const e of s.values())e.forEach(((t,r)=>e[r]=t*a))}if(!s.size)throw new Error("No timing information available");return NetworkAnalyzer$b.summarize(s)}static estimateServerResponseTimeByOrigin(e,t){let r=(t||{}).rttByOrigin;if(!r){r=new Map;const a=NetworkAnalyzer$b.estimateRTTByOrigin(e,t)
179
179
  ;for(const[e,t]of a.entries())r.set(e,t.min)}const a=NetworkAnalyzer$b._estimateResponseTimeByOrigin(e,r);return NetworkAnalyzer$b.summarize(a)}static estimateThroughput(e){let t=0;const r=e.reduce(((e,r)=>("data"===r.parsedURL?.scheme||r.failed||!r.finished||r.statusCode>300||!r.transferSize||(t+=r.transferSize,e.push({time:r.responseReceivedTime,isStart:!0}),e.push({time:r.endTime,isStart:!1})),e)),[]).sort(((e,t)=>e.time-t.time));if(!r.length)return 1/0;let a=0,n=0,i=0;return r.forEach((e=>{e.isStart?(0===a&&(n=e.time),a++):(a--,0===a&&(i+=e.time-n))})),8*t/i}static findMainDocument(e,t){const r=NetworkAnalyzer$b.findOptionalMainDocument(e,t);if(!r)throw new Error("Unable to identify the main resource");return r}static findOptionalMainDocument(e,t){if(t){const r=e.find((e=>t.startsWith(e.url)&&Po.equalWithExcludedFragments(e.url,t)));if(r)return r}const r=e.filter((e=>e.resourceType===Mo.TYPES.Document));if(r.length)return r.reduce(((e,t)=>t.startTime<e.startTime?t:e))}
180
180
  static resolveRedirects(e){for(;e.redirectDestination;)e=e.redirectDestination;return e}}var Fo=NetworkAnalyzer$b;const Uo=vi.exports,jo=Fo;function getNetworkError(e){if(!e)return new Uo(Uo.errors.NO_DOCUMENT_REQUEST);if(e.failed){const t=e.localizedFailDescription;return"net::ERR_NAME_NOT_RESOLVED"===t||"net::ERR_NAME_RESOLUTION_FAILED"===t||t.startsWith("net::ERR_DNS_")?new Uo(Uo.errors.DNS_FAILURE):new Uo(Uo.errors.FAILED_DOCUMENT_REQUEST,{errorDetails:t})}return e.hasErrorStatusCode()?new Uo(Uo.errors.ERRORED_DOCUMENT_REQUEST,{statusCode:`${e.statusCode}`}):void 0}function getInterstitialError(e,t){if(!e)return;return t.find((e=>e.documentURL.startsWith("chrome-error://")))&&e.failed?e.localizedFailDescription.startsWith("net::ERR_CERT")?new Uo(Uo.errors.INSECURE_DOCUMENT_REQUEST,{securityMessages:e.localizedFailDescription}):new Uo(Uo.errors.CHROME_INTERSTITIAL_ERROR):void 0}function getNonHtmlError(e){if(e)return"text/html"!==e.mimeType?new Uo(Uo.errors.NOT_HTML,{
181
- mimeType:e.mimeType}):void 0}var Bo={getNetworkError,getInterstitialError,getPageLoadError:function getPageLoadError$2(e,t){const{url:r,loadFailureMode:a,networkRecords:n}=t;let i,o;try{i=jo.findMainDocument(n,r)}catch(e){}i&&(o=jo.resolveRedirects(i));const s=getNetworkError(i),c=getInterstitialError(i,n),l=getNonHtmlError(o);if("ignore"!==a)return c||(s||(l||e))},getNonHtmlError};var $o=getAugmentedNamespace(Object.freeze({__proto__:null,version:"9.6.2"}));const{version:qo}=$o,zo={latency:0,downloadThroughput:0,uploadThroughput:0,offline:!1},Vo={rate:1};function parseUseragentIntoMetadata(e,t){const r=e.match(/Chrome\/([\d.]+)/)?.[1]||"99.0.1234.0",[a]=r.split(".",1),n="mobile"===t;return{brands:[{brand:"Chromium",version:a},{brand:"Google Chrome",version:a},{brand:"Lighthouse",version:qo}],fullVersion:r,...n?{platform:"Android",platformVersion:"6.0",architecture:"",model:"Moto G4"}:{platform:"macOS",platformVersion:"10.15.7",architecture:"x86",model:""},mobile:n}}
181
+ mimeType:e.mimeType}):void 0}var Bo={getNetworkError,getInterstitialError,getPageLoadError:function getPageLoadError$2(e,t){const{url:r,loadFailureMode:a,networkRecords:n}=t;let i,o;try{i=jo.findMainDocument(n,r)}catch(e){}i&&(o=jo.resolveRedirects(i));const s=getNetworkError(i),c=getInterstitialError(i,n),l=getNonHtmlError(o);if("ignore"!==a)return c||(s||(l||e))},getNonHtmlError};var $o=getAugmentedNamespace(Object.freeze({__proto__:null,version:"9.6.6"}));const{version:qo}=$o,zo={latency:0,downloadThroughput:0,uploadThroughput:0,offline:!1},Vo={rate:1};function parseUseragentIntoMetadata(e,t){const r=e.match(/Chrome\/([\d.]+)/)?.[1]||"99.0.1234.0",[a]=r.split(".",1),n="mobile"===t;return{brands:[{brand:"Chromium",version:a},{brand:"Google Chrome",version:a},{brand:"Lighthouse",version:qo}],fullVersion:r,...n?{platform:"Android",platformVersion:"6.0",architecture:"",model:"Moto G4"}:{platform:"macOS",platformVersion:"10.15.7",architecture:"x86",model:""},mobile:n}}
182
182
  function enableNetworkThrottling(e,t){const r={offline:!1,latency:t.requestLatencyMs||0,downloadThroughput:t.downloadThroughputKbps||0,uploadThroughput:t.uploadThroughputKbps||0};return r.downloadThroughput=Math.floor(1024*r.downloadThroughput/8),r.uploadThroughput=Math.floor(1024*r.uploadThroughput/8),e.sendCommand("Network.emulateNetworkConditions",r)}function clearNetworkThrottling(e){return e.sendCommand("Network.emulateNetworkConditions",zo)}function enableCPUThrottling(e,t){const r=t.cpuSlowdownMultiplier;return e.sendCommand("Emulation.setCPUThrottlingRate",{rate:r})}function clearCPUThrottling(e){return e.sendCommand("Emulation.setCPUThrottlingRate",Vo)}var Wo={emulate:async function emulate(e,t){if(!1!==t.emulatedUserAgent){const r=t.emulatedUserAgent;await e.sendCommand("Network.setUserAgentOverride",{userAgent:r,userAgentMetadata:parseUseragentIntoMetadata(r,t.formFactor)})}if(!0!==t.screenEmulation.disabled){
183
183
  const{width:r,height:a,deviceScaleFactor:n,mobile:i}=t.screenEmulation,o={width:r,height:a,deviceScaleFactor:n,mobile:i};await e.sendCommand("Emulation.setDeviceMetricsOverride",o),await e.sendCommand("Emulation.setTouchEmulationEnabled",{enabled:o.mobile})}},throttle:async function throttle(e,t){if("devtools"!==t.throttlingMethod)return clearNetworkThrottling(e);await Promise.all([enableNetworkThrottling(e,t.throttling),enableCPUThrottling(e,t.throttling)])},clearThrottling:async function clearThrottling(e){await Promise.all([clearNetworkThrottling(e),clearCPUThrottling(e)])},enableNetworkThrottling,clearNetworkThrottling,enableCPUThrottling,clearCPUThrottling};const Go=on.default,Ho={
184
184
  warningData:"{locationCount, plural,\n =1 {There may be stored data affecting loading performance in this location: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}\n other {There may be stored data affecting loading performance in these locations: {locations}. Audit this page in an incognito window to prevent those resources from affecting your scores.}\n }"},Yo=oi.createMessageInstanceIdFn("lighthouse-core/gather/driver/storage.js",Ho);var Ko={clearDataForOrigin:async function clearDataForOrigin(e,t){const r={msg:"Cleaning origin data",id:"lh:storage:clearDataForOrigin"};Go.time(r);const a=new URL(t).origin,n=["file_systems","shader_cache","service_workers","cache_storage"].join(",");e.setNextProtocolTimeout(5e3);try{await e.sendCommand("Storage.clearDataForOrigin",{origin:a,storageTypes:n})}catch(e){if("PROTOCOL_TIMEOUT"!==e.code)throw e;Go.warn("Driver","clearDataForOrigin timed out")}finally{Go.timeEnd(r)}},
@@ -250,7 +250,7 @@ icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18
250
250
  "uses-long-cache-ttl":'Set the "Browser and proxy cache maximum age" in the "Administration » Configuration » Development" page. Read about [Drupal cache and optimizing for performance](https://www.drupal.org/docs/7/managing-site-performance-and-scalability/caching-to-improve-performance/caching-overview#s-drupal-performance-resources).',"uses-optimized-images":"Consider using [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=im_vid_3%3A123&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=optimize+images&solrsort=iss_project_release_usage+desc&op=Search) that automatically optimizes and reduces the size of images uploaded through the site while retaining quality. Also, ensure you are using the native [Responsive Image Styles](https://www.drupal.org/docs/8/mobile-guide/responsive-images-in-drupal-8) provided from Drupal (available in Drupal 8 and above) for all images rendered on the site.",
251
251
  "uses-responsive-images":"Ensure that you are using the native [Responsive Image Styles](https://www.drupal.org/docs/8/mobile-guide/responsive-images-in-drupal-8) provided from Drupal (available in Drupal 8 and above). Use the Responsive Image Styles when rendering image fields through view modes, views, or images uploaded through the WYSIWYG editor.","server-response-time":"Themes, modules, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization module, and/or upgrading your server. Your hosting servers should make use of PHP opcode caching, memory-caching to reduce database query times such as Redis or Memcached, as well as optimized application logic to prepare pages faster.",
252
252
  "uses-rel-preconnect":"Preconnect or dns-prefetch resource hints can be added by installing and configuring [a module](https://www.drupal.org/project/project_module?f%5B0%5D=&f%5B1%5D=&f%5B2%5D=&f%5B3%5D=&f%5B4%5D=sm_field_project_type%3Afull&f%5B5%5D=&f%5B6%5D=&text=dns-prefetch&solrsort=iss_project_release_usage+desc&op=Search) that provides facilities for user agent resource hints.","font-display":"Specify `@font-display` when defining custom fonts in your theme."}},{id:"ezoic",title:"Ezoic",
253
- icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 82 82"><path d="M81.37 48.117C85.301 25.821 70.413 4.56 48.117.63 25.821-3.3 4.56 11.586.63 33.883-3.3 56.178 11.586 77.44 33.883 81.37 56.18 85.301 77.44 70.412 81.37 48.117Zm-8.935-14.17c2.77 12.357-1.942 25.721-12.96 33.436-14.57 10.203-34.656 6.662-44.859-7.909a32.434 32.434 0 0 1-2.869-4.98l28.7-20.097a6.53 6.53 0 1 0-3.744-5.347L9.564 48.054c-2.768-12.359 1.943-25.724 12.96-33.439 14.572-10.203 34.656-6.662 44.86 7.91a32.349 32.349 0 0 1 2.868 4.98L41.554 47.6A6.53 6.53 0 1 0 45.3 52.95l27.136-19.003Z" fill="#5FA624" fill-rule="evenodd"/></svg>',UIStrings:{"unused-css-rules":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Remove Unused CSS` to help with this issue. It will identify the CSS classes that are actually used on each page of your site, and remove any others to keep the file size small.",
253
+ icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 82 82"><path d="M81.37 48.117C85.301 25.821 70.413 4.56 48.117.63 25.821-3.3 4.56 11.586.63 33.883-3.3 56.178 11.586 77.44 33.883 81.37 56.18 85.301 77.44 70.412 81.37 48.117Zm-8.935-14.17c2.77 12.357-1.942 25.721-12.96 33.436-14.57 10.203-34.656 6.662-44.859-7.909a32.434 32.434 0 0 1-2.869-4.98l28.7-20.097a6.53 6.53 0 1 0-3.744-5.347L9.564 48.054c-2.768-12.359 1.943-25.724 12.96-33.439 14.572-10.203 34.656-6.662 44.86 7.91a32.349 32.349 0 0 1 2.868 4.98L41.554 47.6A6.53 6.53 0 1 0 45.3 52.95l27.136-19.003Z" fill="%235FA624" fill-rule="evenodd"/></svg>',UIStrings:{"unused-css-rules":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Remove Unused CSS` to help with this issue. It will identify the CSS classes that are actually used on each page of your site, and remove any others to keep the file size small.",
254
254
  "modern-image-formats":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Next-Gen Formats` to convert images to WebP.","offscreen-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Lazy Load Images` to defer loading off-screen images until they are needed.","render-blocking-resources":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Critical CSS` and `Script Delay` to defer non-critical JS/CSS.","unminified-css":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Minify CSS` to automatically minify your CSS to reduce network payload sizes.","unminified-javascript":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Minify Javascript` to automatically minify your JS to reduce network payload sizes.","uses-long-cache-ttl":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Efficient Static Cache Policy` to set recommended values in the caching header for static assests.",
255
255
  "uses-optimized-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Next-Gen Formats` to convert images to WebP.","uses-responsive-images":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Resize Images` to resize images to a device appropriate size, reducing network payload sizes.","server-response-time":"Use [Ezoic Cloud Caching](https://pubdash.ezoic.com/speed/caching) to cache your content across our world wide network, improving time to first byte.","uses-rel-preconnect":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Pre-Connect Origins` to automatically add `preconnect` resource hints to establish early connections to important third-party origins.","uses-rel-preload":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Preload Fonts` and `Preload Background Images` to add `preload` links to prioritize fetching resources that are currently requested later in page load.",
256
256
  "font-display":"Use [Ezoic Leap](https://pubdash.ezoic.com/speed) and enable `Optimize Fonts` to automatically leverage the `font-display` CSS feature to ensure text is user-visible while webfonts are loading."}},{id:"joomla",title:"Joomla",
@@ -276,10 +276,10 @@ icon:'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 31
276
276
  "uses-text-compression":"Enable text compression in the web server configuration.","uses-responsive-images":"Upload images directly in the media manager to ensure the required image sizes are available. Consider using the [resize filter](https://octobercms.com/docs/markup/filter-resize) or an [image resizing plugin](https://octobercms.com/plugins?search=image) to ensure the optimal image sizes are used.","server-response-time":"Themes, plugins and server specifications all contribute to the server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin and/or upgrade the server. October CMS also allows developers to use [`Queues`](https://octobercms.com/docs/services/queues) to defer the processing of a time consuming task, such as sending an e-mail. This drastically speeds up web requests."}},{id:"react",title:"React",
277
277
  icon:'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"%3E %3Cg fill="%2361DAFB"%3E%3Cpath d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/%3E %3Ccircle cx="420.9" cy="296.5" r="45.7"/%3E %3Cpath d="M520.5 78.1z"/%3E%3C/g%3E%3C/svg%3E',
278
278
  UIStrings:{"unminified-css":"If your build system minifies CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unminified-javascript":"If your build system minifies JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).","unused-javascript":"If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://www.smooth-code.com/open-source/loadable-components/docs/getting-started/).",
279
- "server-response-time":"If you are server-side rendering any React components, consider using `renderToNodeStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#rendertonodestream).",redirects:"If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).","user-timings":"Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)",
279
+ "server-response-time":"If you are server-side rendering any React components, consider using `renderToPipeableStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#renderToPipeableStream).",redirects:"If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).","user-timings":"Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)",
280
280
  "dom-size":'Consider using a "windowing" library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unnecessary re-renders using [`shouldComponentUpdate`](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [`PureComponent`](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [`React.memo`](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the `Effect` hook to improve runtime performance.'}},{id:"wordpress",title:"WordPress",
281
281
  icon:'data:image/svg+xml,%3Csvg viewBox="0 0 122.5 122.5" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="%232f3439"%3E%3Cpath d="M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z"/%3E%3Cpath d="M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z"/%3E%3Cpath d="M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z"/%3E%3C/g%3E%3C/svg%3E',UIStrings:{
282
- "unused-css-rules":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.","modern-image-formats":"Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.",
282
+ "unused-css-rules":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.","modern-image-formats":"Consider using the [Performance Lab](https://wordpress.org/plugins/performance-lab/) plugin to automatically convert your uploaded JPEG images into WebP, wherever supported.",
283
283
  "offscreen-images":"Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).","total-byte-weight":"Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.","render-blocking-resources":"There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.",
284
284
  "unminified-css":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.","unminified-javascript":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.","efficient-animated-content":"Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.",
285
285
  "unused-javascript":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developer.chrome.com/docs/devtools/coverage/) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.","uses-long-cache-ttl":"Read about [Browser Caching in WordPress](https://wordpress.org/support/article/optimization/#browser-caching).","uses-optimized-images":"Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.","uses-text-compression":"You can enable text compression in your web server configuration.",
@@ -560,9 +560,9 @@ parent:void 0,children:[],attributableURLs:[],group:Sv.other,selfTime:NaN}}stati
560
560
  ;for(let t=0;t<e.length;t++){let i=e[t];if("XHRReadyStateChange"===i.event.name){const e=i.event.args.data,t=e?.url;e&&t&&1===e.readyState&&r.xhrs.set(t,i)}for(;a&&Number.isFinite(a.endTime)&&a.endTime<=i.startTime;)MainThreadTasks$9._assignAllTimersUntilTs(a,a.endTime,r,n),a=a.parent;if(a){if(i.endTime>a.endTime){const e=i.endTime-a.endTime;if(e<1e3)a.endTime=i.endTime,a.duration+=e;else if(i.unbounded)i.endTime=a.endTime,i.duration=i.endTime-i.startTime;else{if(!(i.startTime-a.startTime<1e3)||a.children.length){const t=new Error("Fatal trace logic error - child cannot end after parent");throw t.timeDelta=e,t.nextTaskEvent=i.event,t.nextTaskEndEvent=i.endEvent,t.nextTaskEndTime=i.endTime,t.currentTaskEvent=a.event,t.currentTaskEndEvent=a.endEvent,t.currentTaskEndTime=a.endTime,t}{const e=i,t=a,r=a.parent;if(r){const a=r.children.length-1;if(r.children[a]!==t)throw new Error("Fatal trace logic error - impossible children");r.children.pop(),r.children.push(e)}e.parent=r,
561
561
  e.startTime=t.startTime,e.duration=e.endTime-e.startTime,a=e,i=t}}}i.parent=a,a.children.push(i),MainThreadTasks$9._assignAllTimersUntilTs(a,i.startTime,r,n)}a=i}a&&MainThreadTasks$9._assignAllTimersUntilTs(a,a.endTime,r,n)}static _createTasksFromEvents(e,t,r){const a=[],n=[],i=[];for(const t of e)"X"!==t.ph&&"B"!==t.ph||a.push(t),"E"===t.ph&&n.push(t),"TimerInstall"===t.name&&i.push(t);const o=MainThreadTasks$9._createTasksFromStartAndEndEvents(a,n,r).sort(((e,t)=>e.startTime-t.startTime||t.duration-e.duration));return MainThreadTasks$9._createTaskRelationships(o,i,t),o.sort(((e,t)=>e.startTime-t.startTime||t.duration-e.duration))}static _computeRecursiveSelfTime(e,t){if(t&&e.endTime>t.endTime)throw new Error("Fatal trace logic error - child cannot end after parent");const r=e.children.map((t=>MainThreadTasks$9._computeRecursiveSelfTime(t,e))).reduce(((e,t)=>e+t),0);return e.selfTime=e.duration-r,e.duration}static _computeRecursiveAttributableURLs(e,t,r,a){const n=e.event.args,i={
562
562
  ...n.beginData||{},...n.data||{}},o=i.frame||"";let s=a.frameURLsById.get(o);const c=(i.stackTrace||[]).map((e=>e.url)),l=c[0];o&&s&&s.startsWith("about:")&&l&&(a.frameURLsById.set(o,l),s=l);let u=[];switch(e.event.name){case"v8.compile":case"EvaluateScript":case"FunctionCall":u=[i.url,s];break;case"v8.compileModule":u=[e.event.args.fileName];break;case"TimerFire":{const t=e.event.args.data.timerId,r=a.timers.get(t);if(!r)break;u=r.attributableURLs;break}case"ParseHTML":u=[i.url,s];break;case"ParseAuthorStyleSheet":u=[i.styleSheetUrl,s];break;case"UpdateLayoutTree":case"Layout":case"Paint":if(s){u=[s];break}if(r.length)break;u=a.lastTaskURLs;break;case"XHRReadyStateChange":case"XHRLoad":{const e=i.url,t=i.readyState;if(!e||"number"==typeof t&&4!==t)break;const r=a.xhrs.get(e);if(!r)break;u=r.attributableURLs;break}default:u=[]}const d=Array.from(t);for(const e of[...u,...c])e&&(r.includes(e)||r.push(e),d[d.length-1]!==e&&d.push(e));e.attributableURLs=d,
563
- e.children.forEach((e=>MainThreadTasks$9._computeRecursiveAttributableURLs(e,d,r,a))),d.length||e.parent||!r.length||MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,r)}static _setRecursiveEmptyAttributableURLs(e,t){e.attributableURLs.length||(e.attributableURLs=t.slice(),e.children.forEach((e=>MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,t))))}static _computeRecursiveTaskGroup(e,t){const r=Tv[e.event.name];e.group=r||t||Sv.other,e.children.forEach((t=>MainThreadTasks$9._computeRecursiveTaskGroup(t,e.group)))}static getMainThreadTasks(e,t,r){const a=new Map,n=new Map,i=new Map;t.forEach((({id:e,url:t})=>i.set(e,t)));const o={timers:a,xhrs:n,frameURLsById:i,lastTaskURLs:[]},s=MainThreadTasks$9._createTasksFromEvents(e,o,r);for(const e of s)e.parent||(MainThreadTasks$9._computeRecursiveSelfTime(e,void 0),MainThreadTasks$9._computeRecursiveAttributableURLs(e,[],[],o),MainThreadTasks$9._computeRecursiveTaskGroup(e),o.lastTaskURLs=e.attributableURLs);const c=(s[0]||{
564
- startTime:0}).startTime;for(const e of s)if(e.startTime=(e.startTime-c)/1e3,e.endTime=(e.endTime-c)/1e3,e.duration/=1e3,e.selfTime/=1e3,!Number.isFinite(e.selfTime))throw new Error("Invalid task timing data");return s}static printTaskTreeToDebugString(e,t={}){const r=Math.max(...e.map((e=>e.endTime)),0),{printWidth:a=100,startTime:n=0,endTime:i=r,taskLabelFn:o=(e=>e.event.name)}=t;function computeTaskDepth(e){let t=0;for(;e.parent;e=e.parent)t++;return t}const s=(i-n)/a,c=new Map,l=new Map;for(const t of e){if(t.startTime>i||t.endTime<n)continue;const e=computeTaskDepth(t),r=l.get(e)||[];r.push(t),l.set(e,r);const a=String.fromCharCode(65+c.size%26);c.set(t,{id:a,task:t})}const u=[`Trace Duration: ${r.toFixed(0)}ms`,`Range: [${n}, ${i}]`,`█ = ${s.toFixed(2)}ms`,""],d=Array.from(l.entries()).sort(((e,t)=>e[0]-t[0]));for(const[,e]of d){const t=Array.from({length:a}).map((()=>" "));for(const r of e){const e=Math.max(r.startTime,n),a=Math.min(r.endTime,i),{id:o}=c.get(r)||{id:"?"
565
- },l=Math.floor(e/s),u=Math.floor(a/s),d=Math.floor((l+u)/2);for(let e=l;e<=u;e++)t[e]="█";for(let e=0;e<o.length;e++)t[d]=o}u.push(t.join(""))}u.push("");for(const{id:e,task:t}of c.values())u.push(`${e} = ${o(t)}`);return u.join("\n")}}var Ev=MainThreadTasks$9;const xv=Ao,_v=Ev,Av=Yp;var Rv=xv(class MainThreadTasks$8{static async compute_(e,t){const{mainThreadEvents:r,frames:a,timestamps:n}=await Av.request(e,t);return _v.getMainThreadTasks(r,a,n.traceEnd)}},null);const kv=Ki,Dv=new Set(["CpuProfiler::StartProfiling"]),Cv=new Set(["V8.GCCompactor","MajorGC","MinorGC"]);function getJavaScriptURLs$2(e){const t=new Set;for(const r of e)r.resourceType===kv.TYPES.Script&&t.add(r.url);return t}function getAttributableURLForTask$2(e,t){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0];let n=r||a;return n&&"about:blank"!==n||(n=Dv.has(e.event.name)?"Browser":Cv.has(e.event.name)?"Browser GC":"Unattributable"),n}var Iv={getJavaScriptURLs:getJavaScriptURLs$2,
563
+ e.children.forEach((e=>MainThreadTasks$9._computeRecursiveAttributableURLs(e,d,r,a))),d.length||e.parent||!r.length||MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,r)}static _setRecursiveEmptyAttributableURLs(e,t){e.attributableURLs.length||(e.attributableURLs=t.slice(),e.children.forEach((e=>MainThreadTasks$9._setRecursiveEmptyAttributableURLs(e,t))))}static _computeRecursiveTaskGroup(e,t){const r=Tv[e.event.name];e.group=r||t||Sv.other,e.children.forEach((t=>MainThreadTasks$9._computeRecursiveTaskGroup(t,e.group)))}static getMainThreadTasks(e,t,r,a){const n=new Map,i=new Map,o=new Map;t.forEach((({id:e,url:t})=>o.set(e,t)));const s={timers:n,xhrs:i,frameURLsById:o,lastTaskURLs:[]},c=MainThreadTasks$9._createTasksFromEvents(e,s,r);for(const e of c)e.parent||(MainThreadTasks$9._computeRecursiveSelfTime(e,void 0),MainThreadTasks$9._computeRecursiveAttributableURLs(e,[],[],s),MainThreadTasks$9._computeRecursiveTaskGroup(e),s.lastTaskURLs=e.attributableURLs)
564
+ ;const l=a??c[0].startTime;for(const e of c)if(e.startTime=(e.startTime-l)/1e3,e.endTime=(e.endTime-l)/1e3,e.duration/=1e3,e.selfTime/=1e3,!Number.isFinite(e.selfTime))throw new Error("Invalid task timing data");return c}static printTaskTreeToDebugString(e,t={}){const r=Math.max(...e.map((e=>e.endTime)),0),{printWidth:a=100,startTime:n=0,endTime:i=r,taskLabelFn:o=(e=>e.event.name)}=t;function computeTaskDepth(e){let t=0;for(;e.parent;e=e.parent)t++;return t}const s=(i-n)/a,c=new Map,l=new Map;for(const t of e){if(t.startTime>i||t.endTime<n)continue;const e=computeTaskDepth(t),r=l.get(e)||[];r.push(t),l.set(e,r);const a=String.fromCharCode(65+c.size%26);c.set(t,{id:a,task:t})}const u=[`Trace Duration: ${r.toFixed(0)}ms`,`Range: [${n}, ${i}]`,`█ = ${s.toFixed(2)}ms`,""],d=Array.from(l.entries()).sort(((e,t)=>e[0]-t[0]));for(const[,e]of d){const t=Array.from({length:a}).map((()=>" "));for(const r of e){const e=Math.max(r.startTime,n),a=Math.min(r.endTime,i),{id:o}=c.get(r)||{id:"?"
565
+ },l=Math.floor(e/s),u=Math.floor(a/s),d=Math.floor((l+u)/2);for(let e=l;e<=u;e++)t[e]="█";for(let e=0;e<o.length;e++)t[d]=o}u.push(t.join(""))}u.push("");for(const{id:e,task:t}of c.values())u.push(`${e} = ${o(t)}`);return u.join("\n")}}var Ev=MainThreadTasks$9;const xv=Ao,_v=Ev,Av=Yp;var Rv=xv(class MainThreadTasks$8{static async compute_(e,t){const{mainThreadEvents:r,frames:a,timestamps:n}=await Av.request(e,t);return _v.getMainThreadTasks(r,a,n.traceEnd,n.timeOrigin)}},null);const kv=Ki,Dv=new Set(["CpuProfiler::StartProfiling"]),Cv=new Set(["V8.GCCompactor","MajorGC","MinorGC"]);function getJavaScriptURLs$2(e){const t=new Set;for(const r of e)r.resourceType===kv.TYPES.Script&&t.add(r.url);return t}function getAttributableURLForTask$2(e,t){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0];let n=r||a;return n&&"about:blank"!==n||(n=Dv.has(e.event.name)?"Browser":Cv.has(e.event.name)?"Browser GC":"Unattributable"),n}var Iv={getJavaScriptURLs:getJavaScriptURLs$2,
566
566
  getAttributableURLForTask:getAttributableURLForTask$2,getExecutionTimingsByURL:function getExecutionTimingsByURL$2(e,t){const r=getJavaScriptURLs$2(t),a=new Map;for(const t of e){const e=getAttributableURLForTask$2(t,r),n=a.get(e)||{},i=n[t.group.id]||0;n[t.group.id]=i+t.selfTime,a.set(e,n)}return a}};const Nv=kc,{taskGroups:Lv}=wv,Mv=oi,Pv=Lo,Ov=Rv,{getExecutionTimingsByURL:Fv}=Iv,Uv={title:"JavaScript execution time",failureTitle:"Reduce JavaScript execution time",description:"Consider reducing the time spent parsing, compiling, and executing JS. You may find delivering smaller JS payloads helps with this. [Learn more](https://web.dev/bootup-time/).",columnTotal:"Total CPU Time",columnScriptEval:"Script Evaluation",columnScriptParse:"Script Parse",chromeExtensionsWarning:"Chrome extensions negatively affected this page's load performance. Try auditing the page in incognito mode or from a Chrome profile without extensions."
567
567
  },jv=Mv.createMessageInstanceIdFn("lighthouse-core/audits/bootup-time.js",Uv);class BootupTime extends Nv{static get meta(){return{id:"bootup-time",title:jv(Uv.title),failureTitle:jv(Uv.failureTitle),description:jv(Uv.description),scoreDisplayMode:Nv.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","devtoolsLogs"]}}static get defaultOptions(){return{p10:1282,median:3500,thresholdInMs:50}}static async audit(e,t){const r=t.settings||{},a=e.traces[BootupTime.DEFAULT_PASS],n=e.devtoolsLogs[BootupTime.DEFAULT_PASS],i=await Pv.request(n,t),o=await Ov.request(a,t),s="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,c=Fv(o,i);let l=!1,u=0;const d=Array.from(c).map((([e,r])=>{let a=0;for(const[e,t]of Object.entries(r))r[e]=t*s,a+=t*s;const n=r[Lv.scriptEvaluation.id]||0,i=r[Lv.scriptParseCompile.id]||0;return a>=t.options.thresholdInMs&&(u+=n+i),l=l||e.startsWith("chrome-extension:")&&n>100,{url:e,total:a,scripting:n,scriptParseCompile:i}
568
568
  })).filter((e=>e.total>=t.options.thresholdInMs)).sort(((e,t)=>t.total-e.total));let m;l&&(m=[jv(Uv.chromeExtensionsWarning)]);const p={wastedMs:u},h=[{key:"url",itemType:"url",text:jv(Mv.UIStrings.columnURL)},{key:"total",granularity:1,itemType:"ms",text:jv(Uv.columnTotal)},{key:"scripting",granularity:1,itemType:"ms",text:jv(Uv.columnScriptEval)},{key:"scriptParseCompile",granularity:1,itemType:"ms",text:jv(Uv.columnScriptParse)}],f=BootupTime.makeTableDetails(h,d,p);return{score:Nv.computeLogNormalScore({p10:t.options.p10,median:t.options.median},u),numericValue:u,numericUnit:"millisecond",displayValue:u>0?jv(Mv.UIStrings.seconds,{timeInMs:u}):"",details:f,runWarnings:m}}}yv.exports=BootupTime,yv.exports.UIStrings=Uv;var Bv={exports:{}};const $v=Zc,qv=Ki;class NetworkNode$1 extends $v{constructor(e){super(e.requestId),this._record=e}get type(){return $v.TYPES.NETWORK}get startTime(){return 1e3*this._record.startTime*1e3}get endTime(){return 1e3*this._record.endTime*1e3}get record(){
@@ -756,7 +756,7 @@ node:wT.makeNodeItem(e.node),url:o,totalBytes:c,wastedBytes:l,wastedPercent:100*
756
756
  ;const RT=kc,kT=fT.exports,DT=ji,CT=oi,IT={title:"Images were appropriate for their displayed size",failureTitle:"Images were larger than their displayed size",columnDisplayedDimensions:"Displayed dimensions",columnActualDimensions:"Actual dimensions"},NT=CT.createMessageInstanceIdFn("lighthouse-core/audits/byte-efficiency/uses-responsive-images-snapshot.js",IT);gT.exports=class UsesResponsiveImagesSnapshot extends RT{static get meta(){return{id:"uses-responsive-images-snapshot",title:NT(IT.title),failureTitle:NT(IT.failureTitle),description:kT.str_(kT.UIStrings.description),supportedModes:["snapshot"],requiredArtifacts:["ImageElements","ViewportDimensions"]}}static async audit(e){let t=1;const r=[];for(const a of e.ImageElements){if(!a.naturalDimensions)continue;const n=a.naturalDimensions,i=kT.getDisplayedDimensions({...a,naturalWidth:n.width,naturalHeight:n.height},e.ViewportDimensions),o=n.width*n.height,s=i.width*i.height;o<=s||(o-s>1365&&(t=0),r.push({
757
757
  node:RT.makeNodeItem(a.node),url:DT.elideDataURI(a.src),displayedDimensions:`${i.width}x${i.height}`,actualDimensions:`${n.width}x${n.height}`}))}const a=[{key:"node",itemType:"node",text:""},{key:"url",itemType:"url",text:NT(CT.UIStrings.columnURL)},{key:"displayedDimensions",itemType:"text",text:NT(IT.columnDisplayedDimensions)},{key:"actualDimensions",itemType:"text",text:NT(IT.columnActualDimensions)}];return{score:t,details:RT.makeTableDetails(a,r)}}},gT.exports.UIStrings=IT;var LT={exports:{}};const MT=Ib,PT=ji,OT=oi,FT={title:"Enable text compression",description:"Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more](https://web.dev/uses-text-compression/)."},UT=OT.createMessageInstanceIdFn("lighthouse-core/audits/byte-efficiency/uses-text-compression.js",FT);LT.exports=class ResponsesAreCompressed extends MT{static get meta(){return{id:"uses-text-compression",title:UT(FT.title),
758
758
  description:UT(FT.description),scoreDisplayMode:MT.SCORING_MODES.NUMERIC,requiredArtifacts:["ResponseCompression","GatherContext","devtoolsLogs","traces"]}}static audit_(e){const t=e.ResponseCompression,r=[];t.forEach((e=>{if(!e.gzipSize||e.gzipSize<0)return;const t=e.resourceSize,a=e.gzipSize,n=t-a;if(1-a/t<.1||n<1400||e.transferSize<a)return;const i=PT.elideDataURI(e.url);r.find((t=>t.url===i&&t.totalBytes===e.resourceSize))||r.push({url:i,totalBytes:t,wastedBytes:n})}));const a=[{key:"url",valueType:"url",label:UT(OT.UIStrings.columnURL)},{key:"totalBytes",valueType:"bytes",label:UT(OT.UIStrings.columnTransferSize)},{key:"wastedBytes",valueType:"bytes",label:UT(OT.UIStrings.columnWastedBytes)}];return{items:r,headings:a}}},LT.exports.UIStrings=FT;var jT={exports:{}};const BT=kc,$T={title:"Content is sized correctly for the viewport",failureTitle:"Content is not sized correctly for the viewport",
759
- description:"If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://web.dev/content-width/).",explanation:"The viewport size of {innerWidth}px does not match the window size of {outerWidth}px."},qT=oi.createMessageInstanceIdFn("lighthouse-core/audits/content-width.js",$T);jT.exports=class ContentWidth extends BT{static get meta(){return{id:"content-width",title:qT($T.title),failureTitle:qT($T.failureTitle),description:qT($T.description),requiredArtifacts:["ViewportDimensions"]}}static audit(e,t){const r=e.ViewportDimensions.innerWidth===e.ViewportDimensions.outerWidth;if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};let a;return r||(a=qT($T.explanation,{innerWidth:e.ViewportDimensions.innerWidth,outerWidth:e.ViewportDimensions.outerWidth})),{score:Number(r),explanation:a}}},jT.exports.UIStrings=$T;var zT={exports:{}};const VT=Ao,WT=Fo,GT=Lo;var HT=VT(class MainResource$g{
759
+ description:"If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://web.dev/content-width/).",explanation:"The viewport size of {innerWidth}px does not match the window size of {outerWidth}px."},qT=oi.createMessageInstanceIdFn("lighthouse-core/audits/content-width.js",$T);jT.exports=class ContentWidth extends BT{static get meta(){return{id:"content-width",title:qT($T.title),failureTitle:qT($T.failureTitle),description:qT($T.description),requiredArtifacts:["ViewportDimensions"]}}static audit(e,t){const r=e.ViewportDimensions.innerWidth===e.ViewportDimensions.outerWidth;if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};let a;return r||(a=qT($T.explanation,{innerWidth:e.ViewportDimensions.innerWidth,outerWidth:e.ViewportDimensions.outerWidth})),{score:Number(r),explanation:a}}},jT.exports.UIStrings=$T;var zT={exports:{}};const VT=Ao,WT=Fo,GT=Lo;var HT=VT(class MainResource$h{
760
760
  static async compute_(e,t){const r=e.URL.finalUrl,a=await GT.request(e.devtoolsLog,t),n=WT.findMainDocument(a,r);if(!n)throw new Error("Unable to identify the main resource");return n}},["URL","devtoolsLog"]);const YT=Ao,KT=Ki,JT=HT,XT=eb;class CriticalRequestChains$2{static isCritical(e,t){if(!t)throw new Error("mainResource not provided");if(e.requestId===t.requestId)return!0;if(e.isLinkPreload)return!1;for(;e.redirectDestination;)e=e.redirectDestination;const r=e.resourceType===KT.TYPES.Document&&e.frameId!==t.frameId;return!([KT.TYPES.Image,KT.TYPES.XHR,KT.TYPES.Fetch,KT.TYPES.EventSource].includes(e.resourceType||"Other")||r||e.mimeType&&e.mimeType.startsWith("image/"))&&(!!e.initiatorRequest&&["VeryHigh","High","Medium"].includes(e.priority))}static extractChainsFromGraph(e,t){const r={};const a=new Set;return t.traverse(((t,n)=>{if(a.add(t),"network"!==t.type)return;if(!CriticalRequestChains$2.isCritical(t.record,e))return
761
761
  ;const i=n.filter((e=>"network"===e.type)).reverse().map((e=>e.record));i.some((t=>!CriticalRequestChains$2.isCritical(t,e)))||function addChain(e){let t=r;for(const r of e)t[r.requestId]||(t[r.requestId]={request:r,children:{}}),t=t[r.requestId].children}(i)}),(function getNextNodes(e){return e.getDependents().filter((e=>e.getDependencies().every((e=>a.has(e)))))})),r}static async compute_(e,t){const r=await JT.request({URL:e.URL,devtoolsLog:e.devtoolsLog},t),a=await XT.request({trace:e.trace,devtoolsLog:e.devtoolsLog},t);return CriticalRequestChains$2.extractChainsFromGraph(r,a)}}var ZT=YT(CriticalRequestChains$2,["URL","devtoolsLog","trace"]);const QT=kc,eE=ZT,tE={title:"Avoid chaining critical requests",
762
762
  description:"The Critical Request Chains below show you what resources are loaded with a high priority. Consider reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load. [Learn more](https://web.dev/critical-request-chains/).",displayValue:"{itemCount, plural,\n =1 {1 chain found}\n other {# chains found}\n }"},rE=oi.createMessageInstanceIdFn("lighthouse-core/audits/critical-request-chains.js",tE);class CriticalRequestChains$1 extends QT{static get meta(){return{id:"critical-request-chains",title:rE(tE.title),description:rE(tE.description),scoreDisplayMode:QT.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL"]}}static _traverse(e,t){!function walk(e,r,a,n=0){const i=Object.keys(e);0!==i.length&&i.forEach((i=>{const o=e[i];a||(a=o.request.startTime),t({depth:r,id:i,node:o,chainDuration:1e3*(o.request.endTime-a),
@@ -766,22 +766,22 @@ return e instanceof Finding&&(e.type===this.type&&e.description===this.descripti
766
766
  e[e.NONCE_LENGTH=307]="NONCE_LENGTH",e[e.IP_SOURCE=308]="IP_SOURCE",e[e.DEPRECATED_DIRECTIVE=309]="DEPRECATED_DIRECTIVE",e[e.SRC_HTTP=310]="SRC_HTTP",e[e.STRICT_DYNAMIC=400]="STRICT_DYNAMIC",e[e.STRICT_DYNAMIC_NOT_STANDALONE=401]="STRICT_DYNAMIC_NOT_STANDALONE",e[e.NONCE_HASH=402]="NONCE_HASH",e[e.UNSAFE_INLINE_FALLBACK=403]="UNSAFE_INLINE_FALLBACK",e[e.ALLOWLIST_FALLBACK=404]="ALLOWLIST_FALLBACK",e[e.IGNORED=405]="IGNORED",e[e.REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS=500]="REQUIRE_TRUSTED_TYPES_FOR_SCRIPTS",e[e.REPORTING_DESTINATION_MISSING=600]="REPORTING_DESTINATION_MISSING",e[e.REPORT_TO_ONLY=601]="REPORT_TO_ONLY"}(e.Type||(e.Type={}))}(sE),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CspError=e.isHash=e.HASH_PATTERN=e.STRICT_HASH_PATTERN=e.isNonce=e.NONCE_PATTERN=e.STRICT_NONCE_PATTERN=e.isUrlScheme=e.isKeyword=e.isDirective=e.Version=e.FETCH_DIRECTIVES=e.Directive=e.TrustedTypesSink=e.Keyword=e.Csp=void 0;const t=sE;class Csp{constructor(){this.directives={}}clone(){
767
767
  const e=new Csp;for(const[t,r]of Object.entries(this.directives))r&&(e.directives[t]=[...r]);return e}convertToString(){let e="";for(const[t,r]of Object.entries(this.directives)){if(e+=t,void 0!==r)for(let t,a=0;t=r[a];a++)e+=" ",e+=t;e+="; "}return e}getEffectiveCsp(e,i){const o=i||[],s=this.clone(),c=s.getEffectiveDirective(a.SCRIPT_SRC),l=this.directives[c]||[],u=s.directives[c];if(u&&(s.policyHasScriptNonces()||s.policyHasScriptHashes()))if(e>=n.CSP2)l.includes(r.UNSAFE_INLINE)&&(arrayRemove(u,r.UNSAFE_INLINE),o.push(new t.Finding(t.Type.IGNORED,"unsafe-inline is ignored if a nonce or a hash is present. (CSP2 and above)",t.Severity.NONE,c,r.UNSAFE_INLINE)));else for(const e of l)(e.startsWith("'nonce-")||e.startsWith("'sha"))&&arrayRemove(u,e);if(u&&this.policyHasStrictDynamic())if(e>=n.CSP3)for(const e of l)e.startsWith("'")&&e!==r.SELF&&e!==r.UNSAFE_INLINE||(arrayRemove(u,e),
768
768
  o.push(new t.Finding(t.Type.IGNORED,"Because of strict-dynamic this entry is ignored in CSP3 and above",t.Severity.NONE,c,e)));else arrayRemove(u,r.STRICT_DYNAMIC);return e<n.CSP3&&(delete s.directives[a.REPORT_TO],delete s.directives[a.WORKER_SRC],delete s.directives[a.MANIFEST_SRC],delete s.directives[a.TRUSTED_TYPES],delete s.directives[a.REQUIRE_TRUSTED_TYPES_FOR]),s}getEffectiveDirective(t){return!(t in this.directives)&&e.FETCH_DIRECTIVES.includes(t)?a.DEFAULT_SRC:t}getEffectiveDirectives(e){return[...new Set(e.map((e=>this.getEffectiveDirective(e))))]}policyHasScriptNonces(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).some((e=>isNonce(e)))}policyHasScriptHashes(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).some((e=>isHash(e)))}policyHasStrictDynamic(){const e=this.getEffectiveDirective(a.SCRIPT_SRC);return(this.directives[e]||[]).includes(r.STRICT_DYNAMIC)}}var r,a,n;function isNonce(t,r){
769
- return(r?e.STRICT_NONCE_PATTERN:e.NONCE_PATTERN).test(t)}function isHash(t,r){return(r?e.STRICT_HASH_PATTERN:e.HASH_PATTERN).test(t)}e.Csp=Csp,function(e){e.SELF="'self'",e.NONE="'none'",e.UNSAFE_INLINE="'unsafe-inline'",e.UNSAFE_EVAL="'unsafe-eval'",e.WASM_EVAL="'wasm-eval'",e.WASM_UNSAFE_EVAL="'wasm-unsafe-eval'",e.STRICT_DYNAMIC="'strict-dynamic'",e.UNSAFE_HASHED_ATTRIBUTES="'unsafe-hashed-attributes'",e.UNSAFE_HASHES="'unsafe-hashes'",e.REPORT_SAMPLE="'report-sample'"}(r=e.Keyword||(e.Keyword={})),(e.TrustedTypesSink||(e.TrustedTypesSink={})).SCRIPT="'script'",function(e){e.CHILD_SRC="child-src",e.CONNECT_SRC="connect-src",e.DEFAULT_SRC="default-src",e.FONT_SRC="font-src",e.FRAME_SRC="frame-src",e.IMG_SRC="img-src",e.MEDIA_SRC="media-src",e.OBJECT_SRC="object-src",e.SCRIPT_SRC="script-src",e.SCRIPT_SRC_ATTR="script-src-attr",e.SCRIPT_SRC_ELEM="script-src-elem",e.STYLE_SRC="style-src",e.STYLE_SRC_ATTR="style-src-attr",e.STYLE_SRC_ELEM="style-src-elem",e.PREFETCH_SRC="prefetch-src",
770
- e.MANIFEST_SRC="manifest-src",e.WORKER_SRC="worker-src",e.BASE_URI="base-uri",e.PLUGIN_TYPES="plugin-types",e.SANDBOX="sandbox",e.DISOWN_OPENER="disown-opener",e.FORM_ACTION="form-action",e.FRAME_ANCESTORS="frame-ancestors",e.REPORT_TO="report-to",e.REPORT_URI="report-uri",e.BLOCK_ALL_MIXED_CONTENT="block-all-mixed-content",e.UPGRADE_INSECURE_REQUESTS="upgrade-insecure-requests",e.REFLECTED_XSS="reflected-xss",e.REFERRER="referrer",e.REQUIRE_SRI_FOR="require-sri-for",e.TRUSTED_TYPES="trusted-types",e.REQUIRE_TRUSTED_TYPES_FOR="require-trusted-types-for"}(a=e.Directive||(e.Directive={})),e.FETCH_DIRECTIVES=[a.CHILD_SRC,a.CONNECT_SRC,a.DEFAULT_SRC,a.FONT_SRC,a.FRAME_SRC,a.IMG_SRC,a.MANIFEST_SRC,a.MEDIA_SRC,a.OBJECT_SRC,a.SCRIPT_SRC,a.SCRIPT_SRC_ATTR,a.SCRIPT_SRC_ELEM,a.STYLE_SRC,a.STYLE_SRC_ATTR,a.STYLE_SRC_ELEM,a.WORKER_SRC],function(e){e[e.CSP1=1]="CSP1",e[e.CSP2=2]="CSP2",e[e.CSP3=3]="CSP3"}(n=e.Version||(e.Version={})),e.isDirective=function isDirective(e){
771
- return Object.values(a).includes(e)},e.isKeyword=function isKeyword(e){return Object.values(r).includes(e)},e.isUrlScheme=function isUrlScheme(e){return new RegExp("^[a-zA-Z][+a-zA-Z0-9.-]*:$").test(e)},e.STRICT_NONCE_PATTERN=new RegExp("^'nonce-[a-zA-Z0-9+/_-]+[=]{0,2}'$"),e.NONCE_PATTERN=new RegExp("^'nonce-(.+)'$"),e.isNonce=isNonce,e.STRICT_HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-[a-zA-Z0-9+/]+[=]{0,2}'$"),e.HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-(.+)'$"),e.isHash=isHash;class CspError extends Error{constructor(e){super(e)}}function arrayRemove(e,t){if(e.includes(t)){const r=e.findIndex((e=>t===e));e.splice(r,1)}}e.CspError=CspError}(oE);var cE=globalThis&&globalThis.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),lE=globalThis&&globalThis.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{
772
- enumerable:!0,value:t})}:function(e,t){e.default=t}),uE=globalThis&&globalThis.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&cE(t,e,r);return lE(t,e),t};Object.defineProperty(iE,"__esModule",{value:!0}),iE.checkInvalidKeyword=iE.checkMissingSemicolon=iE.checkUnknownDirective=void 0;const dE=uE(oE),mE=oE,pE=sE;iE.checkUnknownDirective=function checkUnknownDirective(e){const t=[];for(const r of Object.keys(e.directives))dE.isDirective(r)||(r.endsWith(":")?t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,"CSP directives don't end with a colon.",pE.Severity.SYNTAX,r)):t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,'Directive "'+r+'" is not a known CSP directive.',pE.Severity.SYNTAX,r)));return t},iE.checkMissingSemicolon=function checkMissingSemicolon(e){const t=[]
769
+ return(r?e.STRICT_NONCE_PATTERN:e.NONCE_PATTERN).test(t)}function isHash(t,r){return(r?e.STRICT_HASH_PATTERN:e.HASH_PATTERN).test(t)}e.Csp=Csp,function(e){e.SELF="'self'",e.NONE="'none'",e.UNSAFE_INLINE="'unsafe-inline'",e.UNSAFE_EVAL="'unsafe-eval'",e.WASM_EVAL="'wasm-eval'",e.WASM_UNSAFE_EVAL="'wasm-unsafe-eval'",e.STRICT_DYNAMIC="'strict-dynamic'",e.UNSAFE_HASHED_ATTRIBUTES="'unsafe-hashed-attributes'",e.UNSAFE_HASHES="'unsafe-hashes'",e.REPORT_SAMPLE="'report-sample'",e.BLOCK="'block'",e.ALLOW="'allow'"}(r=e.Keyword||(e.Keyword={})),(e.TrustedTypesSink||(e.TrustedTypesSink={})).SCRIPT="'script'",function(e){e.CHILD_SRC="child-src",e.CONNECT_SRC="connect-src",e.DEFAULT_SRC="default-src",e.FONT_SRC="font-src",e.FRAME_SRC="frame-src",e.IMG_SRC="img-src",e.MEDIA_SRC="media-src",e.OBJECT_SRC="object-src",e.SCRIPT_SRC="script-src",e.SCRIPT_SRC_ATTR="script-src-attr",e.SCRIPT_SRC_ELEM="script-src-elem",e.STYLE_SRC="style-src",e.STYLE_SRC_ATTR="style-src-attr",
770
+ e.STYLE_SRC_ELEM="style-src-elem",e.PREFETCH_SRC="prefetch-src",e.MANIFEST_SRC="manifest-src",e.WORKER_SRC="worker-src",e.BASE_URI="base-uri",e.PLUGIN_TYPES="plugin-types",e.SANDBOX="sandbox",e.DISOWN_OPENER="disown-opener",e.FORM_ACTION="form-action",e.FRAME_ANCESTORS="frame-ancestors",e.NAVIGATE_TO="navigate-to",e.REPORT_TO="report-to",e.REPORT_URI="report-uri",e.BLOCK_ALL_MIXED_CONTENT="block-all-mixed-content",e.UPGRADE_INSECURE_REQUESTS="upgrade-insecure-requests",e.REFLECTED_XSS="reflected-xss",e.REFERRER="referrer",e.REQUIRE_SRI_FOR="require-sri-for",e.TRUSTED_TYPES="trusted-types",e.REQUIRE_TRUSTED_TYPES_FOR="require-trusted-types-for",e.WEBRTC="webrtc"}(a=e.Directive||(e.Directive={})),e.FETCH_DIRECTIVES=[a.CHILD_SRC,a.CONNECT_SRC,a.DEFAULT_SRC,a.FONT_SRC,a.FRAME_SRC,a.IMG_SRC,a.MANIFEST_SRC,a.MEDIA_SRC,a.OBJECT_SRC,a.SCRIPT_SRC,a.SCRIPT_SRC_ATTR,a.SCRIPT_SRC_ELEM,a.STYLE_SRC,a.STYLE_SRC_ATTR,a.STYLE_SRC_ELEM,a.WORKER_SRC],function(e){e[e.CSP1=1]="CSP1",e[e.CSP2=2]="CSP2",
771
+ e[e.CSP3=3]="CSP3"}(n=e.Version||(e.Version={})),e.isDirective=function isDirective(e){return Object.values(a).includes(e)},e.isKeyword=function isKeyword(e){return Object.values(r).includes(e)},e.isUrlScheme=function isUrlScheme(e){return new RegExp("^[a-zA-Z][+a-zA-Z0-9.-]*:$").test(e)},e.STRICT_NONCE_PATTERN=new RegExp("^'nonce-[a-zA-Z0-9+/_-]+[=]{0,2}'$"),e.NONCE_PATTERN=new RegExp("^'nonce-(.+)'$"),e.isNonce=isNonce,e.STRICT_HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-[a-zA-Z0-9+/]+[=]{0,2}'$"),e.HASH_PATTERN=new RegExp("^'(sha256|sha384|sha512)-(.+)'$"),e.isHash=isHash;class CspError extends Error{constructor(e){super(e)}}function arrayRemove(e,t){if(e.includes(t)){const r=e.findIndex((e=>t===e));e.splice(r,1)}}e.CspError=CspError}(oE);var cE=globalThis&&globalThis.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]
772
+ }),lE=globalThis&&globalThis.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),uE=globalThis&&globalThis.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&cE(t,e,r);return lE(t,e),t};Object.defineProperty(iE,"__esModule",{value:!0}),iE.checkInvalidKeyword=iE.checkMissingSemicolon=iE.checkUnknownDirective=void 0;const dE=uE(oE),mE=oE,pE=sE;iE.checkUnknownDirective=function checkUnknownDirective(e){const t=[];for(const r of Object.keys(e.directives))dE.isDirective(r)||(r.endsWith(":")?t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,"CSP directives don't end with a colon.",pE.Severity.SYNTAX,r)):t.push(new pE.Finding(pE.Type.UNKNOWN_DIRECTIVE,'Directive "'+r+'" is not a known CSP directive.',pE.Severity.SYNTAX,r)));return t},iE.checkMissingSemicolon=function checkMissingSemicolon(e){const t=[]
773
773
  ;for(const[r,a]of Object.entries(e.directives))if(void 0!==a)for(const e of a)dE.isDirective(e)&&t.push(new pE.Finding(pE.Type.MISSING_SEMICOLON,'Did you forget the semicolon? "'+e+'" seems to be a directive, not a value.',pE.Severity.SYNTAX,r,e));return t},iE.checkInvalidKeyword=function checkInvalidKeyword(e){const t=[],r=Object.values(mE.Keyword).map((e=>e.replace(/'/g,"")));for(const[a,n]of Object.entries(e.directives))if(void 0!==n)for(const e of n)if(r.some((t=>t===e))||e.startsWith("nonce-")||e.match(/^(sha256|sha384|sha512)-/))t.push(new pE.Finding(pE.Type.INVALID_KEYWORD,'Did you forget to surround "'+e+'" with single-ticks?',pE.Severity.SYNTAX,a,e));else if(e.startsWith("'")){if(a===dE.Directive.REQUIRE_TRUSTED_TYPES_FOR){if(e===dE.TrustedTypesSink.SCRIPT)continue}else if(a===dE.Directive.TRUSTED_TYPES){if("'allow-duplicates'"===e||"'none'"===e)continue}else if(dE.isKeyword(e)||dE.isHash(e)||dE.isNonce(e))continue
774
774
  ;t.push(new pE.Finding(pE.Type.INVALID_KEYWORD,e+" seems to be an invalid CSP keyword.",pE.Severity.SYNTAX,a,e))}return t};var hE={},gE={};Object.defineProperty(gE,"__esModule",{value:!0}),gE.URLS=void 0,
775
775
  gE.URLS=["//gstatic.com/fsn/angular_js-bundle1.js","//www.gstatic.com/fsn/angular_js-bundle1.js","//www.googleadservices.com/pageadimg/imgad","//yandex.st/angularjs/1.2.16/angular-cookies.min.js","//yastatic.net/angularjs/1.2.23/angular.min.js","//yuedust.yuedu.126.net/js/components/angular/angular.js","//art.jobs.netease.com/script/angular.js","//csu-c45.kxcdn.com/angular/angular.js","//elysiumwebsite.s3.amazonaws.com/uploads/blog-media/rockstar/angular.min.js","//inno.blob.core.windows.net/new/libs/AngularJS/1.2.1/angular.min.js","//gift-talk.kakao.com/public/javascripts/angular.min.js","//ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular-route.min.js","//master-sumok.ru/vendors/angular/angular-cookies.js","//ayicommon-a.akamaihd.net/static/vendor/angular-1.4.2.min.js","//pangxiehaitao.com/framework/angular-1.3.9/angular-animate.min.js","//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.16/angular.min.js","//96fe3ee995e96e922b6b-d10c35bd0a0de2c718b252bc575fdb73.ssl.cf1.rackcdn.com/angular.js","//oss.maxcdn.com/angularjs/1.2.20/angular.min.js","//reports.zemanta.com/smedia/common/angularjs/1.2.11/angular.js","//cdn.shopify.com/s/files/1/0225/6463/t/1/assets/angular-animate.min.js","//parademanagement.com.s3-website-ap-southeast-1.amazonaws.com/js/angular.min.js","//cdn.jsdelivr.net/angularjs/1.1.2/angular.min.js","//eb2883ede55c53e09fd5-9c145fb03d93709ea57875d307e2d82e.ssl.cf3.rackcdn.com/components/angular-resource.min.js","//andors-trail.googlecode.com/git/AndorsTrailEdit/lib/angular.min.js","//cdn.walkme.com/General/EnvironmentTests/angular/angular.min.js","//laundrymail.com/angular/angular.js","//s3-eu-west-1.amazonaws.com/staticancpa/js/angular-cookies.min.js","//collade.demo.stswp.com/js/vendor/angular.min.js","//mrfishie.github.io/sailor/bower_components/angular/angular.min.js","//askgithub.com/static/js/angular.min.js","//services.amazon.com/solution-providers/assets/vendor/angular-cookies.min.js","//raw.githubusercontent.com/angular/code.angularjs.org/master/1.0.7/angular-resource.js","//prb-resume.appspot.com/bower_components/angular-animate/angular-animate.js","//dl.dropboxusercontent.com/u/30877786/angular.min.js","//static.tumblr.com/x5qdx0r/nPOnngtff/angular-resource.min_1_.js","//storage.googleapis.com/assets-prod.urbansitter.net/us-sym/assets/vendor/angular-sanitize/angular-sanitize.min.js","//twitter.github.io/labella.js/bower_components/angular/angular.min.js","//cdn2-casinoroom.global.ssl.fastly.net/js/lib/angular-animate.min.js","//www.adobe.com/devnet-apps/flashshowcase/lib/angular/angular.1.1.5.min.js","//eternal-sunset.herokuapp.com/bower_components/angular/angular.js","//cdn.bootcss.com/angular.js/1.2.0/angular.min.js"]
776
776
  ;var fE={};Object.defineProperty(fE,"__esModule",{value:!0}),fE.URLS=void 0,fE.URLS=["//vk.com/swf/video.swf","//ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf"];var yE={};Object.defineProperty(yE,"__esModule",{value:!0}),yE.URLS=yE.NEEDS_EVAL=void 0,yE.NEEDS_EVAL=["googletagmanager.com","www.googletagmanager.com","www.googleadservices.com","google-analytics.com","ssl.google-analytics.com","www.google-analytics.com"],
777
- yE.URLS=["//bebezoo.1688.com/fragment/index.htm","//www.google-analytics.com/gtm/js","//googleads.g.doubleclick.net/pagead/conversion/1036918760/wcm","//www.googleadservices.com/pagead/conversion/1070110417/wcm","//www.google.com/tools/feedback/escalation-options","//pin.aliyun.com/check_audio","//offer.alibaba.com/market/CID100002954/5/fetchKeyword.do","//ccrprod.alipay.com/ccr/arriveTime.json","//group.aliexpress.com/ajaxAcquireGroupbuyProduct.do","//detector.alicdn.com/2.7.3/index.php","//suggest.taobao.com/sug","//translate.google.com/translate_a/l","//count.tbcdn.cn//counter3","//wb.amap.com/channel.php","//translate.googleapis.com/translate_a/l","//afpeng.alimama.com/ex","//accounts.google.com/o/oauth2/revoke","//pagead2.googlesyndication.com/relatedsearch","//yandex.ru/soft/browsers/check","//api.facebook.com/restserver.php","//mts0.googleapis.com/maps/vt","//syndication.twitter.com/widgets/timelines/765840589183213568","//www.youtube.com/profile_style","//googletagmanager.com/gtm/js","//mc.yandex.ru/watch/24306916/1","//share.yandex.net/counter/gpp/","//ok.go.mail.ru/lady_on_lady_recipes_r.json","//d1f69o4buvlrj5.cloudfront.net/__efa_15_1_ornpba.xekq.arg/optout_check","//www.googletagmanager.com/gtm/js","//api.vk.com/method/wall.get","//www.sharethis.com/get-publisher-info.php","//google.ru/maps/vt","//pro.netrox.sc/oapi/h_checksite.ashx","//vimeo.com/api/oembed.json/","//de.blog.newrelic.com/wp-admin/admin-ajax.php","//ajax.googleapis.com/ajax/services/search/news","//ssl.google-analytics.com/gtm/js","//pubsub.pubnub.com/subscribe/demo/hello_world/","//pass.yandex.ua/services","//id.rambler.ru/script/topline_info.js","//m.addthis.com/live/red_lojson/100eng.json","//passport.ngs.ru/ajax/check","//catalog.api.2gis.ru/ads/search","//gum.criteo.com/sync","//maps.google.com/maps/vt","//ynuf.alipay.com/service/um.json","//securepubads.g.doubleclick.net/gampad/ads","//c.tiles.mapbox.com/v3/texastribune.tx-congress-cvap/6/15/26.grid.json","//rexchange.begun.ru/banners","//an.yandex.ru/page/147484","//links.services.disqus.com/api/ping","//api.map.baidu.com/","//tj.gongchang.com/api/keywordrecomm/","//data.gongchang.com/livegrail/","//ulogin.ru/token.php","//beta.gismeteo.ru/api/informer/layout.js/120x240-3/ru/","//maps.googleapis.com/maps/api/js/GeoPhotoService.GetMetadata","//a.config.skype.com/config/v1/Skype/908_1.33.0.111/SkypePersonalization","//maps.beeline.ru/w","//target.ukr.net/","//www.meteoprog.ua/data/weather/informer/Poltava.js","//cdn.syndication.twimg.com/widgets/timelines/599200054310604802","//wslocker.ru/client/user.chk.php","//community.adobe.com/CommunityPod/getJSON","//maps.google.lv/maps/vt","//dev.virtualearth.net/REST/V1/Imagery/Metadata/AerialWithLabels/26.318581","//awaps.yandex.ru/10/8938/02400400.","//a248.e.akamai.net/h5.hulu.com/h5.mp4","//nominatim.openstreetmap.org/","//plugins.mozilla.org/en-us/plugins_list.json","//h.cackle.me/widget/32153/bootstrap","//graph.facebook.com/1/","//fellowes.ugc.bazaarvoice.com/data/reviews.json","//widgets.pinterest.com/v3/pidgets/boards/ciciwin/hedgehog-squirrel-crafts/pins/","//appcenter.intuit.com/Account/LogoutJSONP","//www.linkedin.com/countserv/count/share","//se.wikipedia.org/w/api.php","//cse.google.com/api/007627024705277327428/cse/r3vs7b0fcli/queries/js","//relap.io/api/v2/similar_pages_jsonp.js","//c1n3.hypercomments.com/stream/subscribe","//maps.google.de/maps/vt","//books.google.com/books","//connect.mail.ru/share_count","//tr.indeed.com/m/newjobs","//www-onepick-opensocial.googleusercontent.com/gadgets/proxy","//www.panoramio.com/map/get_panoramas.php","//client.siteheart.com/streamcli/client","//www.facebook.com/restserver.php","//autocomplete.travelpayouts.com/avia","//www.googleapis.com/freebase/v1/topic/m/0344_","//mts1.googleapis.com/mapslt/ft","//api.twitter.com/1/statuses/oembed.json","//fast.wistia.com/embed/medias/o75jtw7654.json","//partner.googleadservices.com/gampad/ads","//pass.yandex.ru/services","//gupiao.baidu.com/stocks/stockbets","//widget.admitad.com/widget/init","//api.instagram.com/v1/tags/partykungen23328/media/recent","//video.media.yql.yahoo.com/v1/video/sapi/streams/063fb76c-6c70-38c5-9bbc-04b7c384de2b","//ib.adnxs.com/jpt","//pass.yandex.com/services","//www.google.de/maps/vt","//clients1.google.com/complete/search","//api.userlike.com/api/chat/slot/proactive/","//www.youku.com/index_cookielist/s/jsonp","//mt1.googleapis.com/mapslt/ft","//api.mixpanel.com/track/","//wpd.b.qq.com/cgi/get_sign.php","//pipes.yahooapis.com/pipes/pipe.run","//gdata.youtube.com/feeds/api/videos/WsJIHN1kNWc","//9.chart.apis.google.com/chart","//cdn.syndication.twitter.com/moments/709229296800440320","//api.flickr.com/services/feeds/photos_friends.gne","//cbks0.googleapis.com/cbk","//www.blogger.com/feeds/5578653387562324002/posts/summary/4427562025302749269","//query.yahooapis.com/v1/public/yql","//kecngantang.blogspot.com/feeds/posts/default/-/Komik","//www.travelpayouts.com/widgets/50f53ce9ada1b54bcc000031.json","//i.cackle.me/widget/32586/bootstrap","//translate.yandex.net/api/v1.5/tr.json/detect","//a.tiles.mapbox.com/v3/zentralmedia.map-n2raeauc.jsonp","//maps.google.ru/maps/vt","//c1n2.hypercomments.com/stream/subscribe","//rec.ydf.yandex.ru/cookie","//cdn.jsdelivr.net"]
778
- ;var vE={};function getSchemeFreeUrl(e){return e=(e=e.replace(/^\w[+\w.-]*:\/\//i,"")).replace(/^\/\//,"")}function setScheme(e){return e.startsWith("//")?e.replace("//","https://"):e}Object.defineProperty(vE,"__esModule",{value:!0}),vE.applyCheckFunktionToDirectives=vE.matchWildcardUrls=vE.getHostname=vE.getSchemeFreeUrl=void 0,vE.getSchemeFreeUrl=getSchemeFreeUrl,vE.getHostname=function getHostname(e){const t=new URL("https://"+getSchemeFreeUrl(e).replace("*","wildcard_placeholder")).hostname.replace("wildcard_placeholder","*"),r=/^\[[\d:]+\]/;return getSchemeFreeUrl(e).match(r)&&!t.match(r)?"["+t+"]":t},vE.matchWildcardUrls=function matchWildcardUrls(e,t){const r=new URL(setScheme(e.replace("*","wildcard_placeholder"))),a=t.map((e=>new URL(setScheme(e)))),n=r.hostname.toLowerCase(),i=n.startsWith("wildcard_placeholder."),o=n.replace(/^\wildcard_placeholder/i,""),s=r.pathname,c="/"!==s;for(const e of a){const t=e.hostname;if(t.endsWith(o)&&(i||n===t)){if(c)if(s.endsWith("/")){
779
- if(!e.pathname.startsWith(s))continue}else if(e.pathname!==s)continue;return e}}return null},vE.applyCheckFunktionToDirectives=function applyCheckFunktionToDirectives(e,t){const r=Object.keys(e.directives);for(const a of r){const r=e.directives[a];r&&t(a,r)}},function(e){var t=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var a={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(a,e,n);return r(a,e),a};Object.defineProperty(e,"__esModule",{value:!0}),
777
+ yE.URLS=["//bebezoo.1688.com/fragment/index.htm","//www.google-analytics.com/gtm/js","//googleads.g.doubleclick.net/pagead/conversion/1036918760/wcm","//www.googleadservices.com/pagead/conversion/1070110417/wcm","//www.google.com/tools/feedback/escalation-options","//pin.aliyun.com/check_audio","//offer.alibaba.com/market/CID100002954/5/fetchKeyword.do","//ccrprod.alipay.com/ccr/arriveTime.json","//group.aliexpress.com/ajaxAcquireGroupbuyProduct.do","//detector.alicdn.com/2.7.3/index.php","//suggest.taobao.com/sug","//translate.google.com/translate_a/l","//count.tbcdn.cn//counter3","//wb.amap.com/channel.php","//translate.googleapis.com/translate_a/l","//afpeng.alimama.com/ex","//accounts.google.com/o/oauth2/revoke","//pagead2.googlesyndication.com/relatedsearch","//yandex.ru/soft/browsers/check","//api.facebook.com/restserver.php","//mts0.googleapis.com/maps/vt","//syndication.twitter.com/widgets/timelines/765840589183213568","//www.youtube.com/profile_style","//googletagmanager.com/gtm/js","//mc.yandex.ru/watch/24306916/1","//share.yandex.net/counter/gpp/","//ok.go.mail.ru/lady_on_lady_recipes_r.json","//d1f69o4buvlrj5.cloudfront.net/__efa_15_1_ornpba.xekq.arg/optout_check","//www.googletagmanager.com/gtm/js","//api.vk.com/method/wall.get","//www.sharethis.com/get-publisher-info.php","//google.ru/maps/vt","//pro.netrox.sc/oapi/h_checksite.ashx","//vimeo.com/api/oembed.json/","//de.blog.newrelic.com/wp-admin/admin-ajax.php","//ajax.googleapis.com/ajax/services/search/news","//ssl.google-analytics.com/gtm/js","//pubsub.pubnub.com/subscribe/demo/hello_world/","//pass.yandex.ua/services","//id.rambler.ru/script/topline_info.js","//m.addthis.com/live/red_lojson/100eng.json","//passport.ngs.ru/ajax/check","//catalog.api.2gis.ru/ads/search","//gum.criteo.com/sync","//maps.google.com/maps/vt","//ynuf.alipay.com/service/um.json","//securepubads.g.doubleclick.net/gampad/ads","//c.tiles.mapbox.com/v3/texastribune.tx-congress-cvap/6/15/26.grid.json","//rexchange.begun.ru/banners","//an.yandex.ru/page/147484","//links.services.disqus.com/api/ping","//api.map.baidu.com/","//tj.gongchang.com/api/keywordrecomm/","//data.gongchang.com/livegrail/","//ulogin.ru/token.php","//beta.gismeteo.ru/api/informer/layout.js/120x240-3/ru/","//maps.googleapis.com/maps/api/js/GeoPhotoService.GetMetadata","//a.config.skype.com/config/v1/Skype/908_1.33.0.111/SkypePersonalization","//maps.beeline.ru/w","//target.ukr.net/","//www.meteoprog.ua/data/weather/informer/Poltava.js","//cdn.syndication.twimg.com/widgets/timelines/599200054310604802","//wslocker.ru/client/user.chk.php","//community.adobe.com/CommunityPod/getJSON","//maps.google.lv/maps/vt","//dev.virtualearth.net/REST/V1/Imagery/Metadata/AerialWithLabels/26.318581","//awaps.yandex.ru/10/8938/02400400.","//a248.e.akamai.net/h5.hulu.com/h5.mp4","//nominatim.openstreetmap.org/","//plugins.mozilla.org/en-us/plugins_list.json","//h.cackle.me/widget/32153/bootstrap","//graph.facebook.com/1/","//fellowes.ugc.bazaarvoice.com/data/reviews.json","//widgets.pinterest.com/v3/pidgets/boards/ciciwin/hedgehog-squirrel-crafts/pins/","//www.linkedin.com/countserv/count/share","//se.wikipedia.org/w/api.php","//cse.google.com/api/007627024705277327428/cse/r3vs7b0fcli/queries/js","//relap.io/api/v2/similar_pages_jsonp.js","//c1n3.hypercomments.com/stream/subscribe","//maps.google.de/maps/vt","//books.google.com/books","//connect.mail.ru/share_count","//tr.indeed.com/m/newjobs","//www-onepick-opensocial.googleusercontent.com/gadgets/proxy","//www.panoramio.com/map/get_panoramas.php","//client.siteheart.com/streamcli/client","//www.facebook.com/restserver.php","//autocomplete.travelpayouts.com/avia","//www.googleapis.com/freebase/v1/topic/m/0344_","//mts1.googleapis.com/mapslt/ft","//api.twitter.com/1/statuses/oembed.json","//fast.wistia.com/embed/medias/o75jtw7654.json","//partner.googleadservices.com/gampad/ads","//pass.yandex.ru/services","//gupiao.baidu.com/stocks/stockbets","//widget.admitad.com/widget/init","//api.instagram.com/v1/tags/partykungen23328/media/recent","//video.media.yql.yahoo.com/v1/video/sapi/streams/063fb76c-6c70-38c5-9bbc-04b7c384de2b","//ib.adnxs.com/jpt","//pass.yandex.com/services","//www.google.de/maps/vt","//clients1.google.com/complete/search","//api.userlike.com/api/chat/slot/proactive/","//www.youku.com/index_cookielist/s/jsonp","//mt1.googleapis.com/mapslt/ft","//api.mixpanel.com/track/","//wpd.b.qq.com/cgi/get_sign.php","//pipes.yahooapis.com/pipes/pipe.run","//gdata.youtube.com/feeds/api/videos/WsJIHN1kNWc","//9.chart.apis.google.com/chart","//cdn.syndication.twitter.com/moments/709229296800440320","//api.flickr.com/services/feeds/photos_friends.gne","//cbks0.googleapis.com/cbk","//www.blogger.com/feeds/5578653387562324002/posts/summary/4427562025302749269","//query.yahooapis.com/v1/public/yql","//kecngantang.blogspot.com/feeds/posts/default/-/Komik","//www.travelpayouts.com/widgets/50f53ce9ada1b54bcc000031.json","//i.cackle.me/widget/32586/bootstrap","//translate.yandex.net/api/v1.5/tr.json/detect","//a.tiles.mapbox.com/v3/zentralmedia.map-n2raeauc.jsonp","//maps.google.ru/maps/vt","//c1n2.hypercomments.com/stream/subscribe","//rec.ydf.yandex.ru/cookie","//cdn.jsdelivr.net"]
778
+ ;var vE={};function getSchemeFreeUrl(e){return e=(e=e.replace(/^\w[+\w.-]*:\/\//i,"")).replace(/^\/\//,"")}function setScheme(e){return e.startsWith("//")?e.replace("//","https://"):e}Object.defineProperty(vE,"__esModule",{value:!0}),vE.applyCheckFunktionToDirectives=vE.matchWildcardUrls=vE.getHostname=vE.getSchemeFreeUrl=void 0,vE.getSchemeFreeUrl=getSchemeFreeUrl,vE.getHostname=function getHostname(e){const t=new URL("https://"+getSchemeFreeUrl(e).replace(":*","").replace("*","wildcard_placeholder")).hostname.replace("wildcard_placeholder","*"),r=/^\[[\d:]+\]/;return getSchemeFreeUrl(e).match(r)&&!t.match(r)?"["+t+"]":t},vE.matchWildcardUrls=function matchWildcardUrls(e,t){const r=new URL(setScheme(e.replace(":*","").replace("*","wildcard_placeholder"))),a=t.map((e=>new URL(setScheme(e)))),n=r.hostname.toLowerCase(),i=n.startsWith("wildcard_placeholder."),o=n.replace(/^\wildcard_placeholder/i,""),s=r.pathname,c="/"!==s;for(const e of a){const t=e.hostname
779
+ ;if(t.endsWith(o)&&(i||n===t)){if(c)if(s.endsWith("/")){if(!e.pathname.startsWith(s))continue}else if(e.pathname!==s)continue;return e}}return null},vE.applyCheckFunktionToDirectives=function applyCheckFunktionToDirectives(e,t){const r=Object.keys(e.directives);for(const a of r){const r=e.directives[a];r&&t(a,r)}},function(e){var t=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var a={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(a,e,n);return r(a,e),a};Object.defineProperty(e,"__esModule",{value:!0}),
780
780
  e.checkHasConfiguredReporting=e.checkSrcHttp=e.checkNonceLength=e.checkDeprecatedDirective=e.checkIpSource=e.looksLikeIpAddress=e.checkFlashObjectAllowlistBypass=e.checkScriptAllowlistBypass=e.checkMissingDirectives=e.checkMultipleMissingBaseUriDirective=e.checkMissingBaseUriDirective=e.checkMissingScriptSrcDirective=e.checkMissingObjectSrcDirective=e.checkWildcards=e.checkPlainUrlSchemes=e.checkScriptUnsafeEval=e.checkScriptUnsafeInline=e.URL_SCHEMES_CAUSING_XSS=e.DIRECTIVES_CAUSING_XSS=void 0;const n=a(gE),i=a(fE),o=a(yE),s=a(oE),c=oE,l=sE,u=a(vE);function checkMissingObjectSrcDirective(e){let t=[];return c.Directive.OBJECT_SRC in e.directives?t=e.directives[c.Directive.OBJECT_SRC]:c.Directive.DEFAULT_SRC in e.directives&&(t=e.directives[c.Directive.DEFAULT_SRC]),void 0!==t&&t.length>=1?[]:[new l.Finding(l.Type.MISSING_DIRECTIVES,"Missing object-src allows the injection of plugins which can execute JavaScript. Can you set it to 'none'?",l.Severity.HIGH,c.Directive.OBJECT_SRC)]}
781
781
  function checkMissingScriptSrcDirective(e){return c.Directive.SCRIPT_SRC in e.directives||c.Directive.DEFAULT_SRC in e.directives?[]:[new l.Finding(l.Type.MISSING_DIRECTIVES,"script-src directive is missing.",l.Severity.HIGH,c.Directive.SCRIPT_SRC)]}function checkMissingBaseUriDirective(e){return checkMultipleMissingBaseUriDirective([e])}function checkMultipleMissingBaseUriDirective(e){if(e.some((e=>e.policyHasScriptNonces()||e.policyHasScriptHashes()&&e.policyHasStrictDynamic()))&&!e.some((e=>c.Directive.BASE_URI in e.directives))){const e="Missing base-uri allows the injection of base tags. They can be used to set the base URL for all relative (script) URLs to an attacker controlled domain. Can you set it to 'none' or 'self'?";return[new l.Finding(l.Type.MISSING_DIRECTIVES,e,l.Severity.HIGH,c.Directive.BASE_URI)]}return[]}function looksLikeIpAddress(e){return!(!e.startsWith("[")||!e.endsWith("]"))||!!/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/.test(e)}
782
782
  e.DIRECTIVES_CAUSING_XSS=[c.Directive.SCRIPT_SRC,c.Directive.OBJECT_SRC,c.Directive.BASE_URI],e.URL_SCHEMES_CAUSING_XSS=["data:","http:","https:"],e.checkScriptUnsafeInline=function checkScriptUnsafeInline(e){const t=e.getEffectiveDirective(c.Directive.SCRIPT_SRC);return(e.directives[t]||[]).includes(c.Keyword.UNSAFE_INLINE)?[new l.Finding(l.Type.SCRIPT_UNSAFE_INLINE,"'unsafe-inline' allows the execution of unsafe in-page scripts and event handlers.",l.Severity.HIGH,t,c.Keyword.UNSAFE_INLINE)]:[]},e.checkScriptUnsafeEval=function checkScriptUnsafeEval(e){const t=e.getEffectiveDirective(c.Directive.SCRIPT_SRC);return(e.directives[t]||[]).includes(c.Keyword.UNSAFE_EVAL)?[new l.Finding(l.Type.SCRIPT_UNSAFE_EVAL,"'unsafe-eval' allows the execution of code injected into DOM APIs such as eval().",l.Severity.MEDIUM_MAYBE,t,c.Keyword.UNSAFE_EVAL)]:[]},e.checkPlainUrlSchemes=function checkPlainUrlSchemes(t){const r=[],a=t.getEffectiveDirectives(e.DIRECTIVES_CAUSING_XSS);for(const n of a){
783
783
  const a=t.directives[n]||[];for(const t of a)e.URL_SCHEMES_CAUSING_XSS.includes(t)&&r.push(new l.Finding(l.Type.PLAIN_URL_SCHEMES,t+" URI in "+n+" allows the execution of unsafe scripts.",l.Severity.HIGH,n,t))}return r},e.checkWildcards=function checkWildcards(t){const r=[],a=t.getEffectiveDirectives(e.DIRECTIVES_CAUSING_XSS);for(const e of a){const a=t.directives[e]||[];for(const t of a){"*"!==u.getSchemeFreeUrl(t)||r.push(new l.Finding(l.Type.PLAIN_WILDCARD,e+" should not allow '*' as source",l.Severity.HIGH,e,t))}}return r},e.checkMissingObjectSrcDirective=checkMissingObjectSrcDirective,e.checkMissingScriptSrcDirective=checkMissingScriptSrcDirective,e.checkMissingBaseUriDirective=checkMissingBaseUriDirective,e.checkMultipleMissingBaseUriDirective=checkMultipleMissingBaseUriDirective,e.checkMissingDirectives=function checkMissingDirectives(e){return[...checkMissingObjectSrcDirective(e),...checkMissingScriptSrcDirective(e),...checkMissingBaseUriDirective(e)]},
784
- e.checkScriptAllowlistBypass=function checkScriptAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.SCRIPT_SRC),a=e.directives[r]||[];if(a.includes(c.Keyword.NONE))return t;for(const e of a){if(e===c.Keyword.SELF){t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"'self' can be problematic if you host JSONP, Angular or user uploaded files.",l.Severity.MEDIUM_MAYBE,r,e));continue}if(e.startsWith("'"))continue;if(s.isUrlScheme(e)||-1===e.indexOf("."))continue;const i="//"+u.getSchemeFreeUrl(e),d=u.matchWildcardUrls(i,n.URLS);let m=u.matchWildcardUrls(i,o.URLS);if(m){const e=o.NEEDS_EVAL.includes(m.hostname),t=a.includes(c.Keyword.UNSAFE_EVAL);e&&!t&&(m=null)}if(m||d){let a="",n="";m&&(a=m.hostname,n=" JSONP endpoints"),d&&(a=d.hostname,n+=""===n.trim()?"":" and",n+=" Angular libraries"),t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,a+" is known to host"+n+" which allow to bypass this CSP.",l.Severity.HIGH,r,e))
784
+ e.checkScriptAllowlistBypass=function checkScriptAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.SCRIPT_SRC),a=e.directives[r]||[];if(a.includes(c.Keyword.NONE))return t;for(const e of a){if(e===c.Keyword.SELF){t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"'self' can be problematic if you host JSONP, AngularJS or user uploaded files.",l.Severity.MEDIUM_MAYBE,r,e));continue}if(e.startsWith("'"))continue;if(s.isUrlScheme(e)||-1===e.indexOf("."))continue;const i="//"+u.getSchemeFreeUrl(e),d=u.matchWildcardUrls(i,n.URLS);let m=u.matchWildcardUrls(i,o.URLS);if(m){const e=o.NEEDS_EVAL.includes(m.hostname),t=a.includes(c.Keyword.UNSAFE_EVAL);e&&!t&&(m=null)}if(m||d){let a="",n="";m&&(a=m.hostname,n=" JSONP endpoints"),d&&(a=d.hostname,n+=""===n.trim()?"":" and",n+=" Angular libraries"),t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,a+" is known to host"+n+" which allow to bypass this CSP.",l.Severity.HIGH,r,e))
785
785
  }else t.push(new l.Finding(l.Type.SCRIPT_ALLOWLIST_BYPASS,"No bypass found; make sure that this URL doesn't serve JSONP replies or Angular libraries.",l.Severity.MEDIUM_MAYBE,r,e))}return t},e.checkFlashObjectAllowlistBypass=function checkFlashObjectAllowlistBypass(e){const t=[],r=e.getEffectiveDirective(c.Directive.OBJECT_SRC),a=e.directives[r]||[],n=e.directives[c.Directive.PLUGIN_TYPES];if(n&&!n.includes("application/x-shockwave-flash"))return[];for(const e of a){if(e===c.Keyword.NONE)return[];const a="//"+u.getSchemeFreeUrl(e),n=u.matchWildcardUrls(a,i.URLS);n?t.push(new l.Finding(l.Type.OBJECT_ALLOWLIST_BYPASS,n.hostname+" is known to host Flash files which allow to bypass this CSP.",l.Severity.HIGH,r,e)):r===c.Directive.OBJECT_SRC&&t.push(new l.Finding(l.Type.OBJECT_ALLOWLIST_BYPASS,"Can you restrict object-src to 'none' only?",l.Severity.MEDIUM_MAYBE,r,e))}return t},e.looksLikeIpAddress=looksLikeIpAddress,e.checkIpSource=function checkIpSource(e){const t=[]
786
786
  ;return u.applyCheckFunktionToDirectives(e,((e,r)=>{for(const a of r){const r=u.getHostname(a);looksLikeIpAddress(r)&&("127.0.0.1"===r?t.push(new l.Finding(l.Type.IP_SOURCE,e+" directive allows localhost as source. Please make sure to remove this in production environments.",l.Severity.INFO,e,a)):t.push(new l.Finding(l.Type.IP_SOURCE,e+" directive has an IP-Address as source: "+r+" (will be ignored by browsers!). ",l.Severity.INFO,e,a)))}})),t},e.checkDeprecatedDirective=function checkDeprecatedDirective(e){const t=[];return c.Directive.REFLECTED_XSS in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"reflected-xss is deprecated since CSP2. Please, use the X-XSS-Protection header instead.",l.Severity.INFO,c.Directive.REFLECTED_XSS)),c.Directive.REFERRER in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"referrer is deprecated since CSP2. Please, use the Referrer-Policy header instead.",l.Severity.INFO,c.Directive.REFERRER)),
787
787
  c.Directive.DISOWN_OPENER in e.directives&&t.push(new l.Finding(l.Type.DEPRECATED_DIRECTIVE,"disown-opener is deprecated since CSP3. Please, use the Cross Origin Opener Policy header instead.",l.Severity.INFO,c.Directive.DISOWN_OPENER)),t},e.checkNonceLength=function checkNonceLength(e){const t=new RegExp("^'nonce-(.+)'$"),r=[];return u.applyCheckFunktionToDirectives(e,((e,a)=>{for(const n of a){const a=n.match(t);if(!a)continue;a[1].length<8&&r.push(new l.Finding(l.Type.NONCE_LENGTH,"Nonces should be at least 8 characters long.",l.Severity.MEDIUM,e,n)),s.isNonce(n,!0)||r.push(new l.Finding(l.Type.NONCE_CHARSET,"Nonces should only use the base64 charset.",l.Severity.INFO,e,n))}})),r},e.checkSrcHttp=function checkSrcHttp(e){const t=[];return u.applyCheckFunktionToDirectives(e,((e,r)=>{for(const a of r){const r=e===c.Directive.REPORT_URI?"Use HTTPS to send violation reports securely.":"Allow only resources downloaded over HTTPS."
@@ -974,38 +974,38 @@ static get meta(){return{id:"interactive",title:hC(dC.UIStrings.interactiveMetri
974
974
  score:fC.computeLogNormalScore(n.scoring,a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:SC(yC.UIStrings.seconds,{timeInMs:a.timing})}}},gC.exports.UIStrings=wC;var TC={exports:{}};const EC=kc,xC=Qk,_C=oi,AC={description:"The maximum potential First Input Delay that your users could experience is the duration of the longest task. [Learn more](https://web.dev/lighthouse-max-potential-fid/)."},RC=_C.createMessageInstanceIdFn("lighthouse-core/audits/metrics/max-potential-fid.js",AC);TC.exports=class MaxPotentialFID extends EC{static get meta(){return{id:"max-potential-fid",title:RC(_C.UIStrings.maxPotentialFIDMetric),description:RC(AC.description),scoreDisplayMode:EC.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static get defaultOptions(){return{p10:130,median:250}}static async audit(e,t){const r={trace:e.traces[EC.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[EC.DEFAULT_PASS],
975
975
  gatherContext:e.GatherContext,settings:t.settings},a=await xC.request(r,t);return{score:EC.computeLogNormalScore({p10:t.options.p10,median:t.options.median},a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:RC(_C.UIStrings.ms,{timeInMs:a.timing})}}},TC.exports.UIStrings=AC;var kC={exports:{}};const DC=kc,CC=oi,IC=zk,NC={description:"Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://web.dev/speed-index/)."},LC=CC.createMessageInstanceIdFn("lighthouse-core/audits/metrics/speed-index.js",NC);kC.exports=class SpeedIndex extends DC{static get meta(){return{id:"speed-index",title:LC(CC.UIStrings.speedIndexMetric),description:LC(NC.description),scoreDisplayMode:DC.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static get defaultOptions(){return{mobile:{scoring:{p10:3387,median:5800}},desktop:{scoring:{p10:1311,median:2300}}}}static async audit(e,t){const r={
976
976
  trace:e.traces[DC.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[DC.DEFAULT_PASS],gatherContext:e.GatherContext,settings:t.settings},a=await IC.request(r,t),n=t.options[t.settings.formFactor];return{score:DC.computeLogNormalScore(n.scoring,a.timing),numericValue:a.timing,numericUnit:"millisecond",displayValue:LC(CC.UIStrings.seconds,{timeInMs:a.timing})}}},kC.exports.UIStrings=NC;var MC={exports:{}};const PC=kc,OC=gD,FC=oi,UC={description:"Sum of all time periods between FCP and Time to Interactive, when task length exceeded 50ms, expressed in milliseconds. [Learn more](https://web.dev/lighthouse-total-blocking-time/)."},jC=FC.createMessageInstanceIdFn("lighthouse-core/audits/metrics/total-blocking-time.js",UC);MC.exports=class TotalBlockingTime extends PC{static get meta(){return{id:"total-blocking-time",title:jC(FC.UIStrings.totalBlockingTimeMetric),description:jC(UC.description),scoreDisplayMode:PC.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}
977
- static get defaultOptions(){return{mobile:{scoring:{p10:200,median:600}},desktop:{scoring:{p10:150,median:350}}}}static async audit(e,t){const r=e.traces[PC.DEFAULT_PASS],a=e.devtoolsLogs[PC.DEFAULT_PASS],n=e.GatherContext,i={trace:r,devtoolsLog:a,gatherContext:n,settings:t.settings};if("timespan"===n.gatherMode&&"simulate"===t.settings.throttlingMethod)return{score:1,notApplicable:!0};const o=await OC.request(i,t),s=t.options[t.settings.formFactor];return{score:PC.computeLogNormalScore(s.scoring,o.timing),numericValue:o.timing,numericUnit:"millisecond",displayValue:jC(FC.UIStrings.ms,{timeInMs:o.timing})}}},MC.exports.UIStrings=UC;const BC=kc,$C=ji,qC=Lo;var zC=class NetworkRequests extends BC{static get meta(){return{id:"network-requests",scoreDisplayMode:BC.SCORING_MODES.INFORMATIVE,title:"Network Requests",description:"Lists the network requests that were made during page load.",requiredArtifacts:["devtoolsLogs"]}}static audit(e,t){const r=e.devtoolsLogs[BC.DEFAULT_PASS]
978
- ;return qC.request(r,t).then((e=>{const t=e.reduce(((e,t)=>Math.min(e,t.startTime)),1/0),timeToMs=e=>e<t||!Number.isFinite(e)?void 0:1e3*(e-t),r=e.map((e=>{const t=e.lrStatistics?.endTimeDeltaMs,r=e.lrStatistics?.TCPMs,a=e.lrStatistics?.requestMs,n=e.lrStatistics?.responseMs;return{url:$C.elideDataURI(e.url),protocol:e.protocol,startTime:timeToMs(e.startTime),endTime:timeToMs(e.endTime),finished:e.finished,transferSize:e.transferSize,resourceSize:e.resourceSize,statusCode:e.statusCode,mimeType:e.mimeType,resourceType:e.resourceType,lrEndTimeDeltaMs:t,lrTCPMs:r,lrRequestMs:a,lrResponseMs:n}}));return{score:1,details:BC.makeTableDetails([{key:"url",itemType:"url",text:"URL"},{key:"protocol",itemType:"text",text:"Protocol"},{key:"startTime",itemType:"ms",granularity:1,text:"Start Time"},{key:"endTime",itemType:"ms",granularity:1,text:"End Time"},{key:"transferSize",itemType:"bytes",displayUnit:"kb",granularity:1,text:"Transfer Size"},{key:"resourceSize",itemType:"bytes",displayUnit:"kb",
979
- granularity:1,text:"Resource Size"},{key:"statusCode",itemType:"text",text:"Status Code"},{key:"mimeType",itemType:"text",text:"MIME Type"},{key:"resourceType",itemType:"text",text:"Resource Type"}],r)}}))}},VC={exports:{}};const WC=kc,GC=oi,HC=Lo,YC=xl,KC={title:"Network Round Trip Times",description:"Network round trip times (RTT) have a large impact on performance. If the RTT to an origin is high, it's an indication that servers closer to the user could improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/)."},JC=GC.createMessageInstanceIdFn("lighthouse-core/audits/network-rtt.js",KC);VC.exports=class NetworkRTT extends WC{static get meta(){return{id:"network-rtt",scoreDisplayMode:WC.SCORING_MODES.INFORMATIVE,title:JC(KC.title),description:JC(KC.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[WC.DEFAULT_PASS];if(!(await HC.request(r,t)).length)return{score:1,notApplicable:!0};const a=await YC.request(r,t)
980
- ;let n=0;const i=a.rtt,o=[];for(const[e,t]of a.additionalRttByOrigin.entries()){if(!e.startsWith("http"))continue;const r=t+i;o.push({origin:e,rtt:r}),n=Number.isFinite(r)?Math.max(r,n):n}o.sort(((e,t)=>t.rtt-e.rtt));const s=[{key:"origin",itemType:"text",text:JC(GC.UIStrings.columnURL)},{key:"rtt",itemType:"ms",granularity:1,text:JC(GC.UIStrings.columnTimeSpent)}],c=WC.makeTableDetails(s,o);return{score:1,numericValue:n,numericUnit:"millisecond",displayValue:JC(GC.UIStrings.ms,{timeInMs:n}),details:c}}},VC.exports.UIStrings=KC;var XC={exports:{}};const ZC=kc,QC=oi,eI=Lo,tI=xl,rI={title:"Server Backend Latencies",description:"Server latencies can impact web performance. If the server latency of an origin is high, it's an indication the server is overloaded or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall)."},aI=QC.createMessageInstanceIdFn("lighthouse-core/audits/network-server-latency.js",rI)
981
- ;XC.exports=class NetworkServerLatency extends ZC{static get meta(){return{id:"network-server-latency",scoreDisplayMode:ZC.SCORING_MODES.INFORMATIVE,title:aI(rI.title),description:aI(rI.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[ZC.DEFAULT_PASS];if(!(await eI.request(r,t)).length)return{score:1,notApplicable:!0};const a=await tI.request(r,t);let n=0;const i=[];for(const[e,t]of a.serverResponseTimeByOrigin.entries())e.startsWith("http")&&(n=Math.max(t,n),i.push({origin:e,serverResponseTime:t}));i.sort(((e,t)=>t.serverResponseTime-e.serverResponseTime));const o=[{key:"origin",itemType:"text",text:aI(QC.UIStrings.columnURL)},{key:"serverResponseTime",itemType:"ms",granularity:1,text:aI(QC.UIStrings.columnTimeSpent)}],s=ZC.makeTableDetails(o,i);return{score:Math.max(1-n/500,0),numericValue:n,numericUnit:"millisecond",displayValue:aI(QC.UIStrings.ms,{timeInMs:n}),details:s}}},XC.exports.UIStrings=rI;var nI={exports:{}}
982
- ;const iI=kc,oI=jb,sI=oi,cI={title:"Avoids `unload` event listeners",failureTitle:"Registers an `unload` listener",description:"The `unload` event does not fire reliably and listening for it can prevent browser optimizations like the Back-Forward Cache. Use `pagehide` or `visibilitychange` events instead. [Learn more](https://web.dev/bfcache/#never-use-the-unload-event)"},lI=sI.createMessageInstanceIdFn("lighthouse-core/audits/no-unload-listeners.js",cI);nI.exports=class NoUnloadListeners extends iI{static get meta(){return{id:"no-unload-listeners",title:lI(cI.title),failureTitle:lI(cI.failureTitle),description:lI(cI.description),requiredArtifacts:["GlobalListeners","JsUsage","SourceMaps","ScriptElements"]}}static async audit(e,t){const r=e.GlobalListeners.filter((e=>"unload"===e.type));if(!r.length)return{score:1};const a=await oI.request(e,t),n=[{key:"source",itemType:"source-location",text:lI(sI.UIStrings.columnSource)}],i=new Map
983
- ;for(const[t,r]of Object.entries(e.JsUsage))for(const e of r)i.set(e.scriptId,t);const o=r.map((e=>{const t=i.get(e.scriptId);if(!t)return{source:{type:"url",value:"(unknown)"}};const r=a.find((e=>e.script.src===t));return{source:iI.makeSourceLocation(t,e.lineNumber,e.columnNumber,r)}}));return{score:0,details:iI.makeTableDetails(n,o)}}},nI.exports.UIStrings=cI;var uI={exports:{}};const dI=kc,mI=oi,pI={title:"Avoid non-composited animations",description:"Animations which are not composited can be janky and increase CLS. [Learn more](https://web.dev/non-composited-animations)",displayValue:"{itemCount, plural,\n =1 {# animated element found}\n other {# animated elements found}\n }",unsupportedCSSProperty:"{propertyCount, plural,\n =1 {Unsupported CSS Property: {properties}}\n other {Unsupported CSS Properties: {properties}}\n }",transformDependsBoxSize:"Transform-related property depends on box size",filterMayMovePixels:"Filter-related property may move pixels",
984
- nonReplaceCompositeMode:'Effect has composite mode other than "replace"',incompatibleAnimations:"Target has another animation which is incompatible",unsupportedTimingParameters:"Effect has unsupported timing parameters"},hI=mI.createMessageInstanceIdFn("lighthouse-core/audits/non-composited-animations.js",pI),gI=[{flag:8192,text:pI.unsupportedCSSProperty},{flag:2048,text:pI.transformDependsBoxSize},{flag:4096,text:pI.filterMayMovePixels},{flag:16,text:pI.nonReplaceCompositeMode},{flag:64,text:pI.incompatibleAnimations},{flag:8,text:pI.unsupportedTimingParameters}];function getActionableFailureReasons(e,t){return gI.filter((t=>e&t.flag)).map((e=>e.text===pI.unsupportedCSSProperty?hI(e.text,{propertyCount:t.length,properties:t.join(", ")}):hI(e.text)))}uI.exports=class NonCompositedAnimations extends dI{static get meta(){return{id:"non-composited-animations",scoreDisplayMode:dI.SCORING_MODES.INFORMATIVE,title:hI(pI.title),description:hI(pI.description),
985
- requiredArtifacts:["TraceElements","HostUserAgent"]}}static async audit(e){const t=e.HostUserAgent.match(/Chrome\/(\d+)/);if(!t||Number(t[1])<86)return{score:1,notApplicable:!0};const r=[];let a=!1;e.TraceElements.forEach((e=>{if("animation"!==e.traceEventType)return;const t=e.animations||[],n=new Map;for(const{name:e,failureReasonsMask:r,unsupportedProperties:i}of t){if(!r)continue;const t=getActionableFailureReasons(r,i||[]);for(const r of t){e&&(a=!0);const t=n.get(e)||new Set;t.add(r),n.set(e,t)}}if(!n.size)return;const i=[];for(const[e,t]of n)for(const r of t)i.push({failureReason:r,animation:e});r.push({node:dI.makeNodeItem(e.node),subItems:{type:"subitems",items:i}})}));const n=[{key:"node",itemType:"node",subItemsHeading:{key:"failureReason",itemType:"text"},text:hI(mI.UIStrings.columnElement)}];a&&n.push({key:null,itemType:"text",subItemsHeading:{key:"animation",itemType:"text"},text:hI(mI.UIStrings.columnName)});const i=dI.makeTableDetails(n,r);let o
986
- ;return r.length>0&&(o=hI(pI.displayValue,{itemCount:r.length})),{score:0===r.length?1:0,notApplicable:0===r.length,details:i,displayValue:o}}},uI.exports.UIStrings=pI;var fI={exports:{}};const yI=Ao,vI=Lo,bI=ji,wI=Ki,SI=Tu,{Util:TI}=Ni;class ResourceSummary$2{static determineResourceType(e){if(!e.resourceType)return"other";return{Stylesheet:"stylesheet",Image:"image",Media:"media",Font:"font",Script:"script",Document:"document"}[e.resourceType]||"other"}static summarize(e,t,r){const a={stylesheet:{count:0,resourceSize:0,transferSize:0},image:{count:0,resourceSize:0,transferSize:0},media:{count:0,resourceSize:0,transferSize:0},font:{count:0,resourceSize:0,transferSize:0},script:{count:0,resourceSize:0,transferSize:0},document:{count:0,resourceSize:0,transferSize:0},other:{count:0,resourceSize:0,transferSize:0},total:{count:0,resourceSize:0,transferSize:0},"third-party":{count:0,resourceSize:0,transferSize:0}},n=SI.getMatchingBudget(r,t);let i=[]
987
- ;if(n?.options?.firstPartyHostnames)i=n.options.firstPartyHostnames;else{const e=TI.getRootDomain(t);i=[`*.${e}`]}return e.filter((e=>("other"!==this.determineResourceType(e)||!e.url.endsWith("/favicon.ico"))&&!wI.isNonNetworkRequest(e))).forEach((e=>{const t=this.determineResourceType(e);a[t].count++,a[t].resourceSize+=e.resourceSize,a[t].transferSize+=e.transferSize,a.total.count++,a.total.resourceSize+=e.resourceSize,a.total.transferSize+=e.transferSize;i.some((t=>{const r=new bI(e.url);return t.startsWith("*.")?r.hostname.endsWith(t.slice(2)):r.hostname===t}))||(a["third-party"].count++,a["third-party"].resourceSize+=e.resourceSize,a["third-party"].transferSize+=e.transferSize)})),a}static async compute_(e,t){const r=await vI.request(e.devtoolsLog,t);return ResourceSummary$2.summarize(r,e.URL.finalUrl,e.budgets)}}var EI=yI(ResourceSummary$2,["URL","devtoolsLog","budgets"]);const xI=kc,_I=EI,AI=HT,RI=Tu,kI=oi,DI={title:"Performance budget",
988
- description:"Keep the quantity and size of network requests under the targets set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",requestCountOverBudget:"{count, plural,\n =1 {1 request}\n other {# requests}\n }"},CI=kI.createMessageInstanceIdFn("lighthouse-core/audits/performance-budget.js",DI);fI.exports=class ResourceBudget extends xI{static get meta(){return{id:"performance-budget",title:CI(DI.title),description:CI(DI.description),scoreDisplayMode:xI.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","URL"]}}static getRowLabel(e){return{total:kI.UIStrings.totalResourceType,document:kI.UIStrings.documentResourceType,script:kI.UIStrings.scriptResourceType,stylesheet:kI.UIStrings.stylesheetResourceType,image:kI.UIStrings.imageResourceType,media:kI.UIStrings.mediaResourceType,font:kI.UIStrings.fontResourceType,other:kI.UIStrings.otherResourceType,
989
- "third-party":kI.UIStrings.thirdPartyResourceType}[e]}static tableItems(e,t){return Object.keys(t).map((r=>{const a=CI(this.getRowLabel(r)),n=t[r].count,i=t[r].transferSize;let o,s;if(e.resourceSizes){const t=e.resourceSizes.find((e=>e.resourceType===r));t&&i>1024*t.budget&&(o=i-1024*t.budget)}if(e.resourceCounts){const t=e.resourceCounts.find((e=>e.resourceType===r));if(t&&n>t.budget){const e=n-t.budget;s=CI(DI.requestCountOverBudget,{count:e})}}return{resourceType:r,label:a,requestCount:n,transferSize:i,countOverBudget:s,sizeOverBudget:o}})).filter((t=>!(!e.resourceSizes||!e.resourceSizes.some((e=>e.resourceType===t.resourceType)))||!(!e.resourceCounts||!e.resourceCounts.some((e=>e.resourceType===t.resourceType))))).sort(((e,t)=>(t.sizeOverBudget||0)-(e.sizeOverBudget||0)))}static async audit(e,t){const r=e.devtoolsLogs[xI.DEFAULT_PASS],a={devtoolsLog:r,URL:e.URL,budgets:t.settings.budgets},n=await _I.request(a,t),i=await AI.request({URL:e.URL,devtoolsLog:r
990
- },t),o=RI.getMatchingBudget(t.settings.budgets,i.url);if(!o)return{score:0,notApplicable:!0};const s=[{key:"label",itemType:"text",text:CI(kI.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:CI(kI.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:CI(kI.UIStrings.columnTransferSize)},{key:"countOverBudget",itemType:"text",text:""},{key:"sizeOverBudget",itemType:"bytes",text:CI(kI.UIStrings.columnOverBudget)}];return{details:xI.makeTableDetails(s,this.tableItems(o,n)),score:1}}},fI.exports.UIStrings=DI;const II=kc,NI=oi,LI=db,MI=fb,PI=Tb,OI=Uk,FI=vk,UI=NI.createMessageInstanceIdFn("lighthouse-core/audits/predictive-perf.js",{});var jI=class PredictivePerf extends II{static get meta(){return{id:"predictive-perf",title:"Predicted Performance (beta)",description:"Predicted performance evaluates how your site will perform under a cellular connection on a mobile device.",scoreDisplayMode:II.SCORING_MODES.NUMERIC,supportedModes:["navigation"],
991
- requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static async audit(e,t){const r=e.GatherContext,a={trace:e.traces[II.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[II.DEFAULT_PASS],gatherContext:r,settings:{}},n=await LI.request(a,t),i=await MI.request(a,t),o=await PI.request(a,t),s=await OI.request(a,t),c=await FI.request(a,t),l={roughEstimateOfFCP:n.timing,optimisticFCP:n.optimisticEstimate.timeInMs,pessimisticFCP:n.pessimisticEstimate.timeInMs,roughEstimateOfFMP:i.timing,optimisticFMP:i.optimisticEstimate.timeInMs,pessimisticFMP:i.pessimisticEstimate.timeInMs,roughEstimateOfTTI:o.timing,optimisticTTI:o.optimisticEstimate.timeInMs,pessimisticTTI:o.pessimisticEstimate.timeInMs,roughEstimateOfSI:s.timing,optimisticSI:s.optimisticEstimate.timeInMs,pessimisticSI:s.pessimisticEstimate.timeInMs,roughEstimateOfLCP:c.timing,optimisticLCP:c.optimisticEstimate.timeInMs,pessimisticLCP:c.pessimisticEstimate.timeInMs};return{score:II.computeLogNormalScore({p10:3651,median:1e4
992
- },l.roughEstimateOfTTI),numericValue:l.roughEstimateOfTTI,numericUnit:"millisecond",displayValue:UI(NI.UIStrings.ms,{timeInMs:l.roughEstimateOfTTI}),details:{type:"debugdata",items:[l]}}}},BI={exports:{}};const $I=kc,qI=oi,zI=Q_.exports,VI=/^(optional)$/,WI=Lo,GI={title:"Fonts with `font-display: optional` are preloaded",failureTitle:"Fonts with `font-display: optional` are not preloaded",description:"Preload `optional` fonts so first-time visitors may use them. [Learn more](https://web.dev/preload-optional-fonts/)"},HI=qI.createMessageInstanceIdFn("lighthouse-core/audits/preload-fonts.js",GI);class PreloadFontsAudit extends $I{static get meta(){return{id:"preload-fonts",title:HI(GI.title),failureTitle:HI(GI.failureTitle),description:HI(GI.description),requiredArtifacts:["devtoolsLogs","URL","CSSUsage"]}}static getURLsAttemptedToPreload(e){const t=e.filter((e=>"Font"===e.resourceType)).filter((e=>e.isLinkPreload)).map((e=>e.url));return new Set(t)}static async audit_(e,t){
993
- const r=e.devtoolsLogs[this.DEFAULT_PASS],a=await WI.request(r,t),n=zI.findFontDisplayDeclarations(e,VI).passingURLs,i=PreloadFontsAudit.getURLsAttemptedToPreload(a),o=Array.from(n).filter((e=>!i.has(e))).map((e=>({url:e}))),s=[{key:"url",itemType:"url",text:HI(qI.UIStrings.columnURL)}];return{score:o.length>0?0:1,details:$I.makeTableDetails(s,o),notApplicable:0===n.size}}static async audit(){return{score:1,notApplicable:!0}}}BI.exports=PreloadFontsAudit,BI.exports.UIStrings=GI;var YI={exports:{}};const KI=kc,JI=oi,XI=Ki,ZI=HT,QI=vk,eN=Dl,tN=Ib,rN={title:"Preload Largest Contentful Paint image",description:"Preload the image used by the LCP element in order to improve your LCP time. [Learn more](https://web.dev/optimize-lcp/#preload-important-resources)."},aN=JI.createMessageInstanceIdFn("lighthouse-core/audits/preload-lcp-image.js",rN);class PreloadLCPImageAudit extends KI{static get meta(){return{id:"preload-lcp-image",title:aN(rN.title),description:aN(rN.description),
994
- supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext","URL","TraceElements","ImageElements"],scoreDisplayMode:KI.SCORING_MODES.NUMERIC}}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!XI.isNonNetworkRequest(e)&&(!(r.length<=a)&&e.frameId===t.frameId))}static findLCPNode(e,t){let r,a;return e.traverse(((e,n)=>{"network"===e.type&&e.record.url===t&&(r=e,a=n.slice(1).filter((e=>"network"===e.type)))})),{lcpNode:r,path:a}}static getLCPNodeToPreload(e,t,r,a){if(!r)return;const n=a.find((e=>e.node.devtoolsNodePath===r.node.devtoolsNodePath));if(!n)return;const i=n.src,{lcpNode:o,path:s}=PreloadLCPImageAudit.findLCPNode(t,i);if(!o||!s)return;return PreloadLCPImageAudit.shouldPreloadRequest(o.record,e,s)?o:void 0}static computeWasteWithGraph(e,t,r,a){if(!e||!t)return{wastedMs:0,results:[]};const n=r.cloneWithRelationships(),i=new Set;for(const e of t.getDependencies())i.add(e.id);let o=null,s=null
995
- ;for(const{node:e}of n.traverseGenerator())"network"===e.type&&(e.isMainDocument()?s=e:e.id===t.id&&(o=e));if(!s)throw new Error("Could not find main document node");if(!o)throw new Error("Could not find the LCP node");o.removeAllDependencies(),o.addDependency(s);const c=a.simulate(r,{flexibleOrdering:!0}),l=a.simulate(n,{flexibleOrdering:!0}),u=c.nodeTimings.get(t);if(!u)throw new Error("Impossible - node timings should never be undefined");const d=l.nodeTimings.get(o);if(!d)throw new Error("Impossible - node timings should never be undefined");const m=Array.from(l.nodeTimings.keys()).reduce(((e,t)=>e.set(t.id,t)),new Map);let p=0;for(const e of Array.from(i)){const t=m.get(e);if(!t)throw new Error("Impossible - node should never be undefined");const r=l.nodeTimings.get(t)?.endTime||0;p=Math.max(p,r)}const h=u.endTime-Math.max(d.endTime,p);return{wastedMs:h,results:[{node:KI.makeNodeItem(e.node),url:t.record.url,wastedMs:h}]}}static async audit(e,t){
996
- const r=e.GatherContext,a=e.traces[PreloadLCPImageAudit.DEFAULT_PASS],n=e.devtoolsLogs[PreloadLCPImageAudit.DEFAULT_PASS],i=e.URL,o={trace:a,devtoolsLog:n,gatherContext:r,settings:t.settings},s=e.TraceElements.find((e=>"largest-contentful-paint"===e.traceEventType)),[c,l,u]=await Promise.all([ZI.request({devtoolsLog:n,URL:i},t),QI.request(o,t),eN.request({devtoolsLog:n,settings:t.settings},t)]),d=l.pessimisticGraph,m=PreloadLCPImageAudit.getLCPNodeToPreload(c,d,s,e.ImageElements),{results:p,wastedMs:h}=PreloadLCPImageAudit.computeWasteWithGraph(s,m,d,u),f=[{key:"node",valueType:"node",label:""},{key:"url",valueType:"url",label:aN(JI.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:aN(JI.UIStrings.columnWastedMs)}],y=KI.makeOpportunityDetails(f,p,h);return{score:tN.scoreForWastedMs(h),numericValue:h,numericUnit:"millisecond",displayValue:h?aN(JI.UIStrings.displayValueMsSavings,{wastedMs:h}):"",details:y}}}YI.exports=PreloadLCPImageAudit,YI.exports.UIStrings=rN;var nN={
997
- exports:{}};const iN=kc,oN=Ib,sN=oi,cN=Yp,lN=Lo,uN=HT,dN=Tb,mN={title:"Avoid multiple page redirects",description:"Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects/)."},pN=sN.createMessageInstanceIdFn("lighthouse-core/audits/redirects.js",mN);class Redirects extends iN{static get meta(){return{id:"redirects",title:pN(mN.title),description:pN(mN.description),scoreDisplayMode:iN.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["URL","GatherContext","devtoolsLogs","traces"]}}static getDocumentRequestChain(e,t,r){const a=[];for(const e of r.processEvents){if("navigationStart"!==e.name)continue;const r=e.args.data||{};if(!r.documentLoaderURL||!r.isLoadingMainFrame)continue;let n=t.find((e=>e.url===r.documentLoaderURL));for(;n;)a.push(n),n=n.redirectDestination}return a.length?a:(e.redirects||[]).concat(e)}static async audit(e,t){
998
- const r=t.settings,a=e.traces[iN.DEFAULT_PASS],n=e.devtoolsLogs[iN.DEFAULT_PASS],i=e.GatherContext,o=await cN.request(a,t),s=await lN.request(n,t),c=await uN.request({URL:e.URL,devtoolsLog:n},t),l={trace:a,devtoolsLog:n,gatherContext:i,settings:r},u=await dN.request(l,t),d=new Map;for(const[e,t]of u.pessimisticEstimate.nodeTimings.entries())"network"===e.type&&d.set(e.record.url,t);const m=Redirects.getDocumentRequestChain(c,s,o);let p=0;const h=[];for(let e=0;e<m.length&&!(m.length<2);e++){const t=m[e],a=m[e+1]||t,n=d.get(t.url),i=d.get(a.url);if(!n||!i)throw new Error("Could not find redirects in graph");const o=i.startTime-n.startTime,s=a.startTime-t.startTime,c="simulate"===r.throttlingMethod?o:1e3*s;p+=c,h.push({url:t.url,wastedMs:c})}const f=[{key:"url",valueType:"url",label:pN(sN.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:pN(sN.UIStrings.columnTimeSpent)}],y=iN.makeOpportunityDetails(f,h,p);return{score:m.length<=2?1:oN.scoreForWastedMs(p),numericValue:p,
999
- numericUnit:"millisecond",displayValue:p?pN(sN.UIStrings.displayValueMsSavings,{wastedMs:p}):"",details:y}}}nN.exports=Redirects,nN.exports.UIStrings=mN;var hN={exports:{}};const gN=kc,fN=EI,yN=oi,vN={title:"Keep request counts low and transfer sizes small",description:"To set budgets for the quantity and size of page resources, add a budget.json file. [Learn more](https://web.dev/use-lighthouse-for-performance-budgets/).",displayValue:"{requestCount, plural, =1 {1 request • {byteCount, number, bytes} KiB} other {# requests • {byteCount, number, bytes} KiB}}"},bN=yN.createMessageInstanceIdFn("lighthouse-core/audits/resource-summary.js",vN);hN.exports=class ResourceSummary extends gN{static get meta(){return{id:"resource-summary",title:bN(vN.title),description:bN(vN.description),scoreDisplayMode:gN.SCORING_MODES.INFORMATIVE,requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[gN.DEFAULT_PASS],a=await fN.request({devtoolsLog:r,URL:e.URL,
1000
- budgets:t.settings.budgets},t),n=[{key:"label",itemType:"text",text:bN(yN.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:bN(yN.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:bN(yN.UIStrings.columnTransferSize)}],i={total:bN(yN.UIStrings.totalResourceType),document:bN(yN.UIStrings.documentResourceType),script:bN(yN.UIStrings.scriptResourceType),stylesheet:bN(yN.UIStrings.stylesheetResourceType),image:bN(yN.UIStrings.imageResourceType),media:bN(yN.UIStrings.mediaResourceType),font:bN(yN.UIStrings.fontResourceType),other:bN(yN.UIStrings.otherResourceType),"third-party":bN(yN.UIStrings.thirdPartyResourceType)},o=Object.keys(a).map((e=>({resourceType:e,label:i[e],requestCount:a[e].count,transferSize:a[e].transferSize}))),s=o.find((e=>"third-party"===e.resourceType))||[],c=o.filter((e=>"third-party"!==e.resourceType)).sort(((e,t)=>t.transferSize-e.transferSize)).concat(s);return{details:gN.makeTableDetails(n,c),score:1,
1001
- displayValue:bN(vN.displayValue,{requestCount:a.total.count,byteCount:a.total.transferSize})}}},hN.exports.UIStrings=vN;var wN={exports:{}};!function(e){function JPEGEncoder(e){
977
+ static get defaultOptions(){return{mobile:{scoring:{p10:200,median:600}},desktop:{scoring:{p10:150,median:350}}}}static async audit(e,t){const r=e.traces[PC.DEFAULT_PASS],a=e.devtoolsLogs[PC.DEFAULT_PASS],n=e.GatherContext,i={trace:r,devtoolsLog:a,gatherContext:n,settings:t.settings};if("timespan"===n.gatherMode&&"simulate"===t.settings.throttlingMethod)return{score:1,notApplicable:!0};const o=await OC.request(i,t),s=t.options[t.settings.formFactor];return{score:PC.computeLogNormalScore(s.scoring,o.timing),numericValue:o.timing,numericUnit:"millisecond",displayValue:jC(FC.UIStrings.ms,{timeInMs:o.timing})}}},MC.exports.UIStrings=UC;const BC=kc,$C=ji,qC=Lo,zC=HT;var VC=class NetworkRequests extends BC{static get meta(){return{id:"network-requests",scoreDisplayMode:BC.SCORING_MODES.INFORMATIVE,title:"Network Requests",description:"Lists the network requests that were made during page load.",requiredArtifacts:["devtoolsLogs","URL","GatherContext"]}}static async audit(e,t){
978
+ const r=e.devtoolsLogs[BC.DEFAULT_PASS],a=await qC.request(r,t),n=a.reduce(((e,t)=>Math.min(e,t.startTime)),1/0);let i;if("navigation"===e.GatherContext.gatherMode){const a=await zC.request({devtoolsLog:r,URL:e.URL},t);i=a.frameId}const timeToMs=e=>e<n||!Number.isFinite(e)?void 0:1e3*(e-n),o=a.map((e=>{const t=e.lrStatistics?.endTimeDeltaMs,r=e.lrStatistics?.TCPMs,a=e.lrStatistics?.requestMs,n=e.lrStatistics?.responseMs,o=e.isLinkPreload||void 0,s=i&&e.frameId===i||void 0;return{url:$C.elideDataURI(e.url),protocol:e.protocol,startTime:timeToMs(e.startTime),endTime:timeToMs(e.endTime),finished:e.finished,transferSize:e.transferSize,resourceSize:e.resourceSize,statusCode:e.statusCode,mimeType:e.mimeType,resourceType:e.resourceType,isLinkPreload:o,experimentalFromMainFrame:s,lrEndTimeDeltaMs:t,lrTCPMs:r,lrRequestMs:a,lrResponseMs:n}})),s=BC.makeTableDetails([{key:"url",itemType:"url",text:"URL"},{key:"protocol",itemType:"text",text:"Protocol"},{key:"startTime",itemType:"ms",granularity:1,
979
+ text:"Start Time"},{key:"endTime",itemType:"ms",granularity:1,text:"End Time"},{key:"transferSize",itemType:"bytes",displayUnit:"kb",granularity:1,text:"Transfer Size"},{key:"resourceSize",itemType:"bytes",displayUnit:"kb",granularity:1,text:"Resource Size"},{key:"statusCode",itemType:"text",text:"Status Code"},{key:"mimeType",itemType:"text",text:"MIME Type"},{key:"resourceType",itemType:"text",text:"Resource Type"}],o),c=Number.isFinite(n)?1e6*n:void 0;return s.debugData={type:"debugdata",networkStartTimeTs:c},{score:1,details:s}}},WC={exports:{}};const GC=kc,HC=oi,YC=Lo,KC=xl,JC={title:"Network Round Trip Times",description:"Network round trip times (RTT) have a large impact on performance. If the RTT to an origin is high, it's an indication that servers closer to the user could improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/)."},XC=HC.createMessageInstanceIdFn("lighthouse-core/audits/network-rtt.js",JC);WC.exports=class NetworkRTT extends GC{
980
+ static get meta(){return{id:"network-rtt",scoreDisplayMode:GC.SCORING_MODES.INFORMATIVE,title:XC(JC.title),description:XC(JC.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[GC.DEFAULT_PASS];if(!(await YC.request(r,t)).length)return{score:1,notApplicable:!0};const a=await KC.request(r,t);let n=0;const i=a.rtt,o=[];for(const[e,t]of a.additionalRttByOrigin.entries()){if(!e.startsWith("http"))continue;const r=t+i;o.push({origin:e,rtt:r}),n=Number.isFinite(r)?Math.max(r,n):n}o.sort(((e,t)=>t.rtt-e.rtt));const s=[{key:"origin",itemType:"text",text:XC(HC.UIStrings.columnURL)},{key:"rtt",itemType:"ms",granularity:1,text:XC(HC.UIStrings.columnTimeSpent)}],c=GC.makeTableDetails(s,o);return{score:1,numericValue:n,numericUnit:"millisecond",displayValue:XC(HC.UIStrings.ms,{timeInMs:n}),details:c}}},WC.exports.UIStrings=JC;var ZC={exports:{}};const QC=kc,eI=oi,tI=Lo,rI=xl,aI={title:"Server Backend Latencies",
981
+ description:"Server latencies can impact web performance. If the server latency of an origin is high, it's an indication the server is overloaded or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall)."},nI=eI.createMessageInstanceIdFn("lighthouse-core/audits/network-server-latency.js",aI);ZC.exports=class NetworkServerLatency extends QC{static get meta(){return{id:"network-server-latency",scoreDisplayMode:QC.SCORING_MODES.INFORMATIVE,title:nI(aI.title),description:nI(aI.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[QC.DEFAULT_PASS];if(!(await tI.request(r,t)).length)return{score:1,notApplicable:!0};const a=await rI.request(r,t);let n=0;const i=[];for(const[e,t]of a.serverResponseTimeByOrigin.entries())e.startsWith("http")&&(n=Math.max(t,n),i.push({origin:e,serverResponseTime:t}));i.sort(((e,t)=>t.serverResponseTime-e.serverResponseTime));const o=[{key:"origin",
982
+ itemType:"text",text:nI(eI.UIStrings.columnURL)},{key:"serverResponseTime",itemType:"ms",granularity:1,text:nI(eI.UIStrings.columnTimeSpent)}],s=QC.makeTableDetails(o,i);return{score:Math.max(1-n/500,0),numericValue:n,numericUnit:"millisecond",displayValue:nI(eI.UIStrings.ms,{timeInMs:n}),details:s}}},ZC.exports.UIStrings=aI;var iI={exports:{}};const oI=kc,sI=jb,cI=oi,lI={title:"Avoids `unload` event listeners",failureTitle:"Registers an `unload` listener",description:"The `unload` event does not fire reliably and listening for it can prevent browser optimizations like the Back-Forward Cache. Use `pagehide` or `visibilitychange` events instead. [Learn more](https://web.dev/bfcache/#never-use-the-unload-event)"},uI=cI.createMessageInstanceIdFn("lighthouse-core/audits/no-unload-listeners.js",lI);iI.exports=class NoUnloadListeners extends oI{static get meta(){return{id:"no-unload-listeners",title:uI(lI.title),failureTitle:uI(lI.failureTitle),description:uI(lI.description),
983
+ requiredArtifacts:["GlobalListeners","JsUsage","SourceMaps","ScriptElements"]}}static async audit(e,t){const r=e.GlobalListeners.filter((e=>"unload"===e.type));if(!r.length)return{score:1};const a=await sI.request(e,t),n=[{key:"source",itemType:"source-location",text:uI(cI.UIStrings.columnSource)}],i=new Map;for(const[t,r]of Object.entries(e.JsUsage))for(const e of r)i.set(e.scriptId,t);const o=r.map((e=>{const t=i.get(e.scriptId);if(!t)return{source:{type:"url",value:"(unknown)"}};const r=a.find((e=>e.script.src===t));return{source:oI.makeSourceLocation(t,e.lineNumber,e.columnNumber,r)}}));return{score:0,details:oI.makeTableDetails(n,o)}}},iI.exports.UIStrings=lI;var dI={exports:{}};const mI=kc,pI=oi,hI={title:"Avoid non-composited animations",description:"Animations which are not composited can be janky and increase CLS. [Learn more](https://web.dev/non-composited-animations)",
984
+ displayValue:"{itemCount, plural,\n =1 {# animated element found}\n other {# animated elements found}\n }",unsupportedCSSProperty:"{propertyCount, plural,\n =1 {Unsupported CSS Property: {properties}}\n other {Unsupported CSS Properties: {properties}}\n }",transformDependsBoxSize:"Transform-related property depends on box size",filterMayMovePixels:"Filter-related property may move pixels",nonReplaceCompositeMode:'Effect has composite mode other than "replace"',incompatibleAnimations:"Target has another animation which is incompatible",unsupportedTimingParameters:"Effect has unsupported timing parameters"},gI=pI.createMessageInstanceIdFn("lighthouse-core/audits/non-composited-animations.js",hI),fI=[{flag:8192,text:hI.unsupportedCSSProperty},{flag:2048,text:hI.transformDependsBoxSize},{flag:4096,text:hI.filterMayMovePixels},{flag:16,text:hI.nonReplaceCompositeMode},{flag:64,text:hI.incompatibleAnimations},{flag:8,text:hI.unsupportedTimingParameters}]
985
+ ;function getActionableFailureReasons(e,t){return fI.filter((t=>e&t.flag)).map((e=>e.text===hI.unsupportedCSSProperty?gI(e.text,{propertyCount:t.length,properties:t.join(", ")}):gI(e.text)))}dI.exports=class NonCompositedAnimations extends mI{static get meta(){return{id:"non-composited-animations",scoreDisplayMode:mI.SCORING_MODES.INFORMATIVE,title:gI(hI.title),description:gI(hI.description),requiredArtifacts:["TraceElements","HostUserAgent"]}}static async audit(e){const t=e.HostUserAgent.match(/Chrome\/(\d+)/);if(!t||Number(t[1])<86)return{score:1,notApplicable:!0};const r=[];let a=!1;e.TraceElements.forEach((e=>{if("animation"!==e.traceEventType)return;const t=e.animations||[],n=new Map;for(const{name:e,failureReasonsMask:r,unsupportedProperties:i}of t){if(!r)continue;const t=getActionableFailureReasons(r,i||[]);for(const r of t){e&&(a=!0);const t=n.get(e)||new Set;t.add(r),n.set(e,t)}}if(!n.size)return;const i=[];for(const[e,t]of n)for(const r of t)i.push({failureReason:r,
986
+ animation:e});r.push({node:mI.makeNodeItem(e.node),subItems:{type:"subitems",items:i}})}));const n=[{key:"node",itemType:"node",subItemsHeading:{key:"failureReason",itemType:"text"},text:gI(pI.UIStrings.columnElement)}];a&&n.push({key:null,itemType:"text",subItemsHeading:{key:"animation",itemType:"text"},text:gI(pI.UIStrings.columnName)});const i=mI.makeTableDetails(n,r);let o;return r.length>0&&(o=gI(hI.displayValue,{itemCount:r.length})),{score:0===r.length?1:0,notApplicable:0===r.length,details:i,displayValue:o}}},dI.exports.UIStrings=hI;var yI={exports:{}};const vI=Ao,bI=Lo,wI=ji,SI=Ki,TI=Tu,{Util:EI}=Ni;class ResourceSummary$2{static determineResourceType(e){if(!e.resourceType)return"other";return{Stylesheet:"stylesheet",Image:"image",Media:"media",Font:"font",Script:"script",Document:"document"}[e.resourceType]||"other"}static summarize(e,t,r){const a={stylesheet:{count:0,resourceSize:0,transferSize:0},image:{count:0,resourceSize:0,transferSize:0},media:{count:0,resourceSize:0,
987
+ transferSize:0},font:{count:0,resourceSize:0,transferSize:0},script:{count:0,resourceSize:0,transferSize:0},document:{count:0,resourceSize:0,transferSize:0},other:{count:0,resourceSize:0,transferSize:0},total:{count:0,resourceSize:0,transferSize:0},"third-party":{count:0,resourceSize:0,transferSize:0}},n=TI.getMatchingBudget(r,t);let i=[];if(n?.options?.firstPartyHostnames)i=n.options.firstPartyHostnames;else{const e=EI.getRootDomain(t);i=[`*.${e}`]}return e.filter((e=>("other"!==this.determineResourceType(e)||!e.url.endsWith("/favicon.ico"))&&!SI.isNonNetworkRequest(e))).forEach((e=>{const t=this.determineResourceType(e);a[t].count++,a[t].resourceSize+=e.resourceSize,a[t].transferSize+=e.transferSize,a.total.count++,a.total.resourceSize+=e.resourceSize,a.total.transferSize+=e.transferSize;i.some((t=>{const r=new wI(e.url);return t.startsWith("*.")?r.hostname.endsWith(t.slice(2)):r.hostname===t}))||(a["third-party"].count++,a["third-party"].resourceSize+=e.resourceSize,
988
+ a["third-party"].transferSize+=e.transferSize)})),a}static async compute_(e,t){const r=await bI.request(e.devtoolsLog,t);return ResourceSummary$2.summarize(r,e.URL.finalUrl,e.budgets)}}var xI=vI(ResourceSummary$2,["URL","devtoolsLog","budgets"]);const _I=kc,AI=xI,RI=HT,kI=Tu,DI=oi,CI={title:"Performance budget",description:"Keep the quantity and size of network requests under the targets set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",requestCountOverBudget:"{count, plural,\n =1 {1 request}\n other {# requests}\n }"},II=DI.createMessageInstanceIdFn("lighthouse-core/audits/performance-budget.js",CI);yI.exports=class ResourceBudget extends _I{static get meta(){return{id:"performance-budget",title:II(CI.title),description:II(CI.description),scoreDisplayMode:_I.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","URL"]}}static getRowLabel(e){return{
989
+ total:DI.UIStrings.totalResourceType,document:DI.UIStrings.documentResourceType,script:DI.UIStrings.scriptResourceType,stylesheet:DI.UIStrings.stylesheetResourceType,image:DI.UIStrings.imageResourceType,media:DI.UIStrings.mediaResourceType,font:DI.UIStrings.fontResourceType,other:DI.UIStrings.otherResourceType,"third-party":DI.UIStrings.thirdPartyResourceType}[e]}static tableItems(e,t){return Object.keys(t).map((r=>{const a=II(this.getRowLabel(r)),n=t[r].count,i=t[r].transferSize;let o,s;if(e.resourceSizes){const t=e.resourceSizes.find((e=>e.resourceType===r));t&&i>1024*t.budget&&(o=i-1024*t.budget)}if(e.resourceCounts){const t=e.resourceCounts.find((e=>e.resourceType===r));if(t&&n>t.budget){const e=n-t.budget;s=II(CI.requestCountOverBudget,{count:e})}}return{resourceType:r,label:a,requestCount:n,transferSize:i,countOverBudget:s,sizeOverBudget:o}
990
+ })).filter((t=>!(!e.resourceSizes||!e.resourceSizes.some((e=>e.resourceType===t.resourceType)))||!(!e.resourceCounts||!e.resourceCounts.some((e=>e.resourceType===t.resourceType))))).sort(((e,t)=>(t.sizeOverBudget||0)-(e.sizeOverBudget||0)))}static async audit(e,t){const r=e.devtoolsLogs[_I.DEFAULT_PASS],a={devtoolsLog:r,URL:e.URL,budgets:t.settings.budgets},n=await AI.request(a,t),i=await RI.request({URL:e.URL,devtoolsLog:r},t),o=kI.getMatchingBudget(t.settings.budgets,i.url);if(!o)return{score:0,notApplicable:!0};const s=[{key:"label",itemType:"text",text:II(DI.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:II(DI.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:II(DI.UIStrings.columnTransferSize)},{key:"countOverBudget",itemType:"text",text:""},{key:"sizeOverBudget",itemType:"bytes",text:II(DI.UIStrings.columnOverBudget)}];return{details:_I.makeTableDetails(s,this.tableItems(o,n)),score:1}}},yI.exports.UIStrings=CI
991
+ ;const NI=kc,LI=oi,MI=db,PI=fb,OI=Tb,FI=Uk,UI=vk,jI=LI.createMessageInstanceIdFn("lighthouse-core/audits/predictive-perf.js",{});var BI=class PredictivePerf extends NI{static get meta(){return{id:"predictive-perf",title:"Predicted Performance (beta)",description:"Predicted performance evaluates how your site will perform under a cellular connection on a mobile device.",scoreDisplayMode:NI.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext"]}}static async audit(e,t){const r=e.GatherContext,a={trace:e.traces[NI.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[NI.DEFAULT_PASS],gatherContext:r,settings:{}},n=await MI.request(a,t),i=await PI.request(a,t),o=await OI.request(a,t),s=await FI.request(a,t),c=await UI.request(a,t),l={roughEstimateOfFCP:n.timing,optimisticFCP:n.optimisticEstimate.timeInMs,pessimisticFCP:n.pessimisticEstimate.timeInMs,roughEstimateOfFMP:i.timing,optimisticFMP:i.optimisticEstimate.timeInMs,
992
+ pessimisticFMP:i.pessimisticEstimate.timeInMs,roughEstimateOfTTI:o.timing,optimisticTTI:o.optimisticEstimate.timeInMs,pessimisticTTI:o.pessimisticEstimate.timeInMs,roughEstimateOfSI:s.timing,optimisticSI:s.optimisticEstimate.timeInMs,pessimisticSI:s.pessimisticEstimate.timeInMs,roughEstimateOfLCP:c.timing,optimisticLCP:c.optimisticEstimate.timeInMs,pessimisticLCP:c.pessimisticEstimate.timeInMs};return{score:NI.computeLogNormalScore({p10:3651,median:1e4},l.roughEstimateOfTTI),numericValue:l.roughEstimateOfTTI,numericUnit:"millisecond",displayValue:jI(LI.UIStrings.ms,{timeInMs:l.roughEstimateOfTTI}),details:{type:"debugdata",items:[l]}}}},$I={exports:{}};const qI=kc,zI=oi,VI=Q_.exports,WI=/^(optional)$/,GI=Lo,HI={title:"Fonts with `font-display: optional` are preloaded",failureTitle:"Fonts with `font-display: optional` are not preloaded",description:"Preload `optional` fonts so first-time visitors may use them. [Learn more](https://web.dev/preload-optional-fonts/)"
993
+ },YI=zI.createMessageInstanceIdFn("lighthouse-core/audits/preload-fonts.js",HI);class PreloadFontsAudit extends qI{static get meta(){return{id:"preload-fonts",title:YI(HI.title),failureTitle:YI(HI.failureTitle),description:YI(HI.description),requiredArtifacts:["devtoolsLogs","URL","CSSUsage"]}}static getURLsAttemptedToPreload(e){const t=e.filter((e=>"Font"===e.resourceType)).filter((e=>e.isLinkPreload)).map((e=>e.url));return new Set(t)}static async audit_(e,t){const r=e.devtoolsLogs[this.DEFAULT_PASS],a=await GI.request(r,t),n=VI.findFontDisplayDeclarations(e,WI).passingURLs,i=PreloadFontsAudit.getURLsAttemptedToPreload(a),o=Array.from(n).filter((e=>!i.has(e))).map((e=>({url:e}))),s=[{key:"url",itemType:"url",text:YI(zI.UIStrings.columnURL)}];return{score:o.length>0?0:1,details:qI.makeTableDetails(s,o),notApplicable:0===n.size}}static async audit(){return{score:1,notApplicable:!0}}}$I.exports=PreloadFontsAudit,$I.exports.UIStrings=HI;var KI={exports:{}}
994
+ ;const JI=kc,XI=oi,ZI=Ki,QI=HT,eN=vk,tN=Dl,rN=Ib,aN={title:"Preload Largest Contentful Paint image",description:"Preload the image used by the LCP element in order to improve your LCP time. [Learn more](https://web.dev/optimize-lcp/#preload-important-resources)."},nN=XI.createMessageInstanceIdFn("lighthouse-core/audits/preload-lcp-image.js",aN);class PreloadLCPImageAudit extends JI{static get meta(){return{id:"preload-lcp-image",title:nN(aN.title),description:nN(aN.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","GatherContext","URL","TraceElements","ImageElements"],scoreDisplayMode:JI.SCORING_MODES.NUMERIC}}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!ZI.isNonNetworkRequest(e)&&(!(r.length<=a)&&e.frameId===t.frameId))}static findLCPNode(e,t){let r,a;return e.traverse(((e,n)=>{"network"===e.type&&e.record.url===t&&(r=e,a=n.slice(1).filter((e=>"network"===e.type)))})),{lcpNode:r,path:a}}
995
+ static getLCPNodeToPreload(e,t,r,a){if(!r)return{};const n=a.find((e=>e.node.devtoolsNodePath===r.node.devtoolsNodePath));if(!n)return{};const i=n.src,{lcpNode:o,path:s}=PreloadLCPImageAudit.findLCPNode(t,i);if(!o||!s)return{};return{lcpNodeToPreload:PreloadLCPImageAudit.shouldPreloadRequest(o.record,e,s)?o:void 0,initiatorPath:[{url:o.record.url,initiatorType:o.initiatorType},...s.map((e=>({url:e.record.url,initiatorType:e.initiatorType})))]}}static computeWasteWithGraph(e,t,r,a){if(!e||!t)return{wastedMs:0,results:[]};const n=r.cloneWithRelationships(),i=new Set;for(const e of t.getDependencies())i.add(e.id);let o=null,s=null;for(const{node:e}of n.traverseGenerator())"network"===e.type&&(e.isMainDocument()?s=e:e.id===t.id&&(o=e));if(!s)throw new Error("Could not find main document node");if(!o)throw new Error("Could not find the LCP node");o.removeAllDependencies(),o.addDependency(s);const c=a.simulate(r,{flexibleOrdering:!0}),l=a.simulate(n,{flexibleOrdering:!0
996
+ }),u=c.nodeTimings.get(t);if(!u)throw new Error("Impossible - node timings should never be undefined");const d=l.nodeTimings.get(o);if(!d)throw new Error("Impossible - node timings should never be undefined");const m=Array.from(l.nodeTimings.keys()).reduce(((e,t)=>e.set(t.id,t)),new Map);let p=0;for(const e of Array.from(i)){const t=m.get(e);if(!t)throw new Error("Impossible - node should never be undefined");const r=l.nodeTimings.get(t)?.endTime||0;p=Math.max(p,r)}const h=u.endTime-Math.max(d.endTime,p);return{wastedMs:h,results:[{node:JI.makeNodeItem(e.node),url:t.record.url,wastedMs:h}]}}static async audit(e,t){const r=e.GatherContext,a=e.traces[PreloadLCPImageAudit.DEFAULT_PASS],n=e.devtoolsLogs[PreloadLCPImageAudit.DEFAULT_PASS],i=e.URL,o={trace:a,devtoolsLog:n,gatherContext:r,settings:t.settings},s=e.TraceElements.find((e=>"largest-contentful-paint"===e.traceEventType)),[c,l,u]=await Promise.all([QI.request({devtoolsLog:n,URL:i},t),eN.request(o,t),tN.request({devtoolsLog:n,
997
+ settings:t.settings},t)]),d=l.pessimisticGraph,{lcpNodeToPreload:m,initiatorPath:p}=PreloadLCPImageAudit.getLCPNodeToPreload(c,d,s,e.ImageElements),{results:h,wastedMs:f}=PreloadLCPImageAudit.computeWasteWithGraph(s,m,d,u),y=[{key:"node",valueType:"node",label:""},{key:"url",valueType:"url",label:nN(XI.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:nN(XI.UIStrings.columnWastedMs)}],v=JI.makeOpportunityDetails(y,h,f);return p&&(v.debugData={type:"debugdata",initiatorPath:p,pathLength:p.length}),{score:rN.scoreForWastedMs(f),numericValue:f,numericUnit:"millisecond",displayValue:f?nN(XI.UIStrings.displayValueMsSavings,{wastedMs:f}):"",details:v}}}KI.exports=PreloadLCPImageAudit,KI.exports.UIStrings=aN;var iN={exports:{}};const oN=kc,sN=Ib,cN=oi,lN=Yp,uN=Lo,dN=HT,mN=Tb,pN={title:"Avoid multiple page redirects",description:"Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects/)."
998
+ },hN=cN.createMessageInstanceIdFn("lighthouse-core/audits/redirects.js",pN);class Redirects extends oN{static get meta(){return{id:"redirects",title:hN(pN.title),description:hN(pN.description),scoreDisplayMode:oN.SCORING_MODES.NUMERIC,supportedModes:["navigation"],requiredArtifacts:["URL","GatherContext","devtoolsLogs","traces"]}}static getDocumentRequestChain(e,t,r){const a=[];for(const e of r.processEvents){if("navigationStart"!==e.name)continue;const r=e.args.data||{};if(!r.documentLoaderURL||!r.isLoadingMainFrame)continue;let n=t.find((e=>e.url===r.documentLoaderURL));for(;n;)a.push(n),n=n.redirectDestination}return a.length?a:(e.redirects||[]).concat(e)}static async audit(e,t){const r=t.settings,a=e.traces[oN.DEFAULT_PASS],n=e.devtoolsLogs[oN.DEFAULT_PASS],i=e.GatherContext,o=await lN.request(a,t),s=await uN.request(n,t),c=await dN.request({URL:e.URL,devtoolsLog:n},t),l={trace:a,devtoolsLog:n,gatherContext:i,settings:r},u=await mN.request(l,t),d=new Map
999
+ ;for(const[e,t]of u.pessimisticEstimate.nodeTimings.entries())"network"===e.type&&d.set(e.record.url,t);const m=Redirects.getDocumentRequestChain(c,s,o);let p=0;const h=[];for(let e=0;e<m.length&&!(m.length<2);e++){const t=m[e],a=m[e+1]||t,n=d.get(t.url),i=d.get(a.url);if(!n||!i)throw new Error("Could not find redirects in graph");const o=i.startTime-n.startTime,s=a.startTime-t.startTime,c="simulate"===r.throttlingMethod?o:1e3*s;p+=c,h.push({url:t.url,wastedMs:c})}const f=[{key:"url",valueType:"url",label:hN(cN.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:hN(cN.UIStrings.columnTimeSpent)}],y=oN.makeOpportunityDetails(f,h,p);return{score:m.length<=2?1:sN.scoreForWastedMs(p),numericValue:p,numericUnit:"millisecond",displayValue:p?hN(cN.UIStrings.displayValueMsSavings,{wastedMs:p}):"",details:y}}}iN.exports=Redirects,iN.exports.UIStrings=pN;var gN={exports:{}};const fN=kc,yN=xI,vN=oi,bN={title:"Keep request counts low and transfer sizes small",
1000
+ description:"To set budgets for the quantity and size of page resources, add a budget.json file. [Learn more](https://web.dev/use-lighthouse-for-performance-budgets/).",displayValue:"{requestCount, plural, =1 {1 request • {byteCount, number, bytes} KiB} other {# requests • {byteCount, number, bytes} KiB}}"},wN=vN.createMessageInstanceIdFn("lighthouse-core/audits/resource-summary.js",bN);gN.exports=class ResourceSummary extends fN{static get meta(){return{id:"resource-summary",title:wN(bN.title),description:wN(bN.description),scoreDisplayMode:fN.SCORING_MODES.INFORMATIVE,requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[fN.DEFAULT_PASS],a=await yN.request({devtoolsLog:r,URL:e.URL,budgets:t.settings.budgets},t),n=[{key:"label",itemType:"text",text:wN(vN.UIStrings.columnResourceType)},{key:"requestCount",itemType:"numeric",text:wN(vN.UIStrings.columnRequests)},{key:"transferSize",itemType:"bytes",text:wN(vN.UIStrings.columnTransferSize)}],i={
1001
+ total:wN(vN.UIStrings.totalResourceType),document:wN(vN.UIStrings.documentResourceType),script:wN(vN.UIStrings.scriptResourceType),stylesheet:wN(vN.UIStrings.stylesheetResourceType),image:wN(vN.UIStrings.imageResourceType),media:wN(vN.UIStrings.mediaResourceType),font:wN(vN.UIStrings.fontResourceType),other:wN(vN.UIStrings.otherResourceType),"third-party":wN(vN.UIStrings.thirdPartyResourceType)},o=Object.keys(a).map((e=>({resourceType:e,label:i[e],requestCount:a[e].count,transferSize:a[e].transferSize}))),s=o.find((e=>"third-party"===e.resourceType))||[],c=o.filter((e=>"third-party"!==e.resourceType)).sort(((e,t)=>t.transferSize-e.transferSize)).concat(s);return{details:fN.makeTableDetails(n,c),score:1,displayValue:wN(bN.displayValue,{requestCount:a.total.count,byteCount:a.total.transferSize})}}},gN.exports.UIStrings=bN;var SN={exports:{}};!function(e){function JPEGEncoder(e){
1002
1002
  var t,r,a,n,i,o=Math.floor,s=new Array(64),c=new Array(64),l=new Array(64),u=new Array(64),d=new Array(65535),m=new Array(65535),p=new Array(64),h=new Array(64),f=[],y=0,v=7,b=new Array(64),w=new Array(64),S=new Array(64),T=new Array(256),E=new Array(2048),x=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],_=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],A=[0,1,2,3,4,5,6,7,8,9,10,11],R=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],k=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],D=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],C=[0,1,2,3,4,5,6,7,8,9,10,11],I=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],N=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250]
1003
1003
  ;function computeHuffmanTbl(e,t){for(var r=0,a=0,n=new Array,i=1;i<=16;i++){for(var o=1;o<=e[i];o++)n[t[a]]=[],n[t[a]][0]=r,n[t[a]][1]=i,a++,r++;r*=2}return n}function writeBits(e){for(var t=e[0],r=e[1]-1;r>=0;)t&1<<r&&(y|=1<<v),r--,--v<0&&(255==y?(writeByte(255),writeByte(0)):writeByte(y),v=7,y=0)}function writeByte(e){f.push(e)}function writeWord(e){writeByte(e>>8&255),writeByte(255&e)}function processDU(e,t,r,a,n){for(var i,o=n[0],s=n[240],c=function fDCTQuant(e,t){var r,a,n,i,o,s,c,l,u,d,m=0;for(u=0;u<8;++u){r=e[m],a=e[m+1],n=e[m+2],i=e[m+3],o=e[m+4],s=e[m+5],c=e[m+6];var h=r+(l=e[m+7]),f=r-l,y=a+c,v=a-c,b=n+s,w=n-s,S=i+o,T=i-o,E=h+S,x=h-S,_=y+b,A=y-b;e[m]=E+_,e[m+4]=E-_;var R=.707106781*(A+x);e[m+2]=x+R,e[m+6]=x-R;var k=.382683433*((E=T+w)-(A=v+f)),D=.5411961*E+k,C=1.306562965*A+k,I=.707106781*(_=w+v),N=f+I,L=f-I;e[m+5]=L+D,e[m+3]=L-D,e[m+1]=N+C,e[m+7]=N-C,m+=8}for(m=0,u=0;u<8;++u){r=e[m],a=e[m+8],n=e[m+16],i=e[m+24],o=e[m+32],s=e[m+40],c=e[m+48]
1004
1004
  ;var M=r+(l=e[m+56]),P=r-l,O=a+c,F=a-c,U=n+s,j=n-s,B=i+o,$=i-o,q=M+B,z=M-B,V=O+U,W=O-U;e[m]=q+V,e[m+32]=q-V;var G=.707106781*(W+z);e[m+16]=z+G,e[m+48]=z-G;var H=.382683433*((q=$+j)-(W=F+P)),Y=.5411961*q+H,K=1.306562965*W+H,J=.707106781*(V=j+F),X=P+J,Z=P-J;e[m+40]=Z+Y,e[m+24]=Z-Y,e[m+8]=X+K,e[m+56]=X-K,m++}for(u=0;u<64;++u)d=e[u]*t[u],p[u]=d>0?d+.5|0:d-.5|0;return p}(e,t),l=0;l<64;++l)h[x[l]]=c[l];var u=h[0]-r;r=h[0],0==u?writeBits(a[0]):(writeBits(a[m[i=32767+u]]),writeBits(d[i]));for(var f=63;f>0&&0==h[f];f--);if(0==f)return writeBits(o),r;for(var y,v=1;v<=f;){for(var b=v;0==h[v]&&v<=f;++v);var w=v-b;if(w>=16){y=w>>4;for(var S=1;S<=y;++S)writeBits(s);w&=15}i=32767+h[v],writeBits(n[(w<<4)+m[i]]),writeBits(d[i]),v++}return 63!=f&&writeBits(o),r}function setQuality(e){if(e<=0&&(e=1),e>100&&(e=100),i!=e){(function initQuantTables(e){
1005
1005
  for(var t=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],r=0;r<64;r++){var a=o((t[r]*e+50)/100);a<1?a=1:a>255&&(a=255),s[x[r]]=a}for(var n=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],i=0;i<64;i++){var d=o((n[i]*e+50)/100);d<1?d=1:d>255&&(d=255),c[x[i]]=d}for(var m=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],p=0,h=0;h<8;h++)for(var f=0;f<8;f++)l[p]=1/(s[x[p]]*m[h]*m[f]*8),u[p]=1/(c[x[p]]*m[h]*m[f]*8),p++})(e<50?Math.floor(5e3/e):Math.floor(200-2*e)),i=e}}this.encode=function(e,i){(new Date).getTime(),i&&setQuality(i),f=new Array,y=0,v=7,writeWord(65496),function writeAPP0(){writeWord(65504),writeWord(16),writeByte(74),writeByte(70),writeByte(73),
1006
1006
  writeByte(70),writeByte(0),writeByte(1),writeByte(1),writeByte(0),writeWord(1),writeWord(1),writeByte(0),writeByte(0)}(),function writeAPP1(e){if(e){writeWord(65505),69===e[0]&&120===e[1]&&105===e[2]&&102===e[3]?writeWord(e.length+2):(writeWord(e.length+5+2),writeByte(69),writeByte(120),writeByte(105),writeByte(102),writeByte(0));for(var t=0;t<e.length;t++)writeByte(e[t])}}(e.exifBuffer),function writeDQT(){writeWord(65499),writeWord(132),writeByte(0);for(var e=0;e<64;e++)writeByte(s[e]);writeByte(1);for(var t=0;t<64;t++)writeByte(c[t])}(),function writeSOF0(e,t){writeWord(65472),writeWord(17),writeByte(8),writeWord(t),writeWord(e),writeByte(3),writeByte(1),writeByte(17),writeByte(0),writeByte(2),writeByte(17),writeByte(1),writeByte(3),writeByte(17),writeByte(1)}(e.width,e.height),function writeDHT(){writeWord(65476),writeWord(418),writeByte(0);for(var e=0;e<16;e++)writeByte(_[e+1]);for(var t=0;t<=11;t++)writeByte(A[t]);writeByte(16);for(var r=0;r<16;r++)writeByte(R[r+1])
1007
1007
  ;for(var a=0;a<=161;a++)writeByte(k[a]);writeByte(1);for(var n=0;n<16;n++)writeByte(D[n+1]);for(var i=0;i<=11;i++)writeByte(C[i]);writeByte(17);for(var o=0;o<16;o++)writeByte(I[o+1]);for(var s=0;s<=161;s++)writeByte(N[s])}(),function writeSOS(){writeWord(65498),writeWord(12),writeByte(3),writeByte(1),writeByte(0),writeByte(2),writeByte(17),writeByte(3),writeByte(17),writeByte(0),writeByte(63),writeByte(0)}();var o=0,d=0,m=0;y=0,v=7,this.encode.displayName="_encode_";for(var p,h,T,x,L,M,P,O,F,U=e.data,j=e.width,B=e.height,$=4*j,q=0;q<B;){for(p=0;p<$;){for(M=L=$*q+p,P=-1,O=0,F=0;F<64;F++)M=L+(O=F>>3)*$+(P=4*(7&F)),q+O>=B&&(M-=$*(q+1+O-B)),p+P>=$&&(M-=p+P-$+4),h=U[M++],T=U[M++],x=U[M++],b[F]=(E[h]+E[T+256>>0]+E[x+512>>0]>>16)-128,w[F]=(E[h+768>>0]+E[T+1024>>0]+E[x+1280>>0]>>16)-128,S[F]=(E[h+1280>>0]+E[T+1536>>0]+E[x+1792>>0]>>16)-128;o=processDU(b,l,o,t,a),d=processDU(w,u,d,r,n),m=processDU(S,u,m,r,n),p+=32}q+=8}if(v>=0){var z=[];z[1]=v+1,z[0]=(1<<v+1)-1,writeBits(z)}
1008
- return writeWord(65497),Buffer$2.from(f)},function init(){(new Date).getTime(),e||(e=50),function initCharLookupTable(){for(var e=String.fromCharCode,t=0;t<256;t++)T[t]=e(t)}(),function initHuffmanTbl(){t=computeHuffmanTbl(_,A),r=computeHuffmanTbl(D,C),a=computeHuffmanTbl(R,k),n=computeHuffmanTbl(I,N)}(),function initCategoryNumber(){for(var e=1,t=2,r=1;r<=15;r++){for(var a=e;a<t;a++)m[32767+a]=r,d[32767+a]=[],d[32767+a][1]=r,d[32767+a][0]=a;for(var n=-(t-1);n<=-e;n++)m[32767+n]=r,d[32767+n]=[],d[32767+n][1]=r,d[32767+n][0]=t-1+n;e<<=1,t<<=1}}(),function initRGBYUVTable(){for(var e=0;e<256;e++)E[e]=19595*e,E[e+256>>0]=38470*e,E[e+512>>0]=7471*e+32768,E[e+768>>0]=-11059*e,E[e+1024>>0]=-21709*e,E[e+1280>>0]=32768*e+8421375,E[e+1536>>0]=-27439*e,E[e+1792>>0]=-5329*e}(),setQuality(e),(new Date).getTime()}()}e.exports=function encode(e,t){void 0===t&&(t=50);return{data:new JPEGEncoder(t).encode(e,t),width:e.width,height:e.height}}}(wN);var SN={exports:{}};!function(e){
1008
+ return writeWord(65497),Buffer$2.from(f)},function init(){(new Date).getTime(),e||(e=50),function initCharLookupTable(){for(var e=String.fromCharCode,t=0;t<256;t++)T[t]=e(t)}(),function initHuffmanTbl(){t=computeHuffmanTbl(_,A),r=computeHuffmanTbl(D,C),a=computeHuffmanTbl(R,k),n=computeHuffmanTbl(I,N)}(),function initCategoryNumber(){for(var e=1,t=2,r=1;r<=15;r++){for(var a=e;a<t;a++)m[32767+a]=r,d[32767+a]=[],d[32767+a][1]=r,d[32767+a][0]=a;for(var n=-(t-1);n<=-e;n++)m[32767+n]=r,d[32767+n]=[],d[32767+n][1]=r,d[32767+n][0]=t-1+n;e<<=1,t<<=1}}(),function initRGBYUVTable(){for(var e=0;e<256;e++)E[e]=19595*e,E[e+256>>0]=38470*e,E[e+512>>0]=7471*e+32768,E[e+768>>0]=-11059*e,E[e+1024>>0]=-21709*e,E[e+1280>>0]=32768*e+8421375,E[e+1536>>0]=-27439*e,E[e+1792>>0]=-5329*e}(),setQuality(e),(new Date).getTime()}()}e.exports=function encode(e,t){void 0===t&&(t=50);return{data:new JPEGEncoder(t).encode(e,t),width:e.width,height:e.height}}}(SN);var TN={exports:{}};!function(e){
1009
1009
  var t=function jpegImage(){var e=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),t=4017,r=799,a=3406,n=2276,i=1567,o=3784,s=5793,c=2896;function constructor(){}function buildHuffmanTable(e,t){for(var r,a,n=0,i=[],o=16;o>0&&!e[o-1];)o--;i.push({children:[],index:0});var s,c=i[0];for(r=0;r<o;r++){for(a=0;a<e[r];a++){for((c=i.pop()).children[c.index]=t[n];c.index>0;){if(0===i.length)throw new Error("Could not recreate Huffman Table");c=i.pop()}for(c.index++,i.push(c);i.length<=r;)i.push(s={children:[],index:0}),c.children[c.index]=s.children,c=s;n++}r+1<o&&(i.push(s={children:[],index:0}),c.children[c.index]=s.children,c=s)}return i[0].children}function decodeScan(t,r,a,n,i,o,s,c,l,u){a.precision,a.samplesPerLine,a.scanLines;var d=a.mcusPerLine,m=a.progressive;a.maxH,a.maxV;var p=r,h=0,f=0;function readBit(){if(f>0)return f--,h>>f&1
1010
1010
  ;if(255==(h=t[r++])){var e=t[r++];if(e)throw new Error("unexpected marker: "+(h<<8|e).toString(16))}return f=7,h>>>7}function decodeHuffman(e){for(var t,r=e;null!==(t=readBit());){if("number"==typeof(r=r[t]))return r;if("object"!=typeof r)throw new Error("invalid huffman sequence")}return null}function receive(e){for(var t=0;e>0;){var r=readBit();if(null===r)return;t=t<<1|r,e--}return t}function receiveAndExtend(e){var t=receive(e);return t>=1<<e-1?t:t+(-1<<e)+1}var y=0;var v,b=0;function decodeMcu(e,t,r,a,n){var i=r%d,o=(r/d|0)*e.v+a,s=i*e.h+n;void 0===e.blocks[o]&&u.tolerantDecoding||t(e,e.blocks[o][s])}function decodeBlock(e,t,r){var a=r/e.blocksPerLine|0,n=r%e.blocksPerLine;void 0===e.blocks[a]&&u.tolerantDecoding||t(e,e.blocks[a][n])}var w,S,T,E,x,_,A=n.length;_=m?0===o?0===c?function decodeDCFirst(e,t){var r=decodeHuffman(e.huffmanTableDC),a=0===r?0:receiveAndExtend(r)<<l;t[0]=e.pred+=a}:function decodeDCSuccessive(e,t){t[0]|=readBit()<<l}:0===c?function decodeACFirst(t,r){
1011
1011
  if(y>0)y--;else for(var a=o,n=s;a<=n;){var i=decodeHuffman(t.huffmanTableAC),c=15&i,u=i>>4;if(0!==c)r[e[a+=u]]=receiveAndExtend(c)*(1<<l),a++;else{if(u<15){y=receive(u)+(1<<u)-1;break}a+=16}}}:function decodeACSuccessive(t,r){for(var a=o,n=s,i=0;a<=n;){var c=e[a],u=r[c]<0?-1:1;switch(b){case 0:var d=decodeHuffman(t.huffmanTableAC),m=15&d;if(i=d>>4,0===m)i<15?(y=receive(i)+(1<<i),b=4):(i=16,b=1);else{if(1!==m)throw new Error("invalid ACn encoding");v=receiveAndExtend(m),b=i?2:3}continue;case 1:case 2:r[c]?r[c]+=(readBit()<<l)*u:0==--i&&(b=2==b?3:0);break;case 3:r[c]?r[c]+=(readBit()<<l)*u:(r[c]=v<<l,b=0);break;case 4:r[c]&&(r[c]+=(readBit()<<l)*u)}a++}4===b&&0==--y&&(b=0)}:function decodeBaseline(t,r){var a=decodeHuffman(t.huffmanTableDC),n=0===a?0:receiveAndExtend(a);r[0]=t.pred+=n;for(var i=1;i<64;){var o=decodeHuffman(t.huffmanTableAC),s=15&o,c=o>>4;if(0!==s)r[e[i+=c]]=receiveAndExtend(s),i++;else{if(c<15)break;i+=16}}};var R,k,D,C,I=0
@@ -1019,213 +1019,213 @@ n.samplesPerLine=readUint16(),n.components={},n.componentsOrder=[];var w=n.scanL
1019
1019
  var r,a,n,i,o,s,c,l,u,d,m,p,h,f,y,v,b,w,S,T,E,x=this.width/e,_=this.height/t,A=0,R=e*t*this.components.length;requestMemoryAllocation(R);var k=new Uint8Array(R);switch(this.components.length){case 1:for(r=this.components[0],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],u=0;u<e;u++)m=o[0|u*r.scaleX*x],k[A++]=m;break;case 2:for(r=this.components[0],a=this.components[1],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],u=0;u<e;u++)m=o[0|u*r.scaleX*x],k[A++]=m,m=s[0|u*a.scaleX*x],k[A++]=m;break;case 3:for(E=!0,this.adobe&&this.adobe.transformCode?E=!0:void 0!==this.opts.colorTransform&&(E=!!this.opts.colorTransform),r=this.components[0],a=this.components[1],n=this.components[2],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],c=n.lines[0|d*n.scaleY*_],u=0;u<e;u++)E?(m=o[0|u*r.scaleX*x],p=s[0|u*a.scaleX*x],w=clampTo8bit(m+1.402*((h=c[0|u*n.scaleX*x])-128)),S=clampTo8bit(m-.3441363*(p-128)-.71413636*(h-128)),
1020
1020
  T=clampTo8bit(m+1.772*(p-128))):(w=o[0|u*r.scaleX*x],S=s[0|u*a.scaleX*x],T=c[0|u*n.scaleX*x]),k[A++]=w,k[A++]=S,k[A++]=T;break;case 4:if(!this.adobe)throw new Error("Unsupported color mode (4 components)");for(E=!1,this.adobe&&this.adobe.transformCode?E=!0:void 0!==this.opts.colorTransform&&(E=!!this.opts.colorTransform),r=this.components[0],a=this.components[1],n=this.components[2],i=this.components[3],d=0;d<t;d++)for(o=r.lines[0|d*r.scaleY*_],s=a.lines[0|d*a.scaleY*_],c=n.lines[0|d*n.scaleY*_],l=i.lines[0|d*i.scaleY*_],u=0;u<e;u++)E?(m=o[0|u*r.scaleX*x],p=s[0|u*a.scaleX*x],h=c[0|u*n.scaleX*x],f=l[0|u*i.scaleX*x],y=255-clampTo8bit(m+1.402*(h-128)),v=255-clampTo8bit(m-.3441363*(p-128)-.71413636*(h-128)),b=255-clampTo8bit(m+1.772*(p-128))):(y=o[0|u*r.scaleX*x],v=s[0|u*a.scaleX*x],b=c[0|u*n.scaleX*x],f=l[0|u*i.scaleX*x]),k[A++]=255-y,k[A++]=255-v,k[A++]=255-b,k[A++]=255-f;break;default:throw new Error("Unsupported color mode")}return k},copyToImageData:function copyToImageData(e,t){
1021
1021
  var r,a,n,i,o,s,c,l,u,d=e.width,m=e.height,p=e.data,h=this.getData(d,m),f=0,y=0;switch(this.components.length){case 1:for(a=0;a<m;a++)for(r=0;r<d;r++)n=h[f++],p[y++]=n,p[y++]=n,p[y++]=n,t&&(p[y++]=255);break;case 3:for(a=0;a<m;a++)for(r=0;r<d;r++)c=h[f++],l=h[f++],u=h[f++],p[y++]=c,p[y++]=l,p[y++]=u,t&&(p[y++]=255);break;case 4:for(a=0;a<m;a++)for(r=0;r<d;r++)o=h[f++],s=h[f++],n=h[f++],c=255-clampTo8bit(o*(1-(i=h[f++])/255)+i),l=255-clampTo8bit(s*(1-i/255)+i),u=255-clampTo8bit(n*(1-i/255)+i),p[y++]=c,p[y++]=l,p[y++]=u,t&&(p[y++]=255);break;default:throw new Error("Unsupported color mode")}}};var l=0,u=0;function requestMemoryAllocation(e=0){var t=l+e;if(t>u){var r=Math.ceil((t-u)/1024/1024);throw new Error(`maxMemoryUsageInMB limit exceeded by at least ${r}MB`)}l=t}return constructor.resetMaxMemoryUsage=function(e){l=0,u=e},constructor.getBytesAllocated=function(){return l},constructor.requestMemoryAllocation=requestMemoryAllocation,constructor}();e.exports=function decode(e,r={}){
1022
- var a={colorTransform:void 0,useTArray:!1,formatAsRGBA:!0,tolerantDecoding:!0,maxResolutionInMP:100,maxMemoryUsageInMB:512,...r},n=new Uint8Array(e),i=new t;i.opts=a,t.resetMaxMemoryUsage(1024*a.maxMemoryUsageInMB*1024),i.parse(n);var o=a.formatAsRGBA?4:3,s=i.width*i.height*o;try{t.requestMemoryAllocation(s);var c={width:i.width,height:i.height,exifBuffer:i.exifBuffer,data:a.useTArray?new Uint8Array(s):Buffer$2.alloc(s)};i.comments.length>0&&(c.comments=i.comments)}catch(e){throw e instanceof RangeError?new Error("Could not allocate enough memory for the image. Required: "+s):e}return i.copyToImageData(c,a.formatAsRGBA),c}}(SN);var TN={encode:wN.exports,decode:SN.exports};const EN=kc,xN=vi.exports,_N=TN,AN=ik;class ScreenshotThumbnails extends EN{static get meta(){return{id:"screenshot-thumbnails",scoreDisplayMode:EN.SCORING_MODES.INFORMATIVE,title:"Screenshot Thumbnails",description:"This is what the load of your site looked like.",requiredArtifacts:["traces","GatherContext"]}}
1023
- static scaleImageToThumbnail(e){const t=120,r=e.width/t,a=Math.floor(e.height/r),n=new Uint8Array(t*a*4);for(let i=0;i<t;i++)for(let o=0;o<a;o++){const a=Math.floor(i*r),s=4*(Math.floor(o*r)*e.width+a),c=4*(o*t+i);n[c]=e.data[s],n[c+1]=e.data[s+1],n[c+2]=e.data[s+2],n[c+3]=e.data[s+3]}return{width:t,height:a,data:n}}static async _audit(e,t){const r=e.traces[EN.DEFAULT_PASS],a=new Map,n=await AN.request(r,t),i=t.options.minimumTimelineDuration||3e3,o=[],s=n.frames.filter((e=>!e.isProgressInterpolated())),c=n.complete||Math.max(...n.frames.map((e=>e.getTimeStamp()-n.beginning))),l=Math.max(c,i);if(!s.length||!Number.isFinite(l))throw new xN(xN.errors.INVALID_SPEEDLINE);for(let e=1;e<=10;e++){const t=n.beginning+l*e/10;let r,i=null;10===e?i=s[s.length-1]:s.forEach((e=>{e.getTimeStamp()<=t&&(i=e)}));const c=a.get(i);if(c)r=c;else{const e=i.getParsedImage(),t=ScreenshotThumbnails.scaleImageToThumbnail(e);r=_N.encode(t,90).data.toString("base64"),a.set(i,r)}o.push({
1024
- timing:Math.round(t-n.beginning),timestamp:1e3*t,data:`data:image/jpeg;base64,${r}`})}return{score:1,details:{type:"filmstrip",scale:l,items:o}}}static async audit(e,t){try{return await this._audit(e,t)}catch(t){if(new Set([xN.errors.NO_SCREENSHOTS.code,xN.errors.SPEEDINDEX_OF_ZERO.code,xN.errors.NO_SPEEDLINE_FRAMES.code,xN.errors.INVALID_SPEEDLINE.code]).has(t.code)&&"timespan"===e.GatherContext.gatherMode)return{notApplicable:!0,score:1};throw t}}}var RN=ScreenshotThumbnails;const kN=kc,DN=jb,CN=zS,IN=qb;class ScriptTreemapDataAudit extends kN{static get meta(){return{id:"script-treemap-data",scoreDisplayMode:kN.SCORING_MODES.INFORMATIVE,title:"Script Treemap Data",description:"Used for treemap app",requiredArtifacts:["traces","devtoolsLogs","SourceMaps","ScriptElements","JsUsage","URL"]}}static makeScriptNode(e,t,r){function newNode(e){return{name:e,resourceBytes:0}}const a=newNode(t);function addAllNodesInSourcePath(e,r){let n=a;a.resourceBytes+=r.resourceBytes,
1022
+ var a={colorTransform:void 0,useTArray:!1,formatAsRGBA:!0,tolerantDecoding:!0,maxResolutionInMP:100,maxMemoryUsageInMB:512,...r},n=new Uint8Array(e),i=new t;i.opts=a,t.resetMaxMemoryUsage(1024*a.maxMemoryUsageInMB*1024),i.parse(n);var o=a.formatAsRGBA?4:3,s=i.width*i.height*o;try{t.requestMemoryAllocation(s);var c={width:i.width,height:i.height,exifBuffer:i.exifBuffer,data:a.useTArray?new Uint8Array(s):Buffer$2.alloc(s)};i.comments.length>0&&(c.comments=i.comments)}catch(e){throw e instanceof RangeError?new Error("Could not allocate enough memory for the image. Required: "+s):e}return i.copyToImageData(c,a.formatAsRGBA),c}}(TN);var EN={encode:SN.exports,decode:TN.exports};const xN=kc,_N=vi.exports,AN=EN,RN=ik;class ScreenshotThumbnails extends xN{static get meta(){return{id:"screenshot-thumbnails",scoreDisplayMode:xN.SCORING_MODES.INFORMATIVE,title:"Screenshot Thumbnails",description:"This is what the load of your site looked like.",requiredArtifacts:["traces","GatherContext"]}}
1023
+ static scaleImageToThumbnail(e){const t=120,r=e.width/t,a=Math.floor(e.height/r),n=new Uint8Array(t*a*4);for(let i=0;i<t;i++)for(let o=0;o<a;o++){const a=Math.floor(i*r),s=4*(Math.floor(o*r)*e.width+a),c=4*(o*t+i);n[c]=e.data[s],n[c+1]=e.data[s+1],n[c+2]=e.data[s+2],n[c+3]=e.data[s+3]}return{width:t,height:a,data:n}}static async _audit(e,t){const r=e.traces[xN.DEFAULT_PASS],a=new Map,n=await RN.request(r,t),i=t.options.minimumTimelineDuration||3e3,o=[],s=n.frames.filter((e=>!e.isProgressInterpolated())),c=n.complete||Math.max(...n.frames.map((e=>e.getTimeStamp()-n.beginning))),l=Math.max(c,i);if(!s.length||!Number.isFinite(l))throw new _N(_N.errors.INVALID_SPEEDLINE);for(let e=1;e<=10;e++){const t=n.beginning+l*e/10;let r,i=null;10===e?i=s[s.length-1]:s.forEach((e=>{e.getTimeStamp()<=t&&(i=e)}));const c=a.get(i);if(c)r=c;else{const e=i.getParsedImage(),t=ScreenshotThumbnails.scaleImageToThumbnail(e);r=AN.encode(t,90).data.toString("base64"),a.set(i,r)}o.push({
1024
+ timing:Math.round(t-n.beginning),timestamp:1e3*t,data:`data:image/jpeg;base64,${r}`})}return{score:1,details:{type:"filmstrip",scale:l,items:o}}}static async audit(e,t){try{return await this._audit(e,t)}catch(t){if(new Set([_N.errors.NO_SCREENSHOTS.code,_N.errors.SPEEDINDEX_OF_ZERO.code,_N.errors.NO_SPEEDLINE_FRAMES.code,_N.errors.INVALID_SPEEDLINE.code]).has(t.code)&&"timespan"===e.GatherContext.gatherMode)return{notApplicable:!0,score:1};throw t}}}var kN=ScreenshotThumbnails;const DN=kc,CN=jb,IN=zS,NN=qb;class ScriptTreemapDataAudit extends DN{static get meta(){return{id:"script-treemap-data",scoreDisplayMode:DN.SCORING_MODES.INFORMATIVE,title:"Script Treemap Data",description:"Used for treemap app",requiredArtifacts:["traces","devtoolsLogs","SourceMaps","ScriptElements","JsUsage","URL"]}}static makeScriptNode(e,t,r){function newNode(e){return{name:e,resourceBytes:0}}const a=newNode(t);function addAllNodesInSourcePath(e,r){let n=a;a.resourceBytes+=r.resourceBytes,
1025
1025
  r.unusedBytes&&(a.unusedBytes=(a.unusedBytes||0)+r.unusedBytes);const i=e.replace(t,"").split(/\/+/);i.forEach(((e,t)=>{if(0===e.length)return;const a=t===i.length-1;let o=n.children&&n.children.find((t=>t.name===e));o||(o=newNode(e),n.children=n.children||[],n.children.push(o)),n=o,n.resourceBytes+=r.resourceBytes,r.unusedBytes&&(n.unusedBytes=(n.unusedBytes||0)+r.unusedBytes),a&&void 0!==r.duplicatedNormalizedModuleName&&(n.duplicatedNormalizedModuleName=r.duplicatedNormalizedModuleName)}))}for(const[e,t]of Object.entries(r))addAllNodesInSourcePath(e,t);if(function collapseAll(e){for(;e.children&&1===e.children.length;)e.name+="/"+e.children[0].name,e.children=e.children[0].children;if(e.children)for(const t of e.children)collapseAll(t)}(a),!a.name)return{...a,name:e,children:a.children};const n={...a};return n.name=e,n.children=[a],n}static async makeNodes(e,t){const r=[];let a=0;for(const t of e.ScriptElements)t.src||(a+=(t.content||"").length);if(a){const t=e.URL.finalUrl;r.push({
1026
- name:t,resourceBytes:a})}const n=await DN.request(e,t),i=await IN.request(e,t);for(const a of e.ScriptElements){if(!a.src)continue;const o=a.src,s=n.find((e=>a.src===e.script.src)),c=e.JsUsage[a.src]||[];if(!s&&0===c.length){r.push({name:o,resourceBytes:a.content?.length||0});continue}const l=await CN.request({url:a.src,scriptCoverages:c,bundle:s},t);let u;if(s&&!("errorMessage"in s.sizes)){const e={};for(const t of Object.keys(s.sizes.files)){const r={resourceBytes:s.sizes.files[t]};l.sourcesWastedBytes&&(r.unusedBytes=l.sourcesWastedBytes[t]);let a=t;s.rawMap.sourceRoot&&t.startsWith(s.rawMap.sourceRoot)&&(a=t.replace(s.rawMap.sourceRoot,""));const n=IN.normalizeSource(a);i.has(n)&&(r.duplicatedNormalizedModuleName=n),e[t]=r}if(s.sizes.unmappedBytes){const t={resourceBytes:s.sizes.unmappedBytes};l.sourcesWastedBytes&&(t.unusedBytes=l.sourcesWastedBytes["(unmapped)"]),e["(unmapped)"]=t}u=this.makeScriptNode(a.src,s.rawMap.sourceRoot||"",e)}else u={name:o,resourceBytes:l.totalBytes,
1027
- unusedBytes:l.wastedBytes};r.push(u)}return r}static async audit(e,t){return{score:1,details:{type:"treemap-data",nodes:await ScriptTreemapDataAudit.makeNodes(e,t)}}}}var NN=ScriptTreemapDataAudit,LN={exports:{}};const MN=kc,PN=ji,ON=HT,FN={title:"Document has a valid `rel=canonical`",failureTitle:"Document does not have a valid `rel=canonical`",description:"Canonical links suggest which URL to show in search results. [Learn more](https://web.dev/canonical/).",explanationConflict:"Multiple conflicting URLs ({urlList})",explanationInvalid:"Invalid URL ({url})",explanationRelative:"Is not an absolute URL ({url})",explanationPointsElsewhere:"Points to another `hreflang` location ({url})",explanationRoot:"Points to the domain's root URL (the homepage), instead of an equivalent page of content"},UN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/canonical.js",FN);class Canonical extends MN{static get meta(){return{id:"canonical",title:UN(FN.title),failureTitle:UN(FN.failureTitle),
1028
- description:UN(FN.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL","devtoolsLogs"]}}static collectCanonicalURLs(e){const t=new Set,r=new Set;let a,n;for(const i of e)if("body"!==i.source)if("canonical"===i.rel){if(!i.hrefRaw)continue;i.href?PN.isValid(i.hrefRaw)?t.add(i.href):n=i:a=i}else"alternate"===i.rel&&i.href&&i.hreflang&&r.add(i.href);return{uniqueCanonicalURLs:t,hreflangURLs:r,invalidCanonicalLink:a,relativeCanonicallink:n}}static findInvalidCanonicalURLReason(e){const{uniqueCanonicalURLs:t,invalidCanonicalLink:r,relativeCanonicallink:a}=e;if(r)return{score:0,explanation:UN(FN.explanationInvalid,{url:r.hrefRaw})};if(a)return{score:0,explanation:UN(FN.explanationRelative,{url:a.hrefRaw})};const n=Array.from(t);return 0===n.length?{score:1,notApplicable:!0}:n.length>1?{score:0,explanation:UN(FN.explanationConflict,{urlList:n.join(", ")})}:void 0}static findCommonCanonicalURLMistakes(e,t,r){const{hreflangURLs:a}=e
1029
- ;return a.has(r.href)&&a.has(t.href)&&r.href!==t.href?{score:0,explanation:UN(FN.explanationPointsElsewhere,{url:r.href})}:t.origin===r.origin&&"/"===t.pathname&&"/"!==r.pathname?{score:0,explanation:UN(FN.explanationRoot)}:void 0}static async audit(e,t){const r=e.devtoolsLogs[MN.DEFAULT_PASS],a=await ON.request({devtoolsLog:r,URL:e.URL},t),n=new PN(a.url),i=Canonical.collectCanonicalURLs(e.LinkElements),o=Canonical.findInvalidCanonicalURLReason(i);if(o)return o;const s=new PN([...i.uniqueCanonicalURLs][0]),c=Canonical.findCommonCanonicalURLMistakes(i,s,n);return c||{score:1}}}LN.exports=Canonical,LN.exports.UIStrings=FN;var jN={exports:{}};const BN=kc,$N={title:"Links are crawlable",failureTitle:"Links are not crawlable",
1030
- description:"Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn More](https://support.google.com/webmasters/answer/9112205)",columnFailingLink:"Uncrawlable Link"},qN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/crawlable-anchors.js",$N);jN.exports=class CrawlableAnchors extends BN{static get meta(){return{id:"crawlable-anchors",title:qN($N.title),failureTitle:qN($N.failureTitle),description:qN($N.description),requiredArtifacts:["AnchorElements","URL"]}}static audit({AnchorElements:e,URL:t}){const r=e.filter((({rawHref:e,name:r="",role:a=""})=>{if(e=e.replace(/\s/g,""),r=r.trim(),(a=a.trim()).length>0)return;if(e.startsWith("mailto:"))return;if(e.startsWith("file:"))return!0;if(!(r.length>0)){if(""===e)return!0;if(/javascript:void(\(|)0(\)|)/.test(e))return!0;try{new URL(e,t.finalUrl)}catch(e){return!0}}})),a=[{
1031
- key:"node",itemType:"node",text:qN($N.columnFailingLink)}],n=r.map((e=>({node:BN.makeNodeItem(e.node)})));return{score:Number(0===r.length),details:BN.makeTableDetails(a,n)}}},jN.exports.UIStrings=$N;var zN={exports:{}},VN={};function min(e,t){return null===e?t:null===t?e:Math.min(e,t)}function max(e,t){return null===e?t:null===t?e:Math.max(e,t)}function translateLengthProperty(e,t,r){return"number"==typeof e?e>=0?clamp(e,1,1e4):void 0:"device-width"===e?100*t:"device-height"===e?100*r:1}function translateZoomProperty(e){return"number"==typeof e?e>=0?clamp(e,.1,10):void 0:"yes"===e?1:"device-width"===e||"device-height"===e?10:"no"===e||null===e?.1:void 0}function clamp(e,t,r){return max(min(e,r),t)}VN.getRenderingDataFromViewport=function(e,t,r,a,n){var i=t/100,o=r/100,s=null,c=null,l=null,u=null,d=null,m=null,p=null,h=null,f=null,y=t,v=r,b="zoom";if(void 0!==e["maximum-scale"]&&(s=translateZoomProperty(e["maximum-scale"])),
1026
+ name:t,resourceBytes:a})}const n=await CN.request(e,t),i=await NN.request(e,t);for(const a of e.ScriptElements){if(!a.src)continue;const o=a.src,s=n.find((e=>a.src===e.script.src)),c=e.JsUsage[a.src]||[];if(!s&&0===c.length){r.push({name:o,resourceBytes:a.content?.length||0});continue}const l=await IN.request({url:a.src,scriptCoverages:c,bundle:s},t);let u;if(s&&!("errorMessage"in s.sizes)){const e={};for(const t of Object.keys(s.sizes.files)){const r={resourceBytes:s.sizes.files[t]};l.sourcesWastedBytes&&(r.unusedBytes=l.sourcesWastedBytes[t]);let a=t;s.rawMap.sourceRoot&&t.startsWith(s.rawMap.sourceRoot)&&(a=t.replace(s.rawMap.sourceRoot,""));const n=NN.normalizeSource(a);i.has(n)&&(r.duplicatedNormalizedModuleName=n),e[t]=r}if(s.sizes.unmappedBytes){const t={resourceBytes:s.sizes.unmappedBytes};l.sourcesWastedBytes&&(t.unusedBytes=l.sourcesWastedBytes["(unmapped)"]),e["(unmapped)"]=t}u=this.makeScriptNode(a.src,s.rawMap.sourceRoot||"",e)}else u={name:o,resourceBytes:l.totalBytes,
1027
+ unusedBytes:l.wastedBytes};r.push(u)}return r}static async audit(e,t){return{score:1,details:{type:"treemap-data",nodes:await ScriptTreemapDataAudit.makeNodes(e,t)}}}}var LN=ScriptTreemapDataAudit,MN={exports:{}};const PN=kc,ON=ji,FN=HT,UN={title:"Document has a valid `rel=canonical`",failureTitle:"Document does not have a valid `rel=canonical`",description:"Canonical links suggest which URL to show in search results. [Learn more](https://web.dev/canonical/).",explanationConflict:"Multiple conflicting URLs ({urlList})",explanationInvalid:"Invalid URL ({url})",explanationRelative:"Is not an absolute URL ({url})",explanationPointsElsewhere:"Points to another `hreflang` location ({url})",explanationRoot:"Points to the domain's root URL (the homepage), instead of an equivalent page of content"},jN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/canonical.js",UN);class Canonical extends PN{static get meta(){return{id:"canonical",title:jN(UN.title),failureTitle:jN(UN.failureTitle),
1028
+ description:jN(UN.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL","devtoolsLogs"]}}static collectCanonicalURLs(e){const t=new Set,r=new Set;let a,n;for(const i of e)if("body"!==i.source)if("canonical"===i.rel){if(!i.hrefRaw)continue;i.href?ON.isValid(i.hrefRaw)?t.add(i.href):n=i:a=i}else"alternate"===i.rel&&i.href&&i.hreflang&&r.add(i.href);return{uniqueCanonicalURLs:t,hreflangURLs:r,invalidCanonicalLink:a,relativeCanonicallink:n}}static findInvalidCanonicalURLReason(e){const{uniqueCanonicalURLs:t,invalidCanonicalLink:r,relativeCanonicallink:a}=e;if(r)return{score:0,explanation:jN(UN.explanationInvalid,{url:r.hrefRaw})};if(a)return{score:0,explanation:jN(UN.explanationRelative,{url:a.hrefRaw})};const n=Array.from(t);return 0===n.length?{score:1,notApplicable:!0}:n.length>1?{score:0,explanation:jN(UN.explanationConflict,{urlList:n.join(", ")})}:void 0}static findCommonCanonicalURLMistakes(e,t,r){const{hreflangURLs:a}=e
1029
+ ;return a.has(r.href)&&a.has(t.href)&&r.href!==t.href?{score:0,explanation:jN(UN.explanationPointsElsewhere,{url:r.href})}:t.origin===r.origin&&"/"===t.pathname&&"/"!==r.pathname?{score:0,explanation:jN(UN.explanationRoot)}:void 0}static async audit(e,t){const r=e.devtoolsLogs[PN.DEFAULT_PASS],a=await FN.request({devtoolsLog:r,URL:e.URL},t),n=new ON(a.url),i=Canonical.collectCanonicalURLs(e.LinkElements),o=Canonical.findInvalidCanonicalURLReason(i);if(o)return o;const s=new ON([...i.uniqueCanonicalURLs][0]),c=Canonical.findCommonCanonicalURLMistakes(i,s,n);return c||{score:1}}}MN.exports=Canonical,MN.exports.UIStrings=UN;var BN={exports:{}};const $N=kc,qN={title:"Links are crawlable",failureTitle:"Links are not crawlable",
1030
+ description:"Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. [Learn More](https://support.google.com/webmasters/answer/9112205)",columnFailingLink:"Uncrawlable Link"},zN=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/crawlable-anchors.js",qN);BN.exports=class CrawlableAnchors extends $N{static get meta(){return{id:"crawlable-anchors",title:zN(qN.title),failureTitle:zN(qN.failureTitle),description:zN(qN.description),requiredArtifacts:["AnchorElements","URL"]}}static audit({AnchorElements:e,URL:t}){const r=e.filter((({rawHref:e,name:r="",role:a=""})=>{if(e=e.replace(/\s/g,""),r=r.trim(),(a=a.trim()).length>0)return;if(e.startsWith("mailto:"))return;if(e.startsWith("file:"))return!0;if(!(r.length>0)){if(""===e)return!0;if(/javascript:void(\(|)0(\)|)/.test(e))return!0;try{new URL(e,t.finalUrl)}catch(e){return!0}}})),a=[{
1031
+ key:"node",itemType:"node",text:zN(qN.columnFailingLink)}],n=r.map((e=>({node:$N.makeNodeItem(e.node)})));return{score:Number(0===r.length),details:$N.makeTableDetails(a,n)}}},BN.exports.UIStrings=qN;var VN={exports:{}},WN={};function min(e,t){return null===e?t:null===t?e:Math.min(e,t)}function max(e,t){return null===e?t:null===t?e:Math.max(e,t)}function translateLengthProperty(e,t,r){return"number"==typeof e?e>=0?clamp(e,1,1e4):void 0:"device-width"===e?100*t:"device-height"===e?100*r:1}function translateZoomProperty(e){return"number"==typeof e?e>=0?clamp(e,.1,10):void 0:"yes"===e?1:"device-width"===e||"device-height"===e?10:"no"===e||null===e?.1:void 0}function clamp(e,t,r){return max(min(e,r),t)}WN.getRenderingDataFromViewport=function(e,t,r,a,n){var i=t/100,o=r/100,s=null,c=null,l=null,u=null,d=null,m=null,p=null,h=null,f=null,y=t,v=r,b="zoom";if(void 0!==e["maximum-scale"]&&(s=translateZoomProperty(e["maximum-scale"])),
1032
1032
  void 0!==e["minimum-scale"]&&(c=translateZoomProperty(e["minimum-scale"])),void 0!==e["initial-scale"]&&(l=translateZoomProperty(e["initial-scale"])),null!==c&&null===s&&(c=min(a,translateZoomProperty(e["minimum-scale"]))),void 0!==e.width&&(u="extend-to-zoom",m=translateLengthProperty(e.width,i,o)),void 0!==e.height&&(d="extend-to-zoom",p=translateLengthProperty(e.height,i,o)),void 0!==e["user-scalable"])if("number"==typeof(b=e["user-scalable"]))b=b>=1||b<=-1?"zoom":"fixed";else switch(b){case"yes":case"device-width":case"device-height":b="zoom";break;case"no":default:b="fixed"}null===l||void 0!==e.width&&void 0!==h||(void 0!==e.height?(u=null,m=null):(u="extend-to-zoom",m="extend-to-zoom")),null!==c&&null!==s&&(s=max(c,s)),null!==l&&(l=clamp(l,c,s));var w,S,T=null===l&&null===s?null:min(l,s);return null===T?("extend-to-zoom"===m&&(m=null),"extend-to-zoom"===p&&(p=null),"extend-to-zoom"===u&&(u=m),"extend-to-zoom"===d&&(d=p)):(w=y/T,S=v/T,"extend-to-zoom"===m&&(m=w),
1033
- "extend-to-zoom"===p&&(p=S),"extend-to-zoom"===u&&(u=max(w,m)),"extend-to-zoom"===d&&(d=max(S,p))),null===u&&null===m||(h=max(u,min(m,y))),null===d&&null===p||(f=max(d,min(p,v))),null===h&&(h=null===f?y:0!==v?Math.round(f*(y/v)):y),null===f&&(f=0!==y?Math.round(h*(v/y)):v),{zoom:l,width:h,height:f,userZoom:b}},VN.parseMetaViewPortContent=function(e){for(var t={validProperties:{},unknownProperties:{},invalidValues:{}},r=1;r<=e.length;){for(;r<=e.length&&RegExp(" |\n|\t|\0d|,|;|=").test(e[r-1]);)r++;r<=e.length&&(r=parseProperty(t,e,r))}return t};var WN=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];function parseProperty(e,t,r){for(var a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(var n=t.slice(a-1,r-1);r<=t.length&&!RegExp(",|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r
1034
- ;for(;r<=t.length&&RegExp(" |\n|\t|\0d|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;return function setProperty(e,t,r){if(WN.indexOf(t)>=0){var a=parseFloat(r);if(!isNaN(a))return void(e.validProperties[t]=a);var n=r.toLowerCase();if("yes"===n||"no"===n||"device-width"===n||"device-height"===n||"viewport-fit"===t.toLowerCase()&&("auto"===n||"cover"===n))return void(e.validProperties[t]=n);e.validProperties[t]=null,e.invalidValues[t]=r}else e.unknownProperties[t]=r}(e,n,t.slice(a-1,r-1)),r}VN.expectedValues={width:["device-width","device-height","a positive number"],height:["device-width","device-height","a positive number"],"initial-scale":["a positive number"],"minimum-scale":["a positive number"],"maximum-scale":["a positive number"],"user-scalable":["yes","no","0","1"],"shrink-to-fit":["yes","no"],"viewport-fit":["auto","cover"]};const GN=VN,HN=Ao;var YN=HN(class ViewportMeta{
1035
- static async compute_(e){const t=e.find((e=>"viewport"===e.name));if(!t)return{hasViewportTag:!1,isMobileOptimized:!1,parserWarnings:[]};const r=[],a=GN.parseMetaViewPortContent(t.content||"");Object.keys(a.unknownProperties).length&&r.push(`Invalid properties found: ${JSON.stringify(a.unknownProperties)}`),Object.keys(a.invalidValues).length&&r.push(`Invalid values found: ${JSON.stringify(a.invalidValues)}`);const n=a.validProperties;return{hasViewportTag:!0,isMobileOptimized:Boolean(n.width||n["initial-scale"]),parserWarnings:r}}},null);const KN=oi,JN=kc,XN=YN,ZN={title:"Document uses legible font sizes",failureTitle:"Document doesn't use legible font sizes",description:"Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size/).",displayValue:"{decimalProportion, number, extendedPercent} legible text",
1036
- explanationViewport:"Text is illegible because there's no viewport meta tag optimized for mobile screens.",additionalIllegibleText:"Add'l illegible text",legibleText:"Legible text",columnSelector:"Selector",columnPercentPageText:"% of Page Text",columnFontSize:"Font Size"},QN=KN.createMessageInstanceIdFn("lighthouse-core/audits/seo/font-size.js",ZN);function getSelector(e){const t=function getAttributeMap(e=[]){const t=new Map;for(let r=0;r<e.length;r+=2){const a=e[r],n=e[r+1];if(!a||!n)continue;const i=n.trim();i&&t.set(a.toLowerCase(),i)}return t}(e.attributes);if(t.has("id"))return"#"+t.get("id");{const e=t.get("class");if(e)return"."+e.split(/\s+/).join(".")}return e.nodeName.toLowerCase()}function nodeToTableNode(e){const t=(e.attributes||[]).map(((e,t)=>t%2==0?` ${e}`:`="${e}"`)).join("");return{type:"node",selector:e.parentNode?getSelector(e.parentNode):"",snippet:`<${e.nodeName.toLowerCase()}${t}>`}}zN.exports=class FontSize extends JN{static get meta(){return{id:"font-size",
1037
- title:QN(ZN.title),failureTitle:QN(ZN.failureTitle),description:QN(ZN.description),requiredArtifacts:["FontSize","URL","MetaElements"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await XN.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:QN(ZN.explanationViewport)};const{analyzedFailingNodesData:r,analyzedFailingTextLength:a,failingTextLength:n,totalTextLength:i}=e.FontSize;if(0===i)return{score:1};const o=function getUniqueFailingRules(e){const t=new Map;return e.forEach((e=>{const{nodeId:r,cssRule:a,fontSize:n,textLength:i,parentNode:o}=e,s=function getFontArtifactId(e,t){if(e&&"Regular"===e.type){const t=e.range?e.range.startLine:0,r=e.range?e.range.startColumn:0;return`${e.styleSheetId}@${t}:${r}`}return`node_${t}`}(a,r),c=t.get(s);c?c.textLength+=i:t.set(s,{nodeId:r,parentNode:o,cssRule:a,fontSize:n,textLength:i})})),[...t.values()]}(r),s=(i-n)/i*100,c=e.URL.finalUrl,l=[{key:"source",
1038
- itemType:"source-location",text:QN(KN.UIStrings.columnSource)},{key:"selector",itemType:"code",text:QN(ZN.columnSelector)},{key:"coverage",itemType:"text",text:QN(ZN.columnPercentPageText)},{key:"fontSize",itemType:"text",text:QN(ZN.columnFontSize)}],u=o.sort(((e,t)=>t.textLength-e.textLength)).map((({cssRule:e,textLength:t,fontSize:r,parentNode:a})=>{const n=t/i*100,o=function findStyleRuleSource(e,t,r){if(!t||"Attributes"===t.type||"Inline"===t.type)return{source:{type:"url",value:e},selector:nodeToTableNode(r)};if(t.parentRule&&"user-agent"===t.parentRule.origin)return{source:{type:"code",value:"User Agent Stylesheet"},selector:t.parentRule.selectors.map((e=>e.text)).join(", ")};let a="";t.parentRule&&(a=t.parentRule.selectors.map((e=>e.text)).join(", "));if(t.stylesheet&&!t.stylesheet.sourceURL)return{source:{type:"code",value:"dynamic"},selector:a};if(t.stylesheet&&t.range){const{range:e,stylesheet:r}=t,n=r.hasSourceURL?"comment":"network";let i=e.startLine,o=e.startColumn
1039
- ;r.isInline&&"comment"!==n&&(i+=r.startLine,0===e.startLine&&(o+=r.startColumn));const s=JN.makeSourceLocation(r.sourceURL,i,o);return s.urlProvider=n,{source:s,selector:a}}return{selector:a,source:{type:"code",value:"Unknown"}}}(c,e,a);return{source:o.source,selector:o.selector,coverage:`${n.toFixed(2)}%`,fontSize:`${r}px`}}));if(a<n){const e=(n-a)/i*100;u.push({source:{type:"code",value:QN(ZN.additionalIllegibleText)},selector:"",coverage:`${e.toFixed(2)}%`,fontSize:"< 12px"})}s>0&&u.push({source:{type:"code",value:QN(ZN.legibleText)},selector:"",coverage:`${s.toFixed(2)}%`,fontSize:"≥ 12px"});const d=QN(ZN.displayValue,{decimalProportion:s/100}),m=JN.makeTableDetails(l,u);return{score:Number(s>=60),details:m,displayValue:d}}},zN.exports.UIStrings=ZN;var eL={exports:{}}
1040
- ;const tL=[,[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,,,,,1,1,1,1,,,1,1,1,,1,,1,,1,1],[1,1,1,,1,1,,1,1,1,,1,,,1,1,1,,,1,1,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,,,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1],[,1,,,,,,1,,1,,,,,1,,1,,,,1,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,,,1,,,,,1,1,1,,1,,1,,1,,,,,,1],[1,,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,,1,,1,,,,,1,,1,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,,1,1,1,,1,,1,1,1,,,1,1,1,1,1,1,1,1],[,,1,,,1,,1,,,,1,1,1,,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1,1,1,1,1,,,1,1,1],[1,1,1,1,1,,,1,,,1,,,1,1,1,,,,,1,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1],[,1,,1,1,1,,1,1,,1,,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,,,1,1,1,,,1,1,,,,,,1,1],[1,1,1,,,,,1,,,,1,1,,1,,,,,,1,,,,,1],[,1,,,1,,,1,,,,,,1],[,1,,1,,,,1,,,,1],[1,,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,,1,,,1,1,1,1],[,1,1,1,1,1,,,1,,,1,,1,1,,1,,1,,,,,1,,1],[,1,,,,1,,,1,1,,1,,1,1,1,1,,1,1,,,1,,,1],[,1,1,,,,,,1,,,,1,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,,1,1,1,,,1,1,1,1,1,1,,1,,,,,1,1,,1,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,1,1],[,1,1,1,,,,1,1,1,,1,1,,,1,1,,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,,1,,,,,1,1,1,,,1,,1,,,1,1],[,,,,1,,,,,,,,,,,,,,,,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,,1,1,1,,1,1,,,,1,1,1,1,1,,,1,1,1,,,,,1],[1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,1,,,,,,,1],[,1,1,,1,1,,1,,,,,,,,,,,,,1],,[1,1,1,,,,,,,,,,,,,1],[,,,,,,,,1,,,1,,,1,1,,,,,1]],[,[1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,,1],[,,,1,,,,,,,,,,,,,,,1],[,1,,,1,1,,1,,1,1,,,,1,1,,,1,1,,,,1],[1,,,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,,,,1],,[,1,1,1,1,1,,1,1,1,,1,1,,1,1,,,1,1,1,1,,1,1,,1],[,1,,,1,,,1,,1,,,1,1,1,1,,,1,1,,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,,,1,1,1,1,1,1,1,,,1,,,1,,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,,,,1],[,,,,,,,1,,,,1,,1,1],[,1,1,1,1,1,1,1,,,,1,1,1,1,1,,,1,1,,1,1,1,1,1],[,1,,,1,1,,1,,1,1,1,,,1,1,,,1,,1,1,1,1,,1],[,1,1,1,,1,1,,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1],[,,,,,,,,,,,,,,,,1],,[,1,1,1,1,1,,1,1,1,,,1,,1,1,,1,1,1,1,1,,1,,1],[,,1,,,1,,,1,1,,,1,,1,1,,1],[,1,1,,1,,,,1,1,,1,,1,1,1,1,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,1,,1,,1,1],,[,1,1,,1,,,1,,1,,,,1,1,1,,,,,,1,,,,1],[1,1,,,1,1,,1,,,,,1,,1]],[,[,1],[,,,1,,,,1,,,,1,,,,1,,,1,,,1],[,,,,,,,,,,,,,,,,,,1,1,,,,,,1],,[1,,,,,1],[,1,,,,1,,,,1],[,1,,,,,,,,,,,1,,,1,,,,,,,,,1,1],[,,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,1,,1],[,1],[,1,,1,,1,,1,,1,,1,1,1,,1,1,,1,,,,,,,1],[1,,,,,1,,,1,1,,1,,1,,1,1,,,,,1,,,1],[,1,1,,,1,,1,,1,,1,,1,1,1,1,,,1,,1,,1,1,1],[1,1,1,1,1,,1,,1,,,,1,1,1,1,,1,1,,,1,1,1,1],[1,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],,[,1,,,,,,1,1,1,,1,,,,1,,,1,1,1,,,1],[1,,,,,1,,1,1,1,,1,1,1,1,1,,1,,1,,1,,,1,1],[1,,1,1,,,,,1,,,,,,1,1,,,1,1,1,1,,,1,,1],[1,,,,,,,,,,,,,,,,,1],[,,,,,1,,,1,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,,,1],[,1,,,,1]],[,[1,1,1,,1,,1,1,1,1,1,1,1,1,1,,1,,1,,1,1,,,1,1,1],[,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],,[,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1],,[1,1,,,,1,1,,,,,,1,,,,1,,1,,1,1,,1],[1],[,,,,,,,,,,,1,,,,,,,,,,,1],[,1,,,,,,,1,1,,,1,,1,,,,1,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,,1],[,,1,,,,,1,,1],[1,,,,1,,,,,1,,,,1,1,,,,1,1,,,,,1],[,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[1,,,1,1,,,,,,,1,,1,,1,1,1,1,1,1],[,,,,,1,,,,,,,1,,,,,,,1],,[,,1,1,1,1,1,,1,1,1,,,1,1,,,1,1,,1,1,1,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,,,1],,[1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,,,1,1,1,1,,,,,,1,,1,,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,,,,1,,1,,,1,1,1,1,1],[,,,,,,,,,,,1,,,,,,,,,1,,,,1],[,1,1,,1,1,,1,,,,1,1,,1,1,,,1,,1,1,,1],[,1,,1,,1,,,1,,,1,1,,1,1,,,1,1,1],[,1,1,1,1,1,,1,1,,,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,,,,,,,,,1,,1,,1,1,,,,1,,,1],[,1,,,1,1,,,,,,,,,1,1,1,,,,,1],[1,,,1,1,,,,1,1,1,1,1,,,1,,,1,,,1,,1,,1],[,1,1,,1,1,,1,1,,,,1,1,1,,,1,1,,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,,,,1,,,,,,,,,1],[,1,,,,,,,,1,,,,,1,,,,1,,,1],[,1,1,1,1,,,1,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1],[,,,,,1,,1,,,,,1,1,1,1,1,,,1,,,,1],[,1,,,,,,,,1,,,,,,,,,,,,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,1,,,,1,,1,1,1,1,1,,1,1,,,,,,1],[,1,1,1,1,1,1,1,,1,1,,,1,1,,,,1,,1,1,,1,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,1,1,,1,,,1,1,1,1,,,1,,,,,,,1],[,1,,,,,,,,1,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1],[,1,1,,,,,,,,,,,,1,1,,,,,,1],[,1,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,,,,,1],[1,1,,,1,,,1,1,1,,,,1],,[,,,,,,,,,,,,,1,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,1,,,,,,,1],[1,1,1,,1,,1,1,1,1,1,1,1,1,,1,,,1,,1,,,1,1],[,,,,,,,,,1],[,1,,,,1,,,,,,1,,,1,,,,,1],[,1,1,,1,1,,,,,,,,,,,,,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,1,1,1,,,,1,1,,,,1,,1],[1,1,1,1,1,1,,,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,,1,1],[,,,,,,,,,,,,,,,1,,,,1],,[1,1,,1,,1,,,,,,1,,1,,1,1,,1,,1,1,,1,1,,1],[,,1,,,,,,1,,,,1,,1,,,,,1],[1,,,,,,,,,1,,,,,,1,,,,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,,1,,,,,,1,,,1,,,,,,,,1],[,1,,1,,,,,,,,,,,,1],,[1,1,,,,,,,,,,,,,,,,,,,,,,1,1],[1]],[,[1,,,,,,,,,1,,,,,1,,1,,1],[,1,1,,1,1,,1,1,1,,,1,1,1,,,,1,,,1,,,,1],[,1,,,,,,,1,,,,1,,,,,,1],[1,1,1,1,1,1,,,,1,,,,,,,,,1,1,1,1],[1],[,1,1,,,1,1,,,,,1,,1,,,,,,,,1,,,,1],[1,,1,,,1,,1,,,,,1,1,1,1,,,,1,,,,1],[,,1,,,,,,,1,,,,,,,1,,,,,,,1],[1,,,,,,,,,,,,,,1,,,,1],[,,,1,,1,,,,,1,,,,1,1,,,,1],[1,,,,,1,,,,1,,1,1,,,1,1,,1,1,1,,1,1,1,,1],[,1,1,,,,,1,,1,,1,1,1,,1,1,,,1,,1,1,1],[,1,,,,1,,,,1,,,1,,1,1,,,1,1,,,,,,1],[1,,1,1,,1,,1,1,,1,,1,1,1,1,1,,,1,1,,,,,,1],[1,,,,,,,,,,,,,,,,,,1,,,1,,1],[,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,,1,,1],[,1,,,,1,,,1,1,,1,,,1,1,,,1,,,1,,,1,1],[1,1,,1,1,1,,1,1,1,,1,,1,1,1,,,1,,1,1],[1,,1,1,1,1,,,,1,,1,1,1,,1,,,1,1,1,,1,1,1,1,1],[1,,,,,,,,,,,,,1],[,,1,,,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,,,1,,1,,1,,,,1],[,,,1,,,,,,,,,1],[,1,,,,,,,,,,,,,,1,,,,,,,,,1],[,,,,,,,,1,1,,,,,,,,,1,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,,,1,1,1],[,,,,,1,,,,1,1,1,,,1,1,,,1,,1,1,,1],[,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,1,,,,,,,,,,,,,1],[,,1,,,1,,1,1,1,,1,1,,1,,,,1,,1,1],,[,,1,,,1,,,,,,1,,,,1],[,,,,,,,,,1,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,,1,1,,1,,1,,,1,1,1,,,1],[,,,,,1,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,1,,1,1,,1,,,1],[,,,,,1,,,,,,,,,,,,,,1],[,1,1,1,1,,,,,1,,,1,,1,,,,1,1,,,,1,1],[,1,,,1,,,1,,1,1,,1,,,,,,,1],[,,1,,1,,,1,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,,,,,,,,,,1,,1,1],[,,,,,,,,,,,,1],,[,1,1,1,1,,,,1,1,,1,1,1,1,1,1,,1,1,1,1,,1,,1],[1,,,,1,,,,,,,,,,1],[1,,,,,,,,,1],,[,1,,,,1,,,,,,,,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,,1,,,,1,1,,,1,1,,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,1],[1,1,1,,,,,1,1,1,,1,1,1,1,,,1,1,,1,1,,,,,1],[,1,,,,,,,1,1,,,1,1,1,,1,,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,,,1,,,,1,,,1,,,,1,,,,,,,1,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1],[1,1,1,,1,,,1,1,1,1,,1,1,1,1,,,,1,,1,,1,,,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1,1,,,,,,,,,1],,[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,,1,,1,,,,1],[,1,,,1,1,,1,1,1,,,1,1,1,1,1,,1,1,1,,1,,,1],[1,,,1,,,,1,1,1,,,,,1,1,,,,1,,1],[1,1,,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,,1,,1,,,,,,,,1,,1],[,1,,,,1,,1,1,,,,1,1,,1,,,,1,1,1,,1],,[,1,,,,,,1,,,,,,,1],[,,,,,,,,1,,,,1,,1,,,,,,,,,,,,1]],[,[,1,1,,1,1,1,1,,1,1,1,,1,1,,1,1,,1,1,1,1,1,1,,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,,,1,,,,,,,,1,,,,,,1,,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,,1,,1,1,1,1,1,1,1,,1,1,,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1],[,1,1,,,,,1,1,1,,,1,,1,1,,,,1,,1,,,1,1],[,,,,,,,1,,,,1,1,1,1,1,,1,,,,,,,,1],[1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,,1,,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,1,1,,1,,1,1,1,,1,,1,1,,1,1,,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,,1,,,,,1,,1],[,1,1,1,,1,,1,,1,,,,1,,1,,,1,,,,,,1,1],[,1,,,1,1,,1,,1,,1,1,1,1,1,,1,1,,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,,1,,1,,1,,,,,,1,,1,,,,1,1]],[,[,1,,1,,,,,,,,,,,,,,,1,,,,1],[,,,,,,,,,1,,1,1,1,,1,,,1,,1,1],[1,1,,,,,,,1,,,,,,,1,,,,,,1],[,1,,,,,,,,,,1,,,,,,,,,1,1],,[,,,,,,,,,,,,,,,1,,,,1,,1],[,,1,1,,1,,1,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,,,,,,,,1],[1,,1,1,,,,1,,,,,,,,,1,,,1,,,1,1],[,1,1,,1,1,,1,1,1,1,1,1,1,1,1,,,1,1,,1,1,,1],[,1,,,1,1,,,,,,1,,1,,1,,,1,,1,1],[1,1,1,1,,1,,1,,1,,1,1,,1,1,1,1,1,,1,1,1,1,1],[,1,1,,,1,,1,,1,1,1,,,1,1,1,,1,1,1,1,,1,1],[,,,,1,,,1,,,,,,,1,,,,1,1],[,1,,,,,,,,,,1,,1,,1,,,,,1,,,,,1],,[1,1,,1,,1,,1,1,,,,,,1,1,,,1,1,1,1,1,1,1,1,1],[1,1,,1,,,,,,1,,,,,,1,1,,,,1,1,,,1],[,1,1,,1,1,,,,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,,,1,,,,1,,,,1,1],[,,,,1],[,,,,,,,,,1,,,1],,[,,1,,1,,,,,,,,,1,,,,,,,,,,,,1],[,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,,,1],[,1,,1,,,,,,1,,,,,1,1,,,,,1,1],[,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,,,1,,1,1,1],[,1,,,,1,,,,,,,1],[,1,,,1,,,1,,1,,1,1,,1,,,,,1,,1,,,,1,1],[,1,,,1,,,1,1,1,,1,1,1,1,1,,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,1,1,,,,1,1,,,,,,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,,1,1,,1,1,1,1,1],[,1,,,,1,,,,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,1,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,,1,1,1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,,,,,,,1,1,,,,,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,1,,1,1,1,1],,[,1,1,,,,,1,,1,,,,1,1,1,,,1,,,,,1],[,,,,,,,,,,,,,1],[,,,,,1,,,,,,,,1,1,,,,,1,,1,,,1,1],[,,,,,,,,,,,,,,1]],[,[,1],,,,,,,,,,,,,,,,,,,,[1,1,1,1,1,,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,1,1,1,1],[,1,,1,,1,,,1,1,1,,1,1,1,1,1,,,1,,,,1,,1,1],[,1,,1,,1,,,1,,,,,1,,,,,,1,1],[,1,,1,,,,,1,,,,1,,1,1,1,1,1,1,1,1,,1],[,1,,,,,,,,,,,,,,,1]],[,[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,,,,,,,,,1,1,,,,1],[,,,,,,1],[,,1],[,1,1,,,1,,1,,1,1,,1,1,1,,,,1,1,1,,,,,1],,[,1,,,,1,,,,,,1,,,1,,,,1,1,,1],[,,,,,,,1,,,,,,,,,1],[,1,,,,1,1,,,,,,1,1,1,,,,1,,1,1],[,,,,,,,1,,1,,,,,,,,,,1],[,1,1,,,,,,1,1,,,,1,,,,,,,1,,,1],,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,,1,,,1,,,,,1,,1,,1,,1,,,,,1],[1,1,1,1,1,1,1,1,,,,,1,1,,1,1,,1,,,1,,1],[,,,,,,,,,,,,,,1,,,,,,1],,[,,,,,,,,,1,,,,,,1,,,,,1],[,,1,,,,,,,1,,,1,1],[,,,1,,,,,1,,,,,1,,,,,,1,,,,1],[1,,1,1,,1,1,1,1,1,,1,,,,1,1,1,,,1,1,,,,1,1],,[1,1,,,,,,,,,,1,,1,,1,,,1],[,,,,1,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,1],[,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,,1,,,1,,,,,,,,1,,,,,,1,,,,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,1,,,,1,1,1,1,1,1,,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,1,,1,1,,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,,1,,1,,1,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,,,,,,1,,1,,,,,1,1,,,,,1],[1,,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,,1,,,,1,1,1,1,1,,,1,1,,1,,1],[,1,1,1,1,,,,,1,,1,1,1,1,1,,,1,1,,,,1,1,1],[,1,1,1,1,1,,1,,,,,1,,1,,1,,,1,,,1,1,,1]],[,[1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,,,,,1,,,,,1,1,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,,,,1,,1,1,,1,1,1,1,1,,,1,,1,,1],[1,1,1,,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,,1,,,,,,,,,,1,1,1,1,1,1,1,,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,1,1,,,,,,1,1,1,1,1,,,,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,,1,1,1],[,1,1,1,,1,,1,1,1,1,,,1,1,1,,1,1,1,1,1,,,1,1],[1,1,,,,1,,,1,1,1,,1,,1,,1,,1,1,1,1,1,,1,,1],[,1,,,,,,,1,,1,,1,1,1,1,,,,,,,,,1]],[,[,,,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,1,,,1,,,,,,1,,,1,,,,1],,[,1,,,,1,,1,,1,1,,1,1,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],[1,1,1,,,1,,,,,,,,,1,1,,,,,,,,,,1],[,1,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1,,,1],[,,,,,,,,,1],[1,1,,,,,,1,1,1,,1,1,,,,1,1,,1,,1,1,1,,1],[,1,1,1,,1,1,,,1,,1,1,1,1,,,,,,,1,,1],[,1,1,1,1,,,1,,1,,,,1,1,1,1,,1,1,,1],[,1,,,1,1,,1,,,,1,,1,1,,1,,1,,,1,,,1,,1],[,,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,,,,,1],,[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1],[,1,,,,,,,1,1,,1,,,,,1,,,1,,1],[,1,,,,1,,,1,,,,,,,,1,,1,,,1],[,,,,,,,,,,,,,1,1,,,,1,,,1],[,,,,,1,,,1,,,,1],[,1],,[,1],[1,,,,,,,,,,,,,,1,,,,,1]],[,[,1,,,,1,1,1,1,1,1,,1,1,1,1,1,,1,1,,1,1,,,1],[,,1,,,,,,,,,1],,,[1,,,1,1,,,,,,,,1,1,,1,1,,1],,[,,,,,,,,,,,,,,,,,,1,,1],,[1,,,1,1,,1,1,,,,,1,,1,,,,,1,1,,1],,[,1,,,,,,,,1,1,1,1,1,,1,1,,,,1,1],[,,,,,,,,,,,,,,,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,,1,1,1,1,1,1],[,,,,,,,,,,,1,,1,,,1],[1,,,,,,,,,,,,,,,,,,1,,1],,,[,1,,,,,,,,,,,,,,1,,,,1,1],[,,,,,,,,,1,,,1,,,,,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,1,1,,,,,,1],,[,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,1,1,,1,1,1,1,1,1,,,1,1,1,1,1,,1,1],[,1,,,,,,,,1],[,,,,1,,,1,,,1,1,,,,,,,,,,1,,,,1],[,1,,1,1,,,1,1,1,,,,1,1,1,1,,1,1,1,1,,1],[,,,,,,,1],[,1,1,,,,,1,,1,,,,,,1,,,,,,1,,1,,1],[,1,,,,,,1,,,,1,,,,,,,,,,1],[,,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1,1,1,1,,1],[,1,,,,,,,,1],[,1,1,,1,,,,,,,,1,,,,,,1,,,1,,1,,1],[,1,,1,,1,,1,1,1,,1,1,1,,1,,,1,1,,1,1,1,1,1],[,1,1,1,1,1,,,1,1,,,,1,1,1,,,,1,1,,,1,1],[,,1,1,1,1,,1,,1,,1,,1,1,1,1,,,,,1,,1,,1],[1,1,1,1,1,1,1,1,,1,,1,,1,1,1,,,1,1,,,,1,,1],[,,,1],,[,1,1,,1,,,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1],[,1,,,,,,1,,1,,1,,,,,,,1,1,,1,1],[,,,,,,1,,1,1,,1,,1,,,,,,,,,,1],[,1,1,,1,,,,1,,,,1,1,1,,,,1,,1,1,1,,1,1],,[,1,1,,,,,,,,,,,,,1,,,1,,,,,1],[,1,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,1,,,,1,,,,,1,,,,,,,1]],[,[,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[,1,1,1,1,1,,1,,1,1,,,1,1,1,1,,1,,,,,1,1,1],[,,1,1,,1,,1,1,,,,1,1,1,1,,,1,,1,1,1,1,,1],[,1,,1,,,,,,,,1,,1,,1,,,,,,,,,,1],[,,1,,1,,,1,,,,,1,1,,,1,,1,1,1,1],[,1],[,1,1,,1,,1,1,,1,,,1,1,1,,,,1,,,1,,1],[1,1,,1,1,1,,,,,,,,,,,,,1,,1,1,1],[,1,1,,,,,,,1,,,1,,1,,1,,1,1,,,1,,,1],[,,1,,,,,,,,,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,1,,,,,1,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,,1,,1,1,1,,,1,1,1,1,,,,1,1],[,,,1,1,,,1,,1,,1,,1,1,1,1,,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,,1,,1,,,,1,1,,,1,1,,1,1,,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1,,1,1,,,1],[,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,,1,,,1,,,1,,1,1,1,1,1,,1,,1,1],[,,,,,1,,,,1,,,,,1,1,,,,1],[,1,,1,1,1,,1,,,1,1,1,,,1,,,1,,1,,,1],[,,1,,,,,,,,,1,,1,,,,,1,,1],[,1,1,,,,,,,,1,1,1,,,,,,,,1,,,,,1],[,,,,,,,,1,,,,,1,,,1]],[,[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,,1,1,1,1,1,1,1,1,,,,,,,,,1,1],[,,,,,,,,1,,,,1,,1,,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,1,,1,,1,,,,1,1,,1,,1,,,,1,1,1,1,1,,,1],,[,1,,,,,,,,1,,,1,1,,,1,,1,1,,1,,1],[,1,,,1,,,,,,,,1,,,,,,,1],[1,1,,,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1],,[,1,,,,,,1,,1,,1,1,1,1,1,,,1,,1,1,,,,1],[,1,1,,,1,,1,,1,,,1,1,1,1,,,1,,,1,,,,1],[,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1],[,1,,,1,1,,1,1,,,1,1,,1,1,,1,,1,,1],[1,,1,,,,,1,,1,,1,1,1,1,,,,,1,1,,,,1,1],[,1,1,,,,,1,1,,,1,,1,1,1,1,,,,,,,,,,1],,[,1,1,,,1,,,,1,,1,1,1,1,1,,,,1,,,,1,,1],[,,,1,1,,,1,,,,,1,,1,1,1,,1,1,,,,,,1],[,1,,,,,,,,,,,1,,,,1,,,,,,,1,,1],[,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,1,,1,,,1,1,,1,1,,1],[,1,,,,,,1,,,,,1,1,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1,,,1,,,,,1],[,,,,,,,1,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,,1,,,,,,,1,,,,,,,,1,,,1],[,1,,,,,,,1],[,,,,,,,,,,1],[,1,,,,,,1,1,,,,,,1],,[,1,1,,,,,,1,,,,,1,1,,,,1],[1,,1,,1,,,,,1,,,,,1,,,,,,,,,1,1],[,1,1,,,,,,,,,1,1,1,1,,,,1,,,,,1,,,1],,[,1,1,,1,,,1,1,,,1,,,1,1,1,,1,,1,1,1,,,,1],[,,,,,1,,,,,1,,,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,,,1,,,,,1,,,,,1,,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,1],[,1,,,,,,1,,,,,,,1,1,1,,,1],[,1,,,,,,,,,,1,1,1,,,,,1,,,1],[,,,,,1,,1,,,,,1,1,1,,1,1,,1,1,1,,,1,1],[1,1,,,,,,,1,,,,,1,1,,,,,,,,,,,1],,[,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,,1,,,,,1,,,1,,,,1,,1],[,1,,,,,,,,,1]]]
1041
- ;var rL={isValidLang:function isValidLang$1(e){let t=tL;for(;e.length<3;)e+="`";for(let r=0;r<=e.length-1;r++){if(t=t[e.charCodeAt(r)-96],!t)return!1}return!0}};const aL=kc,nL=oi,{isValidLang:iL}=rL,oL={title:"Document has a valid `hreflang`",failureTitle:"Document doesn't have a valid `hreflang`",description:"hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more](https://web.dev/hreflang/).",unexpectedLanguage:"Unexpected language code",notFullyQualified:"Relative href value"},sL=nL.createMessageInstanceIdFn("lighthouse-core/audits/seo/hreflang.js",oL);function isExpectedLanguageCode(e){if("x-default"===e.toLowerCase())return!0;const[t]=e.split("-");return iL(t.toLowerCase())}eL.exports=class Hreflang extends aL{static get meta(){return{id:"hreflang",title:sL(oL.title),failureTitle:sL(oL.failureTitle),description:sL(oL.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL"]}}
1042
- static audit({LinkElements:e}){const t=[],r=e.filter((e=>{const t="alternate"===e.rel,r=e.hreflang,a="body"===e.source;return t&&r&&!a}));for(const e of r){const r=[];let n;isExpectedLanguageCode(e.hreflang)||r.push(sL(oL.unexpectedLanguage)),(a=e.hrefRaw.toLowerCase()).startsWith("http:")||a.startsWith("https:")||r.push(sL(oL.notFullyQualified)),"head"===e.source?n=e.node?{...aL.makeNodeItem(e.node),snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:{type:"node",snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:"headers"===e.source&&(n=`Link: <${e.hrefRaw}>; rel="alternate"; hreflang="${e.hreflang}"`),n&&r.length&&t.push({source:n,subItems:{type:"subitems",items:r.map((e=>({reason:e})))}})}var a;const n=aL.makeTableDetails([{key:"source",itemType:"code",subItemsHeading:{key:"reason",itemType:"text"},text:""}],t);return{score:Number(0===t.length),details:n}}},eL.exports.UIStrings=oL;var cL={exports:{}}
1043
- ;const lL=kc,uL=Lo,dL=Fo,mL={title:"Page has successful HTTP status code",failureTitle:"Page has unsuccessful HTTP status code",description:"Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more](https://web.dev/http-status-code/)."},pL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/http-status-code.js",mL);cL.exports=class HTTPStatusCode extends lL{static get meta(){return{id:"http-status-code",title:pL(mL.title),failureTitle:pL(mL.failureTitle),description:pL(mL.description),requiredArtifacts:["devtoolsLogs","URL","GatherContext"],supportedModes:["navigation"]}}static async audit(e,t){const r=e.devtoolsLogs[lL.DEFAULT_PASS],a=e.URL,n=await uL.request(r,t),i=dL.findMainDocument(n,a.finalUrl).statusCode;return i>=400&&i<=599?{score:0,displayValue:`${i}`}:{score:1}}},cL.exports.UIStrings=mL;var hL={exports:{}};function trimLine(e){return e?Array.isArray(e)?e.map(trimLine):String(e).trim():null}function removeComments(e){var t=e.indexOf("#")
1033
+ "extend-to-zoom"===p&&(p=S),"extend-to-zoom"===u&&(u=max(w,m)),"extend-to-zoom"===d&&(d=max(S,p))),null===u&&null===m||(h=max(u,min(m,y))),null===d&&null===p||(f=max(d,min(p,v))),null===h&&(h=null===f?y:0!==v?Math.round(f*(y/v)):y),null===f&&(f=0!==y?Math.round(h*(v/y)):v),{zoom:l,width:h,height:f,userZoom:b}},WN.parseMetaViewPortContent=function(e){for(var t={validProperties:{},unknownProperties:{},invalidValues:{}},r=1;r<=e.length;){for(;r<=e.length&&RegExp(" |\n|\t|\0d|,|;|=").test(e[r-1]);)r++;r<=e.length&&(r=parseProperty(t,e,r))}return t};var GN=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];function parseProperty(e,t,r){for(var a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(var n=t.slice(a-1,r-1);r<=t.length&&!RegExp(",|;|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r
1034
+ ;for(;r<=t.length&&RegExp(" |\n|\t|\0d|=").test(t[r-1]);)r++;if(r>t.length||RegExp(",|;").test(t[r-1]))return r;for(a=r;r<=t.length&&!RegExp(" |\n|\t|\0d|,|;|=").test(t[r-1]);)r++;return function setProperty(e,t,r){if(GN.indexOf(t)>=0){var a=parseFloat(r);if(!isNaN(a))return void(e.validProperties[t]=a);var n=r.toLowerCase();if("yes"===n||"no"===n||"device-width"===n||"device-height"===n||"viewport-fit"===t.toLowerCase()&&("auto"===n||"cover"===n))return void(e.validProperties[t]=n);e.validProperties[t]=null,e.invalidValues[t]=r}else e.unknownProperties[t]=r}(e,n,t.slice(a-1,r-1)),r}WN.expectedValues={width:["device-width","device-height","a positive number"],height:["device-width","device-height","a positive number"],"initial-scale":["a positive number"],"minimum-scale":["a positive number"],"maximum-scale":["a positive number"],"user-scalable":["yes","no","0","1"],"shrink-to-fit":["yes","no"],"viewport-fit":["auto","cover"]};const HN=WN,YN=Ao;var KN=YN(class ViewportMeta{
1035
+ static async compute_(e){const t=e.find((e=>"viewport"===e.name));if(!t)return{hasViewportTag:!1,isMobileOptimized:!1,parserWarnings:[]};const r=[],a=HN.parseMetaViewPortContent(t.content||"");Object.keys(a.unknownProperties).length&&r.push(`Invalid properties found: ${JSON.stringify(a.unknownProperties)}`),Object.keys(a.invalidValues).length&&r.push(`Invalid values found: ${JSON.stringify(a.invalidValues)}`);const n=a.validProperties;return{hasViewportTag:!0,isMobileOptimized:Boolean(n.width||n["initial-scale"]),parserWarnings:r}}},null);const JN=oi,XN=kc,ZN=KN,QN={title:"Document uses legible font sizes",failureTitle:"Document doesn't use legible font sizes",description:"Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size/).",displayValue:"{decimalProportion, number, extendedPercent} legible text",
1036
+ explanationViewport:"Text is illegible because there's no viewport meta tag optimized for mobile screens.",additionalIllegibleText:"Add'l illegible text",legibleText:"Legible text",columnSelector:"Selector",columnPercentPageText:"% of Page Text",columnFontSize:"Font Size"},eL=JN.createMessageInstanceIdFn("lighthouse-core/audits/seo/font-size.js",QN);function getSelector(e){const t=function getAttributeMap(e=[]){const t=new Map;for(let r=0;r<e.length;r+=2){const a=e[r],n=e[r+1];if(!a||!n)continue;const i=n.trim();i&&t.set(a.toLowerCase(),i)}return t}(e.attributes);if(t.has("id"))return"#"+t.get("id");{const e=t.get("class");if(e)return"."+e.split(/\s+/).join(".")}return e.nodeName.toLowerCase()}function nodeToTableNode(e){const t=(e.attributes||[]).map(((e,t)=>t%2==0?` ${e}`:`="${e}"`)).join("");return{type:"node",selector:e.parentNode?getSelector(e.parentNode):"",snippet:`<${e.nodeName.toLowerCase()}${t}>`}}VN.exports=class FontSize extends XN{static get meta(){return{id:"font-size",
1037
+ title:eL(QN.title),failureTitle:eL(QN.failureTitle),description:eL(QN.description),requiredArtifacts:["FontSize","URL","MetaElements"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await ZN.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:eL(QN.explanationViewport)};const{analyzedFailingNodesData:r,analyzedFailingTextLength:a,failingTextLength:n,totalTextLength:i}=e.FontSize;if(0===i)return{score:1};const o=function getUniqueFailingRules(e){const t=new Map;return e.forEach((e=>{const{nodeId:r,cssRule:a,fontSize:n,textLength:i,parentNode:o}=e,s=function getFontArtifactId(e,t){if(e&&"Regular"===e.type){const t=e.range?e.range.startLine:0,r=e.range?e.range.startColumn:0;return`${e.styleSheetId}@${t}:${r}`}return`node_${t}`}(a,r),c=t.get(s);c?c.textLength+=i:t.set(s,{nodeId:r,parentNode:o,cssRule:a,fontSize:n,textLength:i})})),[...t.values()]}(r),s=(i-n)/i*100,c=e.URL.finalUrl,l=[{key:"source",
1038
+ itemType:"source-location",text:eL(JN.UIStrings.columnSource)},{key:"selector",itemType:"code",text:eL(QN.columnSelector)},{key:"coverage",itemType:"text",text:eL(QN.columnPercentPageText)},{key:"fontSize",itemType:"text",text:eL(QN.columnFontSize)}],u=o.sort(((e,t)=>t.textLength-e.textLength)).map((({cssRule:e,textLength:t,fontSize:r,parentNode:a})=>{const n=t/i*100,o=function findStyleRuleSource(e,t,r){if(!t||"Attributes"===t.type||"Inline"===t.type)return{source:{type:"url",value:e},selector:nodeToTableNode(r)};if(t.parentRule&&"user-agent"===t.parentRule.origin)return{source:{type:"code",value:"User Agent Stylesheet"},selector:t.parentRule.selectors.map((e=>e.text)).join(", ")};let a="";t.parentRule&&(a=t.parentRule.selectors.map((e=>e.text)).join(", "));if(t.stylesheet&&!t.stylesheet.sourceURL)return{source:{type:"code",value:"dynamic"},selector:a};if(t.stylesheet&&t.range){const{range:e,stylesheet:r}=t,n=r.hasSourceURL?"comment":"network";let i=e.startLine,o=e.startColumn
1039
+ ;r.isInline&&"comment"!==n&&(i+=r.startLine,0===e.startLine&&(o+=r.startColumn));const s=XN.makeSourceLocation(r.sourceURL,i,o);return s.urlProvider=n,{source:s,selector:a}}return{selector:a,source:{type:"code",value:"Unknown"}}}(c,e,a);return{source:o.source,selector:o.selector,coverage:`${n.toFixed(2)}%`,fontSize:`${r}px`}}));if(a<n){const e=(n-a)/i*100;u.push({source:{type:"code",value:eL(QN.additionalIllegibleText)},selector:"",coverage:`${e.toFixed(2)}%`,fontSize:"< 12px"})}s>0&&u.push({source:{type:"code",value:eL(QN.legibleText)},selector:"",coverage:`${s.toFixed(2)}%`,fontSize:"≥ 12px"});const d=eL(QN.displayValue,{decimalProportion:s/100}),m=XN.makeTableDetails(l,u);return{score:Number(s>=60),details:m,displayValue:d}}},VN.exports.UIStrings=QN;var tL={exports:{}}
1040
+ ;const rL=[,[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,,,,,1,1,1,1,,,1,1,1,,1,,1,,1,1],[1,1,1,,1,1,,1,1,1,,1,,,1,1,1,,,1,1,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,,,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1],[,1,,,,,,1,,1,,,,,1,,1,,,,1,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,,,1,,,,,1,1,1,,1,,1,,1,,,,,,1],[1,,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,,1,,1,,,,,1,,1,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,,1,1,1,,1,,1,1,1,,,1,1,1,1,1,1,1,1],[,,1,,,1,,1,,,,1,1,1,,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1,1,1,1,1,,,1,1,1],[1,1,1,1,1,,,1,,,1,,,1,1,1,,,,,1,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1],[,1,,1,1,1,,1,1,,1,,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,,,1,1,1,,,1,1,,,,,,1,1],[1,1,1,,,,,1,,,,1,1,,1,,,,,,1,,,,,1],[,1,,,1,,,1,,,,,,1],[,1,,1,,,,1,,,,1],[1,,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,,1,,,1,1,1,1],[,1,1,1,1,1,,,1,,,1,,1,1,,1,,1,,,,,1,,1],[,1,,,,1,,,1,1,,1,,1,1,1,1,,1,1,,,1,,,1],[,1,1,,,,,,1,,,,1,1,1,1,,1,1,1,1,1,1,,1,1,1],[,1,,1,1,1,,,1,1,1,1,1,1,,1,,,,,1,1,,1,,1],[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,1,1],[,1,1,1,,,,1,1,1,,1,1,,,1,1,,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,,1,,,,,1,1,1,,,1,,1,,,1,1],[,,,,1,,,,,,,,,,,,,,,,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,,1,1,1,,1,1,,,,1,1,1,1,1,,,1,1,1,,,,,1],[1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,1,,,,,,,1],[,1,1,,1,1,,1,,,,,,,,,,,,,1],,[1,1,1,,,,,,,,,,,,,1],[,,,,,,,,1,,,1,,,1,1,,,,,1]],[,[1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,,1,1,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,,1],[,,,1,,,,,,,,,,,,,,,1],[,1,,,1,1,,1,,1,1,,,,1,1,,,1,1,,,,1],[1,,,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,,,,1],,[,1,1,1,1,1,,1,1,1,,1,1,,1,1,,,1,1,1,1,,1,1,,1],[,1,,,1,,,1,,1,,,1,1,1,1,,,1,1,,1,1,1,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,,,1,1,1,1,1,1,1,,,1,,,1,,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,,,,1],[,,,,,,,1,,,,1,,1,1],[,1,1,1,1,1,1,1,,,,1,1,1,1,1,,,1,1,,1,1,1,1,1],[,1,,,1,1,,1,,1,1,1,,,1,1,,,1,,1,1,1,1,,1],[,1,1,1,,1,1,,1,1,,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1],[,,,,,,,,,,,,,,,,1],,[,1,1,1,1,1,,1,1,1,,,1,,1,1,,1,1,1,1,1,,1,,1],[,,1,,,1,,,1,1,,,1,,1,1,,1],[,1,1,,1,,,,1,1,,1,,1,1,1,1,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1],[,1,,,,,,,,,,1,1,,,,,,1,1,,1,,1,,1,1],,[,1,1,,1,,,1,,1,,,,1,1,1,,,,,,1,,,,1],[1,1,,,1,1,,1,,,,,1,,1]],[,[,1],[,,,1,,,,1,,,,1,,,,1,,,1,,,1],[,,,,,,,,,,,,,,,,,,1,1,,,,,,1],,[1,,,,,1],[,1,,,,1,,,,1],[,1,,,,,,,,,,,1,,,1,,,,,,,,,1,1],[,,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,1,,1],[,1],[,1,,1,,1,,1,,1,,1,1,1,,1,1,,1,,,,,,,1],[1,,,,,1,,,1,1,,1,,1,,1,1,,,,,1,,,1],[,1,1,,,1,,1,,1,,1,,1,1,1,1,,,1,,1,,1,1,1],[1,1,1,1,1,,1,,1,,,,1,1,1,1,,1,1,,,1,1,1,1],[1,,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],,[,1,,,,,,1,1,1,,1,,,,1,,,1,1,1,,,1],[1,,,,,1,,1,1,1,,1,1,1,1,1,,1,,1,,1,,,1,1],[1,,1,1,,,,,1,,,,,,1,1,,,1,1,1,1,,,1,,1],[1,,,,,,,,,,,,,,,,,1],[,,,,,1,,,1,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,,,1],[,1,,,,1]],[,[1,1,1,,1,,1,1,1,1,1,1,1,1,1,,1,,1,,1,1,,,1,1,1],[,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],,[,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1],,[1,1,,,,1,1,,,,,,1,,,,1,,1,,1,1,,1],[1],[,,,,,,,,,,,1,,,,,,,,,,,1],[,1,,,,,,,1,1,,,1,,1,,,,1,,,,,,,1],[,,,,,,,,,,,,,,,,1,,,,,1],[,,1,,,,,1,,1],[1,,,,1,,,,,1,,,,1,1,,,,1,1,,,,,1],[,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[1,,,1,1,,,,,,,1,,1,,1,1,1,1,1,1],[,,,,,1,,,,,,,1,,,,,,,1],,[,,1,1,1,1,1,,1,1,1,,,1,1,,,1,1,,1,1,1,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,,,,1],,[1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[,,,1,1,1,1,,,,,,1,,1,,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,,1],[,1,1,1,1,,1,1,1,1,1,1,1,1,,,,1,,1,,,1,1,1,1,1],[,,,,,,,,,,,1,,,,,,,,,1,,,,1],[,1,1,,1,1,,1,,,,1,1,,1,1,,,1,,1,1,,1],[,1,,1,,1,,,1,,,1,1,,1,1,,,1,1,1],[,1,1,1,1,1,,1,1,,,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,,,,,,,,,1,,1,,1,1,,,,1,,,1],[,1,,,1,1,,,,,,,,,1,1,1,,,,,1],[1,,,1,1,,,,1,1,1,1,1,,,1,,,1,,,1,,1,,1],[,1,1,,1,1,,1,1,,,,1,1,1,,,1,1,,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,,,,1,,,,,,,,,1],[,1,,,,,,,,1,,,,,1,,,,1,,,1],[,1,1,1,1,,,1,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1],[,,,,,1,,1,,,,,1,1,1,1,1,,,1,,,,1],[,1,,,,,,,,1,,,,,,,,,,,,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,1,,,,1,,1,1,1,1,1,,1,1,,,,,,1],[,1,1,1,1,1,1,1,,1,1,,,1,1,,,,1,,1,1,,1,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,1,1,,1,,,1,1,1,1,,,1,,,,,,,1],[,1,,,,,,,,1,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1],[,1,1,,,,,,,,,,,,1,1,,,,,,1],[,1,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,,,,,1],[1,1,,,1,,,1,1,1,,,,1],,[,,,,,,,,,,,,,1,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,1,,,,,,,1],[1,1,1,,1,,1,1,1,1,1,1,1,1,,1,,,1,,1,,,1,1],[,,,,,,,,,1],[,1,,,,1,,,,,,1,,,1,,,,,1],[,1,1,,1,1,,,,,,,,,,,,,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,1,1,1,,,,1,1,,,,1,,1],[1,1,1,1,1,1,,,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,,1,1],[,,,,,,,,,,,,,,,1,,,,1],,[1,1,,1,,1,,,,,,1,,1,,1,1,,1,,1,1,,1,1,,1],[,,1,,,,,,1,,,,1,,1,,,,,1],[1,,,,,,,,,1,,,,,,1,,,,1,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,,1,,,,,,1,,,1,,,,,,,,1],[,1,,1,,,,,,,,,,,,1],,[1,1,,,,,,,,,,,,,,,,,,,,,,1,1],[1]],[,[1,,,,,,,,,1,,,,,1,,1,,1],[,1,1,,1,1,,1,1,1,,,1,1,1,,,,1,,,1,,,,1],[,1,,,,,,,1,,,,1,,,,,,1],[1,1,1,1,1,1,,,,1,,,,,,,,,1,1,1,1],[1],[,1,1,,,1,1,,,,,1,,1,,,,,,,,1,,,,1],[1,,1,,,1,,1,,,,,1,1,1,1,,,,1,,,,1],[,,1,,,,,,,1,,,,,,,1,,,,,,,1],[1,,,,,,,,,,,,,,1,,,,1],[,,,1,,1,,,,,1,,,,1,1,,,,1],[1,,,,,1,,,,1,,1,1,,,1,1,,1,1,1,,1,1,1,,1],[,1,1,,,,,1,,1,,1,1,1,,1,1,,,1,,1,1,1],[,1,,,,1,,,,1,,,1,,1,1,,,1,1,,,,,,1],[1,,1,1,,1,,1,1,,1,,1,1,1,1,1,,,1,1,,,,,,1],[1,,,,,,,,,,,,,,,,,,1,,,1,,1],[,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,,1,,1],[,1,,,,1,,,1,1,,1,,,1,1,,,1,,,1,,,1,1],[1,1,,1,1,1,,1,1,1,,1,,1,1,1,,,1,,1,1],[1,,1,1,1,1,,,,1,,1,1,1,,1,,,1,1,1,,1,1,1,1,1],[1,,,,,,,,,,,,,1],[,,1,,,,,,,,,,,,,,,,,,,,1],[1,,,,,,,,,,,1,,1,,1,,,,1],[,,,1,,,,,,,,,1],[,1,,,,,,,,,,,,,,1,,,,,,,,,1],[,,,,,,,,1,1,,,,,,,,,1,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,,,1,1,1],[,,,,,1,,,,1,1,1,,,1,1,,,1,,1,1,,1],[,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,1,,,,,,,,,,,,,1],[,,1,,,1,,1,1,1,,1,1,,1,,,,1,,1,1],,[,,1,,,1,,,,,,1,,,,1],[,,,,,,,,,1,,,,,,,,,,1],[1,1,1,1,1,1,,1,1,1,,,1,1,,1,,1,,,1,1,1,,,1],[,,,,,1,,,,,,,,,,,,,1],[,1,,,,,,,,,,,,1,,1,1,,1,,,1],[,,,,,1,,,,,,,,,,,,,,1],[,1,1,1,1,,,,,1,,,1,,1,,,,1,1,,,,1,1],[,1,,,1,,,1,,1,1,,1,,,,,,,1],[,,1,,1,,,1,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,,,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,,,,,,,,,,1,,1,1],[,,,,,,,,,,,,1],,[,1,1,1,1,,,,1,1,,1,1,1,1,1,1,,1,1,1,1,,1,,1],[1,,,,1,,,,,,,,,,1],[1,,,,,,,,,1],,[,1,,,,1,,,,,,,,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,,,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,,1,1,1,1],[1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,,1,,,,1,1,,,1,1,,1],[,1,1,,1,,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,1],[1,1,1,,,,,1,1,1,,1,1,1,1,,,1,1,,1,1,,,,,1],[,1,,,,,,,1,1,,,1,1,1,,1,,,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,,,1,,,,1,,,1,,,,1,,,,,,,1,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1],[1,1,1,,1,,,1,1,1,1,,1,1,1,1,,,,1,,1,,1,,,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,,1,1,,,,,,,,,1],,[,1,,1,,1,,1,,1,,1,1,1,1,1,,,1,,1,,1,,,,1],[,1,,,1,1,,1,1,1,,,1,1,1,1,1,,1,1,1,,1,,,1],[1,,,1,,,,1,1,1,,,,,1,1,,,,1,,1],[1,1,,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,,1,,1,,,,,,,,1,,1],[,1,,,,1,,1,1,,,,1,1,,1,,,,1,1,1,,1],,[,1,,,,,,1,,,,,,,1],[,,,,,,,,1,,,,1,,1,,,,,,,,,,,,1]],[,[,1,1,,1,1,1,1,,1,1,1,,1,1,,1,1,,1,1,1,1,1,1,,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,,,1,,,,,,,,1,,,,,,1,,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,1,1,1,,1,1,1,1,,,1,1,1,1,,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,,1,,1,,1,,1,1,1,1,1,1,1,,1,1,,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1],[,1,1,,,,,1,1,1,,,1,,1,1,,,,1,,1,,,1,1],[,,,,,,,1,,,,1,1,1,1,1,,1,,,,,,,,1],[1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,,1,,1,1,,,1,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,1,1,,1,,1,1,1,,1,,1,1,,1,1,,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,,,,,,1,,,,,1,,1],[,1,1,1,,1,,1,,1,,,,1,,1,,,1,,,,,,1,1],[,1,,,1,1,,1,,1,,1,1,1,1,1,,1,1,,,1,,,1],[1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,,,1,,1,,1,,,,,,1,,1,,,,1,1]],[,[,1,,1,,,,,,,,,,,,,,,1,,,,1],[,,,,,,,,,1,,1,1,1,,1,,,1,,1,1],[1,1,,,,,,,1,,,,,,,1,,,,,,1],[,1,,,,,,,,,,1,,,,,,,,,1,1],,[,,,,,,,,,,,,,,,1,,,,1,,1],[,,1,1,,1,,1,,,,,,,,1,,,,,,1],[,,,,,,,,,,,,,,,,,,,,1,1],[,1,,,,,,,,,,,,,1],[1,,1,1,,,,1,,,,,,,,,1,,,1,,,1,1],[,1,1,,1,1,,1,1,1,1,1,1,1,1,1,,,1,1,,1,1,,1],[,1,,,1,1,,,,,,1,,1,,1,,,1,,1,1],[1,1,1,1,,1,,1,,1,,1,1,,1,1,1,1,1,,1,1,1,1,1],[,1,1,,,1,,1,,1,1,1,,,1,1,1,,1,1,1,1,,1,1],[,,,,1,,,1,,,,,,,1,,,,1,1],[,1,,,,,,,,,,1,,1,,1,,,,,1,,,,,1],,[1,1,,1,,1,,1,1,,,,,,1,1,,,1,1,1,1,1,1,1,1,1],[1,1,,1,,,,,,1,,,,,,1,1,,,,1,1,,,1],[,1,1,,1,1,,,,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,,,1,,,,1,,,,1,1],[,,,,1],[,,,,,,,,,1,,,1],,[,,1,,1,,,,,,,,,1,,,,,,,,,,,,1],[,,,,,,,,,,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,1,1,1,1,,,1,1,1,1,1,,1,1,1,1,1,,,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,,,,,1],[,1,,1,,,,,,1,,,,,1,1,,,,,1,1],[,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,,1,,,1,,1,1,1],[,1,,,,1,,,,,,,1],[,1,,,1,,,1,,1,,1,1,,1,,,,,1,,1,,,,1,1],[,1,,,1,,,1,1,1,,1,1,1,1,1,,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1],[,,,,,,,,,,,,,,,,,,,,1],[,1,1,1,,,,1,1,,,,,,1,1,1,,1,1,1,1],[1,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1],[,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,1,1,1,1,1,1,1,,1,,1,1,1,1,1,,1,1,,1,1,1,1,1],[,1,,,,1,,,,1,,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,1,,,,,,,,1,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1],[1,1,,1,1,1,,1,1,1,,,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,,,,,,,1,1,,,,,1,1,1,1,1,,1,1,1,1,,1],[,1,1,1,1,1,1,1,,1,1,1,,1,,1,1,1,1,,1,1,,1,1,1,1],,[,1,1,,,,,1,,1,,,,1,1,1,,,1,,,,,1],[,,,,,,,,,,,,,1],[,,,,,1,,,,,,,,1,1,,,,,1,,1,,,1,1],[,,,,,,,,,,,,,,1]],[,[,1],,,,,,,,,,,,,,,,,,,,[1,1,1,1,1,,1,1,1,1,,1,1,1,1,,1,1,1,1,,,1,1,1,1,1],[,1,,1,,1,,,1,1,1,,1,1,1,1,1,,,1,,,,1,,1,1],[,1,,1,,1,,,1,,,,,1,,,,,,1,1],[,1,,1,,,,,1,,,,1,,1,1,1,1,1,1,1,1,,1],[,1,,,,,,,,,,,,,,,1]],[,[,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,,,,,,,,,1,1,,,,1],[,,,,,,1],[,,1],[,1,1,,,1,,1,,1,1,,1,1,1,,,,1,1,1,,,,,1],,[,1,,,,1,,,,,,1,,,1,,,,1,1,,1],[,,,,,,,1,,,,,,,,,1],[,1,,,,1,1,,,,,,1,1,1,,,,1,,1,1],[,,,,,,,1,,1,,,,,,,,,,1],[,1,1,,,,,,1,1,,,,1,,,,,,,1,,,1],,[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,,1,,,1,,,,,1,,1,,1,,1,,,,,1],[1,1,1,1,1,1,1,1,,,,,1,1,,1,1,,1,,,1,,1],[,,,,,,,,,,,,,,1,,,,,,1],,[,,,,,,,,,1,,,,,,1,,,,,1],[,,1,,,,,,,1,,,1,1],[,,,1,,,,,1,,,,,1,,,,,,1,,,,1],[1,,1,1,,1,1,1,1,1,,1,,,,1,1,1,,,1,1,,,,1,1],,[1,1,,,,,,,,,,1,,1,,1,,,1],[,,,,1,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,1,,,,,1,,1],[,,,,,,,,1]],[,[1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,,1,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,,1,,,1,,,,,,,,1,,,,,,1,,,,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,1,,,,1,1,1,1,1,1,,1,1,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,,1,1,1,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1],[1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,,1,1,1,1,,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,,,,,,,1,,1,1,,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1],[1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,,1,,1,,1,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1],[1,1,1,1,,1,,,,,,1,,1,,,,,1,1,,,,,1],[1,,1,1,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,1,1,,1,,1,,,,1,1,1,1,1,,,1,1,,1,,1],[,1,1,1,1,,,,,1,,1,1,1,1,1,,,1,1,,,,1,1,1],[,1,1,1,1,1,,1,,,,,1,,1,,1,,,1,,,1,1,,1]],[,[1,1,1,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1,,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,,,,,1,,,,,1,1,,,1,,1],[1,1,1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,,1,1,1,1,,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1],[1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,,,,1,,1,1,,1,1,1,1,1,,,1,,1,,1],[1,1,1,,1,1,1,1,,,,1,1,1,1,,1,1,1,1,1,1,1,1,1,,1],[1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,,1,1,1,1,1,1,1,1,1,,1,1,,1,1,1,1,1,,1,1,1,1,1,1],[,1,,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1],[,,1,,,,,,,,,,1,1,1,1,1,1,1,,1,1,,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,1,1,1,1,1],[,1,,,1,1,,,,,,1,1,1,1,1,,,,1,1,1,,1,1,1],[1,1,1,1,1,1,1,1,1,,,,1,1,1,1,1,1,1,,1,1,,1,1,1],[,1,1,1,,1,,1,1,1,1,,,1,1,1,,1,1,1,1,1,,,1,1],[1,1,,,,1,,,1,1,1,,1,,1,,1,,1,1,1,1,1,,1,,1],[,1,,,,,,,1,,1,,1,1,1,1,,,,,,,,,1]],[,[,,,,,,,,,,,,,1,1,,,,1],[,1,,,,,,,,1,,,1,,,,,,1,,,1,,,,1],,[,1,,,,1,,1,,1,1,,1,1,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1],[,,,,,,,,,1],[1,1,1,,,1,,,,,,,,,1,1,,,,,,,,,,1],[,1,,,,,,,,,,,,,1],[,,,,,,,,,,,,,,,,,,,1,,,1],[,,,,,,,,,1],[1,1,,,,,,1,1,1,,1,1,,,,1,1,,1,,1,1,1,,1],[,1,1,1,,1,1,,,1,,1,1,1,1,,,,,,,1,,1],[,1,1,1,1,,,1,,1,,,,1,1,1,1,,1,1,,1],[,1,,,1,1,,1,,,,1,,1,1,,1,,1,,,1,,,1,,1],[,,,,,,,,,,,1],[,,,,,,,,,1,,,,,,,,,,,,,1],,[1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,,1,1,1,1,1,1,1],[,1,,,,,,,1,1,,1,,,,,1,,,1,,1],[,1,,,,1,,,1,,,,,,,,1,,1,,,1],[,,,,,,,,,,,,,1,1,,,,1,,,1],[,,,,,1,,,1,,,,1],[,1],,[,1],[1,,,,,,,,,,,,,,1,,,,,1]],[,[,1,,,,1,1,1,1,1,1,,1,1,1,1,1,,1,1,,1,1,,,1],[,,1,,,,,,,,,1],,,[1,,,1,1,,,,,,,,1,1,,1,1,,1],,[,,,,,,,,,,,,,,,,,,1,,1],,[1,,,1,1,,1,1,,,,,1,,1,,,,,1,1,,1],,[,1,,,,,,,,1,1,1,1,1,,1,1,,,,1,1],[,,,,,,,,,,,,,,,,1,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,,,1,1,1,1,,1,1,1,1,1,1],[,,,,,,,,,,,1,,1,,,1],[1,,,,,,,,,,,,,,,,,,1,,1],,,[,1,,,,,,,,,,,,,,1,,,,1,1],[,,,,,,,,,1,,,1,,,,,,,,,,1],[,,,,,,,,,,,,,,,1],[,,,,,,,,,,,,,1,1,,,,,,1],,[,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,,1,1,,1,1,1,1,1,1,,,1,1,1,1,1,,1,1],[,1,,,,,,,,1],[,,,,1,,,1,,,1,1,,,,,,,,,,1,,,,1],[,1,,1,1,,,1,1,1,,,,1,1,1,1,,1,1,1,1,,1],[,,,,,,,1],[,1,1,,,,,1,,1,,,,,,1,,,,,,1,,1,,1],[,1,,,,,,1,,,,1,,,,,,,,,,1],[,,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1,1,1,1,,1],[,1,,,,,,,,1],[,1,1,,1,,,,,,,,1,,,,,,1,,,1,,1,,1],[,1,,1,,1,,1,1,1,,1,1,1,,1,,,1,1,,1,1,1,1,1],[,1,1,1,1,1,,,1,1,,,,1,1,1,,,,1,1,,,1,1],[,,1,1,1,1,,1,,1,,1,,1,1,1,1,,,,,1,,1,,1],[1,1,1,1,1,1,1,1,,1,,1,,1,1,1,,,1,1,,,,1,,1],[,,,1],,[,1,1,,1,,,1,1,1,,1,1,1,1,1,1,,1,1,,1,1,1,1,1,1],[,1,,,,,,1,,1,,1,,,,,,,1,1,,1,1],[,,,,,,1,,1,1,,1,,1,,,,,,,,,,1],[,1,1,,1,,,,1,,,,1,1,1,,,,1,,1,1,1,,1,1],,[,1,1,,,,,,,,,,,,,1,,,1,,,,,1],[,1,,,,,,,,,,,,,,,,,,,,,,1],[,1,1,,,,,,,1,,,,1,,,,,1,,,,,,,1]],[,[,1,1,1,1,1,,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1],[,1,1,1,1,1,,1,,1,1,,,1,1,1,1,,1,,,,,1,1,1],[,,1,1,,1,,1,1,,,,1,1,1,1,,,1,,1,1,1,1,,1],[,1,,1,,,,,,,,1,,1,,1,,,,,,,,,,1],[,,1,,1,,,1,,,,,1,1,,,1,,1,1,1,1],[,1],[,1,1,,1,,1,1,,1,,,1,1,1,,,,1,,,1,,1],[1,1,,1,1,1,,,,,,,,,,,,,1,,1,1,1],[,1,1,,,,,,,1,,,1,,1,,1,,1,1,,,1,,,1],[,,1,,,,,,,,,,,,,,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,1,1,1,,1,,1,,,,,1,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,,,1,1,1,,1,,1,1,1,,,1,1,1,1,,,,1,1],[,,,1,1,,,1,,1,,1,,1,1,1,1,,1,,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,1,,1,1,,1,,1,,,,1,1,,,1,1,,1,1,,1],[,1,1,1,1,1,,,1,1,1,,1,1,1,1,1,1,1,1,,1,1,,,1],[,1,1,1,1,1,,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1,,1,1],[,1,1,,1,,,1,,,1,,1,1,1,1,1,,1,,1,1],[,,,,,1,,,,1,,,,,1,1,,,,1],[,1,,1,1,1,,1,,,1,1,1,,,1,,,1,,1,,,1],[,,1,,,,,,,,,1,,1,,,,,1,,1],[,1,1,,,,,,,,1,1,1,,,,,,,,1,,,,,1],[,,,,,,,,1,,,,,1,,,1]],[,[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,1,,1,1,,,1,1,1,1,1,1,1,1,,,,,,,,,1,1],[,,,,,,,,1,,,,1,,1,,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,1,,1,,1,,,,1,1,,1,,1,,,,1,1,1,1,1,,,1],,[,1,,,,,,,,1,,,1,1,,,1,,1,1,,1,,1],[,1,,,1,,,,,,,,1,,,,,,,1],[1,1,,,,,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,,1,1,1],,[,1,,,,,,1,,1,,1,1,1,1,1,,,1,,1,1,,,,1],[,1,1,,,1,,1,,1,,,1,1,1,1,,,1,,,1,,,,1],[,1,1,1,1,1,,1,1,1,,1,1,1,1,1,1,1,1,1,1,,,,1,,1],[,1,,,1,1,,1,1,,,1,1,,1,1,,1,,1,,1],[1,,1,,,,,1,,1,,1,1,1,1,,,,,1,1,,,,1,1],[,1,1,,,,,1,1,,,1,,1,1,1,1,,,,,,,,,,1],,[,1,1,,,1,,,,1,,1,1,1,1,1,,,,1,,,,1,,1],[,,,1,1,,,1,,,,,1,,1,1,1,,1,1,,,,,,1],[,1,,,,,,,,,,,1,,,,1,,,,,,,1,,1],[,1,1,1,1,1,1,1,,1,1,1,1,1,1,,1,1,1,,1,1,,1,1,1,1],[,1,,,,,,,,,,,,,,,,,,,1],[,1,,,,,,1,,,,,1,,1,,,1,1,,1,1,,1],[,1,,,,,,1,,,,,1,1,,,,,,,,1,,,,1],[,,,,,,,,,,,,,,,,,,1,,,1,,,,,1],[,,,,,,,1,,,,1]],[,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,1,,1,,,,,,,1,,,,,,,,1,,,1],[,1,,,,,,,1],[,,,,,,,,,,1],[,1,,,,,,1,1,,,,,,1],,[,1,1,,,,,,1,,,,,1,1,,,,1],[1,,1,,1,,,,,1,,,,,1,,,,,,,,,1,1],[,1,1,,,,,,,,,1,1,1,1,,,,1,,,,,1,,,1],,[,1,1,,1,,,1,1,,,1,,,1,1,1,,1,,1,1,1,,,,1],[,,,,,1,,,,,1,,,1,1,,,1,,1,,,,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,1,,,1,1,,1,,,,1,,,,,,,,1],[,,,1,,,,,1,,,,,1,,1,,1,1,1],[,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[,,,,,1],[,1,,,,,,1,,,,,,,1,1,1,,,1],[,1,,,,,,,,,,1,1,1,,,,,1,,,1],[,,,,,1,,1,,,,,1,1,1,,1,1,,1,1,1,,,1,1],[1,1,,,,,,,1,,,,,1,1,,,,,,,,,,,1],,[,1],[,,,,,,,,,,,,,,,,,,,,,,,,1],[,,1,,,,,1,,,1,,,,1,,1],[,1,,,,,,,,,1]]]
1041
+ ;var aL={isValidLang:function isValidLang$1(e){let t=rL;for(;e.length<3;)e+="`";for(let r=0;r<=e.length-1;r++){if(t=t[e.charCodeAt(r)-96],!t)return!1}return!0}};const nL=kc,iL=oi,{isValidLang:oL}=aL,sL={title:"Document has a valid `hreflang`",failureTitle:"Document doesn't have a valid `hreflang`",description:"hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more](https://web.dev/hreflang/).",unexpectedLanguage:"Unexpected language code",notFullyQualified:"Relative href value"},cL=iL.createMessageInstanceIdFn("lighthouse-core/audits/seo/hreflang.js",sL);function isExpectedLanguageCode(e){if("x-default"===e.toLowerCase())return!0;const[t]=e.split("-");return oL(t.toLowerCase())}tL.exports=class Hreflang extends nL{static get meta(){return{id:"hreflang",title:cL(sL.title),failureTitle:cL(sL.failureTitle),description:cL(sL.description),supportedModes:["navigation"],requiredArtifacts:["LinkElements","URL"]}}
1042
+ static audit({LinkElements:e}){const t=[],r=e.filter((e=>{const t="alternate"===e.rel,r=e.hreflang,a="body"===e.source;return t&&r&&!a}));for(const e of r){const r=[];let n;isExpectedLanguageCode(e.hreflang)||r.push(cL(sL.unexpectedLanguage)),(a=e.hrefRaw.toLowerCase()).startsWith("http:")||a.startsWith("https:")||r.push(cL(sL.notFullyQualified)),"head"===e.source?n=e.node?{...nL.makeNodeItem(e.node),snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:{type:"node",snippet:`<link rel="alternate" hreflang="${e.hreflang}" href="${e.hrefRaw}" />`}:"headers"===e.source&&(n=`Link: <${e.hrefRaw}>; rel="alternate"; hreflang="${e.hreflang}"`),n&&r.length&&t.push({source:n,subItems:{type:"subitems",items:r.map((e=>({reason:e})))}})}var a;const n=nL.makeTableDetails([{key:"source",itemType:"code",subItemsHeading:{key:"reason",itemType:"text"},text:""}],t);return{score:Number(0===t.length),details:n}}},tL.exports.UIStrings=sL;var lL={exports:{}}
1043
+ ;const uL=kc,dL=Lo,mL=Fo,pL={title:"Page has successful HTTP status code",failureTitle:"Page has unsuccessful HTTP status code",description:"Pages with unsuccessful HTTP status codes may not be indexed properly. [Learn more](https://web.dev/http-status-code/)."},hL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/http-status-code.js",pL);lL.exports=class HTTPStatusCode extends uL{static get meta(){return{id:"http-status-code",title:hL(pL.title),failureTitle:hL(pL.failureTitle),description:hL(pL.description),requiredArtifacts:["devtoolsLogs","URL","GatherContext"],supportedModes:["navigation"]}}static async audit(e,t){const r=e.devtoolsLogs[uL.DEFAULT_PASS],a=e.URL,n=await dL.request(r,t),i=mL.findMainDocument(n,a.finalUrl).statusCode;return i>=400&&i<=599?{score:0,displayValue:`${i}`}:{score:1}}},lL.exports.UIStrings=pL;var gL={exports:{}};function trimLine(e){return e?Array.isArray(e)?e.map(trimLine):String(e).trim():null}function removeComments(e){var t=e.indexOf("#")
1044
1044
  ;return t>-1?e.substr(0,t):e}function splitLine(e){var t=String(e).indexOf(":");return!e||t<0?null:[e.slice(0,t),e.slice(t+1)]}function formatUserAgent(e){var t=e.toLowerCase(),r=t.indexOf("/");return r>-1&&(t=t.substr(0,r)),t.trim()}function normaliseEncoding(e){try{return urlEncodeToUpper(encodeURI(e).replace(/%25/g,"%"))}catch(t){return e}}function urlEncodeToUpper(e){return e.replace(/%[0-9a-fA-F]{2}/g,(function(e){return e.toUpperCase()}))}function matches(e,t){var r=new Array(t.length+1),a=1;r[0]=0;for(var n=0;n<e.length;n++){if("$"===e[n]&&n+1===e.length)return r[a-1]===t.length;if("*"==e[n]){a=t.length-r[0]+1;for(var i=1;i<a;i++)r[i]=r[i-1]+1}else{var o=0;for(i=0;i<a;i++)r[i]<t.length&&t[r[i]]===e[n]&&(r[o++]=r[i]+1);if(0==o)return!1;a=o}}return!0}function parseUrl(e){try{return new URL(e,"http://robots-relative.samclarke.com/")}catch(e){return null}}function Robots$1(e,t){this._url=parseUrl(e)||{},this._url.port=this._url.port||80,this._rules=Object.create(null),
1045
1045
  this._sitemaps=[],this._preferredHost=null,function parseRobots(e,t){for(var r=e.split(/\r\n|\r|\n/).map(removeComments).map(splitLine).map(trimLine),a=[],n=!0,i=0;i<r.length;i++){var o=r[i];if(o&&o[0]){switch(o[0].toLowerCase()){case"user-agent":n&&(a.length=0),o[1]&&a.push(formatUserAgent(o[1]));break;case"disallow":t.addRule(a,o[1],!1,i+1);break;case"allow":t.addRule(a,o[1],!0,i+1);break;case"crawl-delay":t.setCrawlDelay(a,o[1]);break;case"sitemap":o[1]&&t.addSitemap(o[1]);break;case"host":o[1]&&t.setPreferredHost(o[1].toLowerCase())}n="user-agent"!==o[0].toLowerCase()}}}(t||"",this)}Robots$1.prototype.addRule=function(e,t,r,a){var n=this._rules;e.forEach((function(e){n[e]=n[e]||[],t&&n[e].push({pattern:normaliseEncoding(t),allow:r,lineNumber:a})}))},Robots$1.prototype.setCrawlDelay=function(e,t){var r=this._rules,a=Number(t);e.forEach((function(e){r[e]=r[e]||[],isNaN(a)||(r[e].crawlDelay=a)}))},Robots$1.prototype.addSitemap=function(e){this._sitemaps.push(e)},
1046
1046
  Robots$1.prototype.setPreferredHost=function(e){this._preferredHost=e},Robots$1.prototype._getRule=function(e,t){var r=parseUrl(e)||{},a=formatUserAgent(t||"*");if(r.port=r.port||80,r.protocol===this._url.protocol&&r.hostname===this._url.hostname&&r.port===this._url.port){var n=this._rules[a]||this._rules["*"]||[];return function findRule(e,t){for(var r=null,a=0;a<t.length;a++){var n=t[a];matches(n.pattern,e)&&(!r||n.pattern.length>r.pattern.length||n.pattern.length==r.pattern.length&&n.allow&&!r.allow)&&(r=n)}return r}(urlEncodeToUpper(r.pathname+r.search),n)}},Robots$1.prototype.isAllowed=function(e,t){var r=this._getRule(e,t);if(void 0!==r)return!r||r.allow},Robots$1.prototype.getMatchingLineNumber=function(e,t){var r=this._getRule(e,t);return r?r.lineNumber:-1},Robots$1.prototype.isDisallowed=function(e,t){return!this.isAllowed(e,t)},Robots$1.prototype.getCrawlDelay=function(e){var t=formatUserAgent(e||"*");return(this._rules[t]||this._rules["*"]||{}).crawlDelay},
1047
- Robots$1.prototype.getPreferredHost=function(){return this._preferredHost},Robots$1.prototype.getSitemaps=function(){return this._sitemaps.slice(0)};var gL=Robots$1;const fL=kc,robotsParser=function(e,t){return new gL(e,t)},yL=ji,vL=HT,bL=new Set(["noindex","none"]),wL="unavailable_after",SL={title:"Page isn’t blocked from indexing",failureTitle:"Page is blocked from indexing",description:"Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more](https://web.dev/is-crawable/)."},TL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/is-crawlable.js",SL);function hasBlockingDirective(e){return e.split(",").map((e=>e.toLowerCase().trim())).some((e=>bL.has(e)||function isUnavailable(e){const t=e.split(":");if(t.length<=1||t[0]!==wL)return!1;const r=Date.parse(t.slice(1).join(":"));return!isNaN(r)&&r<Date.now()}(e)))}hL.exports=class IsCrawlable extends fL{static get meta(){return{id:"is-crawlable",title:TL(SL.title),
1048
- failureTitle:TL(SL.failureTitle),description:TL(SL.description),supportedModes:["navigation"],requiredArtifacts:["MetaElements","RobotsTxt","URL","devtoolsLogs"]}}static audit(e,t){const r=e.devtoolsLogs[fL.DEFAULT_PASS],a=e.MetaElements.find((e=>"robots"===e.name));return vL.request({devtoolsLog:r,URL:e.URL},t).then((t=>{const r=[];if(a){const e=a.content||"";hasBlockingDirective(e)&&r.push({source:{...fL.makeNodeItem(a.node),snippet:`<meta name="robots" content="${e}" />`}})}if(t.responseHeaders&&t.responseHeaders.filter((e=>"x-robots-tag"===e.name.toLowerCase()&&!function hasUserAgent(e){const t=e.match(/^([^,:]+):/);return!!t&&t[1].toLowerCase()!==wL}(e.value)&&hasBlockingDirective(e.value))).forEach((e=>r.push({source:`${e.name}: ${e.value}`}))),e.RobotsTxt.content){const a=new yL("/robots.txt",t.url),n=robotsParser(a.href,e.RobotsTxt.content);if(!n.isAllowed(t.url)){const e=n.getMatchingLineNumber(t.url)||1;r.push({source:{type:"source-location",url:a.href,urlProvider:"network",
1049
- line:e-1,column:0}})}}const n=fL.makeTableDetails([{key:"source",itemType:"code",text:"Blocking Directive Source"}],r);return{score:Number(0===r.length),details:n}}))}},hL.exports.UIStrings=SL;var EL={exports:{}};const xL=kc,_L=ji,AL=new Set(["click here","click this","go","here","information","learn more","more","more info","more information","right here","read more","see more","start","this","ここをクリック","こちらをクリック","リンク","続きを読む","続く","全文表示","click aquí","click aqui","clicka aquí","clicka aqui","pincha aquí","pincha aqui","aquí","aqui","más","mas","más información","más informacion","mas información","mas informacion","este","enlace","este enlace","empezar","clique aqui","ir","mais informação","mais informações","mais","veja mais","여기","여기를 클릭","클릭","링크","자세히","자세히 보기","계속","이동","전체 보기","här","klicka här","läs mer","mer","mer info","mer information"]),RL={title:"Links have descriptive text",failureTitle:"Links do not have descriptive text",
1050
- description:"Descriptive link text helps search engines understand your content. [Learn more](https://web.dev/link-text/).",displayValue:"{itemCount, plural,\n =1 {1 link found}\n other {# links found}\n }"},kL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/link-text.js",RL);EL.exports=class LinkText extends xL{static get meta(){return{id:"link-text",title:kL(RL.title),failureTitle:kL(RL.failureTitle),description:kL(RL.description),requiredArtifacts:["URL","AnchorElements"]}}static audit(e){const t=e.AnchorElements.filter((e=>e.href&&!e.rel.includes("nofollow"))).filter((t=>{const r=t.href.toLowerCase();return!(r.startsWith("javascript:")||r.startsWith("mailto:")||_L.equalWithExcludedFragments(t.href,e.URL.finalUrl))&&AL.has(t.text.trim().toLowerCase())})).map((e=>({href:e.href,text:e.text.trim()}))),r=xL.makeTableDetails([{key:"href",itemType:"url",text:"Link destination"},{key:"text",itemType:"text",text:"Link Text"}],t,{});let a
1051
- ;return t.length&&(a=kL(RL.displayValue,{itemCount:t.length})),{score:Number(0===t.length),details:r,displayValue:a}}},EL.exports.UIStrings=RL;var DL={exports:{}};const CL=iy,IL={description:"Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data/).",title:"Structured data is valid"},NL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/manual/structured-data.js",IL);DL.exports=class StructuredData extends CL{static get meta(){return Object.assign({id:"structured-data",description:NL(IL.description),title:NL(IL.title)},super.partialMeta)}},DL.exports.UIStrings=IL;var LL={exports:{}};const ML=kc,PL={title:"Document has a meta description",failureTitle:"Document does not have a meta description",
1052
- description:"Meta descriptions may be included in search results to concisely summarize page content. [Learn more](https://web.dev/meta-description/).",explanation:"Description text is empty."},OL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/meta-description.js",PL);LL.exports=class Description extends ML{static get meta(){return{id:"meta-description",title:OL(PL.title),failureTitle:OL(PL.failureTitle),description:OL(PL.description),requiredArtifacts:["MetaElements"]}}static audit(e){const t=e.MetaElements.find((e=>"description"===e.name));if(!t)return{score:0};return 0===(t.content||"").trim().length?{score:0,explanation:OL(PL.explanation)}:{score:1}}},LL.exports.UIStrings=PL;var FL={exports:{}};const UL=kc,jL=ji,BL="application/x-java-applet",$L="application/x-java-bean",qL=new Set(["application/x-shockwave-flash",BL,$L,"application/x-silverlight","application/x-silverlight-2"]),zL=new Set(["swf","flv","class","xap"]),VL=new Set(["code","movie","source","src"]),WL={
1053
- title:"Document avoids plugins",failureTitle:"Document uses plugins",description:"Search engines can't index plugin content, and many devices restrict plugins or don't support them. [Learn more](https://web.dev/plugins/)."},GL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/plugins.js",WL);function isPluginURL(e){try{const t=new jL(e,"http://example.com").pathname.split(".");if(t.length<2)return!1;const r=t[t.length-1];return zL.has(r.trim().toLowerCase())}catch(e){return!1}}FL.exports=class Plugins extends UL{static get meta(){return{id:"plugins",title:GL(WL.title),failureTitle:GL(WL.failureTitle),description:GL(WL.description),requiredArtifacts:["EmbeddedContent"]}}static audit(e){const t=e.EmbeddedContent.filter((e=>{if("APPLET"===e.tagName)return!0;if(("EMBED"===e.tagName||"OBJECT"===e.tagName)&&e.type&&function isPluginType(e){return e=e.trim().toLowerCase(),qL.has(e)||e.startsWith(BL)||e.startsWith($L)}(e.type))return!0;const t=e.src||e.code
1054
- ;if("EMBED"===e.tagName&&t&&isPluginURL(t))return!0;if("OBJECT"===e.tagName&&e.data&&isPluginURL(e.data))return!0;return e.params.filter((e=>VL.has(e.name.trim().toLowerCase())&&isPluginURL(e.value))).length>0})).map((e=>({source:UL.makeNodeItem(e.node)}))),r=UL.makeTableDetails([{key:"source",itemType:"code",text:"Element source"}],t);return{score:Number(0===t.length),details:r}}},FL.exports.UIStrings=WL;var HL={exports:{}};const YL=kc,KL=ji,JL="sitemap",XL="user-agent",ZL="allow",QL="disallow",eM=new Set([ZL,QL]),tM=new Set([XL,QL,ZL,JL,"crawl-delay","clean-param","host","request-rate","visit-time","noindex"]),rM=new Set(["https:","http:","ftp:"]),aM={title:"robots.txt is valid",failureTitle:"robots.txt is not valid",description:"If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt/).",displayValueHttpBadCode:"Request for robots.txt returned HTTP status: {statusCode}",
1055
- displayValueValidationError:"{itemCount, plural,\n =1 {1 error found}\n other {# errors found}\n }",explanation:"Lighthouse was unable to download a robots.txt file"},nM=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/robots-txt.js",aM);function parseLine(e){const t=e.indexOf("#");if(-1!==t&&(e=e.substr(0,t)),0===(e=e.trim()).length)return null;const r=e.indexOf(":");if(-1===r)throw new Error("Syntax not understood");const a=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim();return function verifyDirective(e,t){if(!tM.has(e))throw new Error("Unknown directive");if(e===JL){let e;try{e=new KL(t)}catch(e){throw new Error("Invalid sitemap URL")}if(!rM.has(e.protocol))throw new Error("Invalid sitemap URL protocol")}if(e===XL&&!t)throw new Error("No user-agent specified");if(e===ZL||e===QL){if(""!==t&&"/"!==t[0]&&"*"!==t[0])throw new Error('Pattern should either be empty, start with "/" or "*"');const e=t.indexOf("$")
1056
- ;if(-1!==e&&e!==t.length-1)throw new Error('"$" should only be used at the end of the pattern')}}(a,n),{directive:a,value:n}}HL.exports=class RobotsTxt extends YL{static get meta(){return{id:"robots-txt",title:nM(aM.title),failureTitle:nM(aM.failureTitle),description:nM(aM.description),requiredArtifacts:["RobotsTxt"]}}static audit(e){const{status:t,content:r}=e.RobotsTxt;if(!t)return{score:0,explanation:nM(aM.explanation)};if(t>=500)return{score:0,displayValue:nM(aM.displayValueHttpBadCode,{statusCode:t})};if(t>=400||""===r)return{score:1,notApplicable:!0};if(null===r)throw new Error(`Status ${t} was valid, but content was null`);const a=function validateRobots(e){const t=[];let r=!1;return e.split(/\r\n|\r|\n/).forEach(((e,a)=>{let n;try{n=parseLine(e)}catch(r){t.push({index:(a+1).toString(),line:e,message:r.message.toString()})}n&&(n.directive===XL?r=!0:!r&&eM.has(n.directive)&&t.push({index:(a+1).toString(),line:e,message:"No user-agent specified"}))})),t
1057
- }(r),n=YL.makeTableDetails([{key:"index",itemType:"text",text:"Line #"},{key:"line",itemType:"code",text:"Content"},{key:"message",itemType:"code",text:"Error"}],a,{});let i;return a.length&&(i=nM(aM.displayValueValidationError,{itemCount:a.length})),{score:Number(0===a.length),details:n,displayValue:i}}},HL.exports.UIStrings=aM;var iM={exports:{}};const oM=kp;function almostEqual(e,t){return Math.abs(e-t)<=10}function mergeTouchingClientRects(e){for(let t=0;t<e.length;t++)for(let r=t+1;r<e.length;r++){const a=e[t],n=e[r],i=almostEqual(a.top,n.top)||almostEqual(a.bottom,n.bottom),o=almostEqual(a.left,n.left)||almostEqual(a.right,n.right);if(oM.rectsTouchOrOverlap(a,n)&&(i||o)){const t=oM.getBoundingRect([a,n]),r=oM.getRectCenterPoint(t);if(!oM.rectContainsPoint(a,r)&&!oM.rectContainsPoint(n,r))continue;return(e=e.filter((e=>e!==a&&e!==n))).push(t),mergeTouchingClientRects(e)}}return e}var sM={getTappableRectsFromClientRects:function getTappableRectsFromClientRects$1(e){
1058
- return e=oM.filterOutTinyRects(e),e=mergeTouchingClientRects(e=oM.filterOutRectsContainedByOthers(e))}};const cM=kc,lM=YN,{rectsTouchOrOverlap:uM,getRectOverlapArea:dM,getRectAtCenter:mM,allRectsContainedWithinEachOther:pM,getLargestRect:hM,getBoundingRectWithPadding:gM}=kp,{getTappableRectsFromClientRects:fM}=sM,yM=oi,vM={title:"Tap targets are sized appropriately",failureTitle:"Tap targets are not sized appropriately",description:"Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets/).",tapTargetHeader:"Tap Target",overlappingTargetHeader:"Overlapping Target",explanationViewportMetaNotOptimized:"Tap targets are too small because there's no viewport meta tag optimized for mobile screens",displayValue:"{decimalProportion, number, percent} appropriately sized tap targets"
1059
- },bM=yM.createMessageInstanceIdFn("lighthouse-core/audits/seo/tap-targets.js",vM);function clientRectBelowMinimumSize(e){return e.width<48||e.height<48}function getOverlapFailureForTargetPair(e,t){let r=null;for(const a of e){const e=mM(a,48),n=dM(e,a);for(const a of t){const t=dM(e,a),i=t/n;i<.25||(!r||i>r.overlapScoreRatio)&&(r={overlapScoreRatio:i,tapTargetScore:n,overlappingTargetScore:t})}}return r}class TapTargets extends cM{static get meta(){return{id:"tap-targets",title:bM(vM.title),failureTitle:bM(vM.failureTitle),description:bM(vM.description),requiredArtifacts:["MetaElements","TapTargets"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await lM.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:bM(vM.explanationViewportMetaNotOptimized)};const r=function getBoundedTapTargets(e){return e.map((e=>({tapTarget:e,paddedBoundsRect:gM(e.clientRects,48)})))}(e.TapTargets),a=function getAllOverlapFailures(e,t){
1060
- const r=[];return e.forEach((e=>{const a=fM(e.tapTarget.clientRects);for(const n of t){if(n===e)continue;if(!uM(e.paddedBoundsRect,n.paddedBoundsRect))continue;if(e.tapTarget.href===n.tapTarget.href&&/https?:\/\//.test(e.tapTarget.href))continue;const t=n.tapTarget.clientRects;if(pM(a,t))continue;const i=getOverlapFailureForTargetPair(a,t);i&&r.push({...i,tapTarget:e.tapTarget,overlappingTarget:n.tapTarget})}})),r}(function getTooSmallTargets(e){return e.filter((e=>e.tapTarget.clientRects.every(clientRectBelowMinimumSize)))}(r),r),n=function getTableItems(e){const t=e.map((e=>{const t=hM(e.tapTarget.clientRects),r=Math.floor(t.width),a=Math.floor(t.height),n=r+"x"+a;return{tapTarget:cM.makeNodeItem(e.tapTarget.node),overlappingTarget:cM.makeNodeItem(e.overlappingTarget.node),tapTargetScore:e.tapTargetScore,overlappingTargetScore:e.overlappingTargetScore,overlapScoreRatio:e.overlapScoreRatio,size:n,width:r,height:a}}));return t.sort(((e,t)=>t.overlapScoreRatio-e.overlapScoreRatio)),t
1061
- }(function mergeSymmetricFailures(e){const t=[];return e.forEach(((r,a)=>{const n=e.find((e=>e.tapTarget===r.overlappingTarget&&e.overlappingTarget===r.tapTarget));if(!n)return void t.push(r);const{overlapScoreRatio:i}=r,{overlapScoreRatio:o}=n;(i>o||i===o&&a<e.indexOf(n))&&t.push(r)})),t}(a)),i=[{key:"tapTarget",itemType:"node",text:bM(vM.tapTargetHeader)},{key:"size",itemType:"text",text:bM(yM.UIStrings.columnSize)},{key:"overlappingTarget",itemType:"node",text:bM(vM.overlappingTargetHeader)}],o=cM.makeTableDetails(i,n),s=e.TapTargets.length,c=new Set(a.map((e=>e.tapTarget))).size;let l=1,u=1;c>0&&(u=(s-c)/s,l=.89*u);return{score:l,details:o,displayValue:bM(vM.displayValue,{decimalProportion:u})}}}TapTargets.FINGER_SIZE_PX=48,iM.exports=TapTargets,iM.exports.UIStrings=vM;var wM={exports:{}};const SM=kc,TM=oi,EM=HT,xM=Lo,_M=Fo,AM={title:"Initial server response time was short",failureTitle:"Reduce initial server response time",
1062
- description:"Keep the server response time for the main document short because all other requests depend on it. [Learn more](https://web.dev/time-to-first-byte/).",displayValue:"Root document took {timeInMs, number, milliseconds} ms"},RM=TM.createMessageInstanceIdFn("lighthouse-core/audits/server-response-time.js",AM);class ServerResponseTime extends SM{static get meta(){return{id:"server-response-time",title:RM(AM.title),failureTitle:RM(AM.failureTitle),description:RM(AM.description),supportedModes:["timespan","navigation"],requiredArtifacts:["devtoolsLogs","URL","GatherContext"]}}static calculateResponseTime(e){const t=e.timing;return t?t.receiveHeadersEnd-t.sendEnd:0}static async audit(e,t){const r=e.devtoolsLogs[SM.DEFAULT_PASS];let a;if("timespan"===e.GatherContext.gatherMode){const n=await xM.request(r,t),i=_M.findOptionalMainDocument(n,e.URL.finalUrl);if(!i)return{score:null,notApplicable:!0};a=i}else a=await EM.request({devtoolsLog:r,URL:e.URL},t)
1063
- ;const n=ServerResponseTime.calculateResponseTime(a),i=n<600,o=RM(AM.displayValue,{timeInMs:n}),s=[{key:"url",valueType:"url",label:RM(TM.UIStrings.columnURL)},{key:"responseTime",valueType:"timespanMs",label:RM(TM.UIStrings.columnTimeSpent)}],c=SM.makeOpportunityDetails(s,[{url:a.url,responseTime:n}],n-100);return{numericValue:n,numericUnit:"millisecond",score:Number(i),displayValue:o,details:c}}}wM.exports=ServerResponseTime,wM.exports.UIStrings=AM;var kM={exports:{}};const DM=ji,CM=kc,IM={title:"Registers a service worker that controls page and `start_url`",failureTitle:"Does not register a service worker that controls page and `start_url`",description:"The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://web.dev/service-worker/).",explanationOutOfScope:"This origin has one or more service workers, however the page ({pageUrl}) is not in scope.",
1064
- explanationNoManifest:"This page is controlled by a service worker, however no `start_url` was found because no manifest was fetched.",explanationBadManifest:"This page is controlled by a service worker, however no `start_url` was found because manifest failed to parse as valid JSON",explanationBadStartUrl:"This page is controlled by a service worker, however the `start_url` ({startUrl}) is not in the service worker's scope ({scopeUrl})"},NM=oi.createMessageInstanceIdFn("lighthouse-core/audits/service-worker.js",IM);class ServiceWorker extends CM{static get meta(){return{id:"service-worker",title:NM(IM.title),failureTitle:NM(IM.failureTitle),description:NM(IM.description),requiredArtifacts:["URL","ServiceWorker","WebAppManifest"]}}static getVersionsForOrigin(e,t){return e.filter((e=>"activated"===e.status)).filter((e=>new DM(e.scriptURL).origin===t.origin))}static getControllingServiceWorker(e,t,r){const a=[];for(const r of e){const e=t.find((e=>e.registrationId===r.registrationId))
1065
- ;if(e){const t=new DM(e.scopeURL).href,n=new DM(r.scriptURL).href;a.push({scopeUrl:t,scriptUrl:n})}}return a.filter((e=>r.href.startsWith(e.scopeUrl))).sort(((e,t)=>e.scopeUrl.length-t.scopeUrl.length)).pop()}static checkStartUrl(e,t){if(!e)return NM(IM.explanationNoManifest);if(!e.value)return NM(IM.explanationBadManifest);const r=e.value.start_url.value;return r.startsWith(t)?void 0:NM(IM.explanationBadStartUrl,{startUrl:r,scopeUrl:t})}static audit(e){const t=new DM(e.URL.finalUrl),{versions:r,registrations:a}=e.ServiceWorker,n=ServiceWorker.getVersionsForOrigin(r,t);if(0===n.length)return{score:0};const i=ServiceWorker.getControllingServiceWorker(n,a,t);if(!i)return{score:0,explanation:NM(IM.explanationOutOfScope,{pageUrl:t.href})};const{scriptUrl:o,scopeUrl:s}=i,c={type:"debugdata",scriptUrl:o,scopeUrl:s},l=ServiceWorker.checkStartUrl(e.WebAppManifest,i.scopeUrl);return l?{score:0,details:c,explanation:l}:{score:1,details:c}}}kM.exports=ServiceWorker,kM.exports.UIStrings=IM
1066
- ;var LM={exports:{}};const MM=kc;var PM=class MultiCheckAudit$2 extends MM{static async audit(e,t){const r=await this.audit_(e,t);return this.createAuditProduct(r)}static createAuditProduct(e){const t={...e,...e.manifestValues,manifestValues:void 0,allChecks:void 0};e.manifestValues?.allChecks&&e.manifestValues.allChecks.forEach((e=>{t[e.id]=e.passing}));const r={type:"debugdata",items:[t]};return e.failures.length>0?{score:0,explanation:`Failures: ${e.failures.join(",\n")}.`,details:r}:{score:1,details:r}}static audit_(e,t){throw new Error("audit_ unimplemented")}};const OM=PM,FM=DA,UM={title:"Configured for a custom splash screen",failureTitle:"Is not configured for a custom splash screen",description:"A themed splash screen ensures a high-quality experience when users launch your app from their homescreens. [Learn more](https://web.dev/splash-screen/)."},jM=oi.createMessageInstanceIdFn("lighthouse-core/audits/splash-screen.js",UM);class SplashScreen extends OM{static get meta(){
1067
- return{id:"splash-screen",title:jM(UM.title),failureTitle:jM(UM.failureTitle),description:jM(UM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors"]}}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=["hasName","hasBackgroundColor","hasThemeColor","hasIconsAtLeast512px"];e.allChecks.filter((e=>r.includes(e.id))).forEach((e=>{e.passing||t.push(e.failureText)}))}static async audit_(e,t){const r=[],a=await FM.request(e,t);return SplashScreen.assessManifest(a,r),{failures:r,manifestValues:a}}}LM.exports=SplashScreen,LM.exports.UIStrings=UM;var BM={exports:{}};const $M=PM,qM=DA,zM=Rs,VM={title:"Sets a theme color for the address bar.",failureTitle:"Does not set a theme color for the address bar.",description:"The browser address bar can be themed to match your site. [Learn more](https://web.dev/themed-omnibox/)."
1068
- },WM=oi.createMessageInstanceIdFn("lighthouse-core/audits/themed-omnibox.js",VM);class ThemedOmnibox extends $M{static get meta(){return{id:"themed-omnibox",title:WM(VM.title),failureTitle:WM(VM.failureTitle),description:WM(VM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors","MetaElements"]}}static isValidColor(e){return zM.valueType(e)===zM.TYPES.COLOR}static assessMetaThemecolor(e,t){e?ThemedOmnibox.isValidColor(e.content||"")||t.push("The theme-color meta tag did not contain a valid CSS color"):t.push('No `<meta name="theme-color">` tag found')}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=e.allChecks.find((e=>"hasThemeColor"===e.id));r&&!r.passing&&t.push(r.failureText)}static async audit_(e,t){const r=[],a=e.MetaElements.find((e=>"theme-color"===e.name)),n=await qM.request(e,t);return ThemedOmnibox.assessManifest(n,r),ThemedOmnibox.assessMetaThemecolor(a,r),
1069
- {failures:r,manifestValues:n,themeColor:a?.content||null}}}BM.exports=ThemedOmnibox,BM.exports.UIStrings=VM;var GM={exports:{}},HM={exports:{}};const YM=kc,KM=oi,JM=uw,XM=Lo,ZM=Rv,{getJavaScriptURLs:QM,getAttributableURLForTask:eP}=Iv,tP={title:"Minimize third-party usage",failureTitle:"Reduce the impact of third-party code",description:"Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).",columnThirdParty:"Third-Party",displayValue:"Third-party code blocked the main thread for {timeInMs, number, milliseconds} ms"},rP=KM.createMessageInstanceIdFn("lighthouse-core/audits/third-party-summary.js",tP);class ThirdPartySummary$1 extends YM{static get meta(){return{id:"third-party-summary",title:rP(tP.title),
1070
- failureTitle:rP(tP.failureTitle),description:rP(tP.description),requiredArtifacts:["traces","devtoolsLogs","URL"]}}static getSummaries(e,t,r){const a=new Map,n=new Map,i={mainThreadTime:0,blockingTime:0,transferSize:0};for(const t of e){const e=a.get(t.url)||{...i};e.transferSize+=t.transferSize,a.set(t.url,e)}const o=QM(e);for(const e of t){const t=eP(e,o),n=a.get(t)||{...i},s=e.selfTime*r;n.mainThreadTime+=s,n.blockingTime+=Math.max(s-50,0),a.set(t,n)}const s=new Map;for(const[e,t]of a.entries()){const r=JM.getEntity(e);if(!r){a.delete(e);continue}const o=n.get(r)||{...i};o.transferSize+=t.transferSize,o.mainThreadTime+=t.mainThreadTime,o.blockingTime+=t.blockingTime,n.set(r,o);const c=s.get(r)||[];c.push(e),s.set(r,c)}return{byURL:a,byEntity:n,urls:s}}static makeSubItems(e,t,r){let a=(t.urls.get(e)||[]).map((e=>({url:e,...t.byURL.get(e)}))).filter((e=>e.transferSize>0)).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize));const n={transferSize:0,blockingTime:0
1071
- },i=Math.max(4096,r.transferSize/20),o=Math.min(5,a.length);let s=0;for(;s<o;){const e=a[s];if(0===e.blockingTime&&e.transferSize<i)break;s++,n.transferSize+=e.transferSize,n.blockingTime+=e.blockingTime}if(!n.blockingTime&&!n.transferSize)return[];a=a.slice(0,s);const c={url:rP(KM.UIStrings.otherResourcesLabel),transferSize:r.transferSize-n.transferSize,blockingTime:r.blockingTime-n.blockingTime};return c.transferSize>i&&a.push(c),a}static async audit(e,t){const r=t.settings||{},a=e.traces[YM.DEFAULT_PASS],n=e.devtoolsLogs[YM.DEFAULT_PASS],i=await XM.request(n,t),o=JM.getEntity(e.URL.finalUrl),s=await ZM.request(a,t),c="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,l=ThirdPartySummary$1.getSummaries(i,s,c),u={wastedBytes:0,wastedMs:0},d=Array.from(l.byEntity.entries()).filter((([e])=>!(o&&o.name===e.name))).map((([e,t])=>(u.wastedBytes+=t.transferSize,u.wastedMs+=t.blockingTime,{...t,entity:{type:"link",text:e.name,url:e.homepage||""},subItems:{type:"subitems",
1072
- items:ThirdPartySummary$1.makeSubItems(e,l,t)}}))).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize)),m=[{key:"entity",itemType:"link",text:rP(tP.columnThirdParty),subItemsHeading:{key:"url",itemType:"url"}},{key:"transferSize",granularity:1,itemType:"bytes",text:rP(KM.UIStrings.columnTransferSize),subItemsHeading:{key:"transferSize"}},{key:"blockingTime",granularity:1,itemType:"ms",text:rP(KM.UIStrings.columnBlockingTime),subItemsHeading:{key:"blockingTime"}}];return d.length?{score:Number(u.wastedMs<=250),displayValue:rP(tP.displayValue,{timeInMs:u.wastedMs}),details:YM.makeTableDetails(m,d,u)}:{score:1,notApplicable:!0}}}HM.exports=ThirdPartySummary$1,HM.exports.UIStrings=tP;const aP=kc,nP=oi,iP=uw,oP=Lo,sP=HT,cP=Rv,lP=HM.exports,uP={title:"Lazy load third-party resources with facades",failureTitle:"Some third-party resources can be lazy loaded with a facade",
1073
- description:"Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required. [Learn more](https://web.dev/third-party-facades/).",displayValue:"{itemCount, plural,\n =1 {# facade alternative available}\n other {# facade alternatives available}\n }",columnProduct:"Product",categoryVideo:"{productName} (Video)",categoryCustomerSuccess:"{productName} (Customer Success)",categoryMarketing:"{productName} (Marketing)",categorySocial:"{productName} (Social)"},dP=nP.createMessageInstanceIdFn("lighthouse-core/audits/third-party-facades.js",uP),mP={video:uP.categoryVideo,"customer-success":uP.categoryCustomerSuccess,marketing:uP.categoryMarketing,social:uP.categorySocial};class ThirdPartyFacades extends aP{static get meta(){return{id:"third-party-facades",title:dP(uP.title),failureTitle:dP(uP.failureTitle),description:dP(uP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL"]}}static condenseItems(e){
1074
- e.sort(((e,t)=>t.transferSize-e.transferSize));let t=e.findIndex((e=>e.transferSize<1e3))||1;if((-1===t||t>5)&&(t=5),t>=e.length-1)return;const r=e.splice(t).reduce(((e,t)=>(e.transferSize+=t.transferSize,e.blockingTime+=t.blockingTime,e)));r.transferSize<1e3||(r.url=dP(nP.UIStrings.otherResourcesLabel),e.push(r))}static getProductsWithFacade(e,t){const r=new Map;for(const a of e.keys()){const e=iP.getEntity(a);if(!e||iP.isFirstParty(a,t))continue;const n=iP.getProduct(a);n&&n.facades&&n.facades.length&&(r.has(n.name)||r.set(n.name,{product:n,entity:e}))}return Array.from(r.values())}static async audit(e,t){const r=t.settings,a=e.traces[aP.DEFAULT_PASS],n=e.devtoolsLogs[aP.DEFAULT_PASS],i=await oP.request(n,t),o=await sP.request({devtoolsLog:n,URL:e.URL},t),s=iP.getEntity(o.url),c=await cP.request(a,t),l="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,u=lP.getSummaries(i,c,l),d=ThirdPartyFacades.getProductsWithFacade(u.byURL,s),m=[]
1075
- ;for(const{product:e,entity:t}of d){const r=mP[e.categories[0]];let a;a=r?dP(r,{productName:e.name}):e.name;const n=u.urls.get(t),i=u.byEntity.get(t);if(!n||!i)continue;const o=Array.from(n).map((e=>({url:e,...u.byURL.get(e)})));this.condenseItems(o),m.push({product:a,transferSize:i.transferSize,blockingTime:i.blockingTime,subItems:{type:"subitems",items:o}})}if(!m.length)return{score:1,notApplicable:!0};const p=[{key:"product",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:dP(uP.columnProduct)},{key:"transferSize",itemType:"bytes",subItemsHeading:{key:"transferSize"},granularity:1,text:dP(nP.UIStrings.columnTransferSize)},{key:"blockingTime",itemType:"ms",subItemsHeading:{key:"blockingTime"},granularity:1,text:dP(nP.UIStrings.columnBlockingTime)}];return{score:0,displayValue:dP(uP.displayValue,{itemCount:m.length}),details:aP.makeTableDetails(p,m)}}}GM.exports=ThirdPartyFacades,GM.exports.UIStrings=uP;var pP={exports:{}};const hP=kc,gP=CD,fP=HT,yP=Tu,vP=oi,bP={
1076
- title:"Timing budget",description:"Set a timing budget to help you keep an eye on the performance of your site. Performant sites load fast and respond to user input events quickly. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",columnTimingMetric:"Metric",columnMeasurement:"Measurement"},wP=vP.createMessageInstanceIdFn("lighthouse-core/audits/timing-budget.js",bP);pP.exports=class TimingBudget extends hP{static get meta(){return{id:"timing-budget",title:wP(bP.title),description:wP(bP.description),scoreDisplayMode:hP.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL","GatherContext"]}}static getRowLabel(e){const t={"first-contentful-paint":vP.UIStrings.firstContentfulPaintMetric,interactive:vP.UIStrings.interactiveMetric,"first-meaningful-paint":vP.UIStrings.firstMeaningfulPaintMetric,"max-potential-fid":vP.UIStrings.maxPotentialFIDMetric,"total-blocking-time":vP.UIStrings.totalBlockingTimeMetric,
1077
- "speed-index":vP.UIStrings.speedIndexMetric,"largest-contentful-paint":vP.UIStrings.largestContentfulPaintMetric,"cumulative-layout-shift":vP.UIStrings.cumulativeLayoutShiftMetric};return wP(t[e])}static getMeasurement(e,t){return{"first-contentful-paint":t.firstContentfulPaint,interactive:t.interactive,"first-meaningful-paint":t.firstMeaningfulPaint,"max-potential-fid":t.maxPotentialFID,"total-blocking-time":t.totalBlockingTime,"speed-index":t.speedIndex,"largest-contentful-paint":t.largestContentfulPaint,"cumulative-layout-shift":t.cumulativeLayoutShift}[e]}static tableItems(e,t){let r=[];if(!e.timings)return r;r=e.timings.map((e=>{const r=e.metric,a=this.getRowLabel(r),n=this.getMeasurement(r,t);return{metric:r,label:a,measurement:n,overBudget:n&&n>e.budget?n-e.budget:void 0}})).sort(((e,t)=>(t.overBudget||0)-(e.overBudget||0)));const a=r.find((e=>"cumulative-layout-shift"===e.metric));return a&&("number"==typeof a.measurement&&(a.measurement={type:"numeric",
1078
- value:Number(a.measurement),granularity:.01}),"number"==typeof a.overBudget&&(a.overBudget={type:"numeric",value:Number(a.overBudget),granularity:.01})),r}static async audit(e,t){const r=e.GatherContext,a=e.devtoolsLogs[hP.DEFAULT_PASS],n=e.traces[hP.DEFAULT_PASS],i=await fP.request({URL:e.URL,devtoolsLog:a},t),o={trace:n,devtoolsLog:a,gatherContext:r,settings:t.settings},s=(await gP.request(o,t)).metrics,c=yP.getMatchingBudget(t.settings.budgets,i.url);if(!c)return{score:0,notApplicable:!0};const l=[{key:"label",itemType:"text",text:wP(bP.columnTimingMetric)},{key:"measurement",itemType:"ms",text:wP(bP.columnMeasurement)},{key:"overBudget",itemType:"ms",text:wP(vP.UIStrings.columnOverBudget)}];return{details:hP.makeTableDetails(l,this.tableItems(c,s)),score:1}}},pP.exports.UIStrings=bP;var SP={exports:{}};const TP=kc,EP=oi,xP=ji,_P={title:"Image elements have explicit `width` and `height`",failureTitle:"Image elements do not have explicit `width` and `height`",
1079
- description:"Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn more](https://web.dev/optimize-cls/#images-without-dimensions)"},AP=EP.createMessageInstanceIdFn("lighthouse-core/audits/unsized-images.js",_P);class UnsizedImages extends TP{static get meta(){return{id:"unsized-images",title:AP(_P.title),failureTitle:AP(_P.failureTitle),description:AP(_P.description),requiredArtifacts:["ImageElements"]}}static doesHtmlAttrProvideExplicitSize(e){if(!e)return!1;if(e.startsWith("+"))return!1;return parseInt(e,10)>=0}static isCssPropExplicitlySet(e){return!!e&&!["auto","initial","unset","inherit"].includes(e)}static isSizedImage(e){if(void 0===e.cssEffectiveRules)return!0
1080
- ;const t=e.attributeWidth,r=e.attributeHeight,a=e.cssEffectiveRules.width,n=e.cssEffectiveRules.height,i=e.cssEffectiveRules.aspectRatio,o=UnsizedImages.doesHtmlAttrProvideExplicitSize(t),s=UnsizedImages.isCssPropExplicitlySet(a),c=UnsizedImages.doesHtmlAttrProvideExplicitSize(r),l=UnsizedImages.isCssPropExplicitlySet(n),u=UnsizedImages.isCssPropExplicitlySet(i),d=o||s,m=c||l;return d&&m||d&&u||m&&u}static isNonNetworkSvg(e){const t="image/svg+xml"===xP.guessMimeType(e.src),r=e.src.slice(0,e.src.indexOf(":")),a=xP.isNonNetworkProtocol(r);return t&&a}static async audit(e){const t=e.ImageElements.filter((e=>!e.isCss&&!e.isInShadowDOM)),r=[];for(const e of t){if("fixed"===e.computedStyles.position||"absolute"===e.computedStyles.position)continue;if(UnsizedImages.isNonNetworkSvg(e))continue;if(UnsizedImages.isSizedImage(e))continue;const t=e.node.boundingRect;0===t.width&&0===t.height||r.push({url:xP.elideDataURI(e.src),node:TP.makeNodeItem(e.node)})}const a=[{key:"node",itemType:"node",
1081
- text:""},{key:"url",itemType:"url",text:AP(EP.UIStrings.columnURL)}];return{score:r.length>0?0:1,notApplicable:0===t.length,details:TP.makeTableDetails(a,r)}}}SP.exports=UnsizedImages,SP.exports.UIStrings=_P;var RP={exports:{}};const kP=Ao,DP=Yp;var CP=kP(class UserTimings$1{static async compute_(e,t){const r=await DP.request(e,t),a=[],n={};return r.processEvents.filter((e=>!!e.cat.includes("blink.user_timing")&&("requestStart"!==e.name&&"navigationStart"!==e.name&&"paintNonDefaultBackgroundColor"!==e.name&&void 0===e.args.frame))).forEach((e=>{"R"===e.ph||"I"===e.ph.toUpperCase()?a.push({name:e.name,isMark:!0,args:e.args,startTime:e.ts}):"b"===e.ph.toLowerCase()?n[e.name]=e.ts:"e"===e.ph.toLowerCase()&&a.push({name:e.name,isMark:!1,args:e.args,startTime:n[e.name],endTime:e.ts,duration:e.ts-n[e.name]})})),a.forEach((e=>{e.startTime=(e.startTime-r.timeOriginEvt.ts)/1e3,e.isMark||(e.endTime=(e.endTime-r.timeOriginEvt.ts)/1e3,e.duration=e.duration/1e3)})),a}},null)
1082
- ;const IP=kc,NP=oi,LP=CP,MP={title:"User Timing marks and measures",description:"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more](https://web.dev/user-timings/).",displayValue:"{itemCount, plural,\n =1 {1 user timing}\n other {# user timings}\n }",columnType:"Type"},PP=NP.createMessageInstanceIdFn("lighthouse-core/audits/user-timings.js",MP);class UserTimings extends IP{static get meta(){return{id:"user-timings",title:PP(MP.title),description:PP(MP.description),scoreDisplayMode:IP.SCORING_MODES.INFORMATIVE,requiredArtifacts:["traces"]}}static get excludedPrefixes(){return["goog_"]}static excludeEvent(e){return UserTimings.excludedPrefixes.every((t=>!e.name.startsWith(t)))}static audit(e,t){const r=e.traces[IP.DEFAULT_PASS];return LP.request(r,t).then((e=>{const t=e.filter(UserTimings.excludeEvent),r=t.map((e=>({name:e.name,startTime:e.startTime,duration:e.isMark?void 0:e.duration,
1083
- timingType:e.isMark?"Mark":"Measure"}))).sort(((e,t)=>e.timingType===t.timingType?e.startTime-t.startTime:"Measure"===e.timingType?-1:1)),a=[{key:"name",itemType:"text",text:PP(NP.UIStrings.columnName)},{key:"timingType",itemType:"text",text:PP(MP.columnType)},{key:"startTime",itemType:"ms",granularity:.01,text:PP(NP.UIStrings.columnStartTime)},{key:"duration",itemType:"ms",granularity:.01,text:PP(NP.UIStrings.columnDuration)}],n=IP.makeTableDetails(a,r);let i;return t.length&&(i=PP(MP.displayValue,{itemCount:t.length})),{score:Number(0===t.length),notApplicable:0===t.length,displayValue:i,details:n}}))}}RP.exports=UserTimings,RP.exports.UIStrings=MP;var OP={exports:{}};const FP=kc,UP=Ib,jP=ji,BP=oi,$P=Lo,qP=HT,zP=Dl,VP=Yp,WP=Xp,GP=eb,HP=vk,YP={title:"Preconnect to required origins",description:"Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect/).",
1084
- unusedWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Only use `preconnect` for important origins that the page will certainly request.',crossoriginWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.',tooManyPreconnectLinksWarning:"More than 2 `<link rel=preconnect>` connections were found. These should be used sparingly and only to the most important origins."},KP=BP.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preconnect.js",YP);class UsesRelPreconnectAudit extends FP{static get meta(){return{id:"uses-rel-preconnect",title:KP(YP.title),description:KP(YP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL","LinkElements"],scoreDisplayMode:FP.SCORING_MODES.NUMERIC}}static hasValidTiming(e){return!!e.timing&&e.timing.connectEnd>0&&e.timing.connectStart>0}
1085
- static hasAlreadyConnectedToOrigin(e){return!!e.timing&&e.timing.dnsEnd-e.timing.dnsStart==0&&e.timing.connectEnd-e.timing.connectStart==0}static socketStartTimeIsBelowThreshold(e,t){return Math.max(0,e.startTime-t.endTime)<15}static async audit(e,t){const r=e.traces[UsesRelPreconnectAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS],n=t.settings;let i=0;const o=[],s=await VP.request(r,t),[c,l,u,d,m]=await Promise.all([$P.request(a,t),qP.request({devtoolsLog:a,URL:e.URL},t),zP.request({devtoolsLog:a,settings:n},t),WP.request(s,t),GP.request({trace:r,devtoolsLog:a},t)]),{rtt:p,additionalRttByOrigin:h}=u.getOptions(),f=await HP.getPessimisticGraph(m,d),y=new Set;f.traverse((e=>{"network"===e.type&&y.add(e.record.url)}));const v=new Map;c.forEach((e=>{
1086
- if(!UsesRelPreconnectAudit.hasValidTiming(e)||e.initiator.url===l.url||!e.parsedURL||!e.parsedURL.securityOrigin||l.parsedURL.securityOrigin===e.parsedURL.securityOrigin||!y.has(e.url)||UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(e)||!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(e,l))return;const t=e.parsedURL.securityOrigin,r=v.get(t)||[];r.push(e),v.set(t,r)}));const b=e.LinkElements.filter((e=>"preconnect"===e.rel)),w=new Set(b.map((e=>jP.getOrigin(e.href||""))));let S=[];v.forEach((e=>{const t=e.reduce(((e,t)=>t.startTime<e.startTime?t:e));if(!t.timing)return;const r=t.parsedURL.securityOrigin,a=h.get(r)||0;let n=p+a;"https"===t.parsedURL.scheme&&(n*=2);const s=1e3*t.startTime-1e3*l.endTime+t.timing.dnsStart,c=Math.min(n,s);c<50||(w.has(r)?o.push(KP(YP.crossoriginWarning,{securityOrigin:r})):(i=Math.max(c,i),S.push({url:r,wastedMs:c})))})),S=S.sort(((e,t)=>t.wastedMs-e.wastedMs))
1087
- ;for(const e of w)e&&(c.some((t=>e===t.parsedURL.securityOrigin))||o.push(KP(YP.unusedWarning,{securityOrigin:e})));if(b.length>=2)return{score:1,warnings:b.length>=3?[...o,KP(YP.tooManyPreconnectLinksWarning)]:o};const T=[{key:"url",valueType:"url",label:KP(BP.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:KP(BP.UIStrings.columnWastedMs)}],E=FP.makeOpportunityDetails(T,S,i);return{score:UP.scoreForWastedMs(i),numericValue:i,numericUnit:"millisecond",displayValue:i?KP(BP.UIStrings.displayValueMsSavings,{wastedMs:i}):"",warnings:o,details:E}}}OP.exports=UsesRelPreconnectAudit,OP.exports.UIStrings=YP;var JP={exports:{}};const XP=ji,ZP=Ki,QP=kc,eO=Ib,tO=ZT,rO=oi,aO=HT,nO=eb,iO=Dl,oO={title:"Preload key requests",description:"Consider using `<link rel=preload>` to prioritize fetching resources that are currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload/).",
1088
- crossoriginWarning:'A preload `<link>` was found for "{preloadURL}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.'},sO=rO.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preload.js",oO);class UsesRelPreloadAudit extends QP{static get meta(){return{id:"uses-rel-preload",title:sO(oO.title),description:sO(oO.description),supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL"],scoreDisplayMode:QP.SCORING_MODES.NUMERIC}}static getURLsToPreload(e,t){const r=new Set;return t.traverse(((t,a)=>{if("network"!==t.type)return;const n=a.slice(1).filter((e=>"network"===e.type));UsesRelPreloadAudit.shouldPreloadRequest(t.record,e,n)&&r.add(t.record.url)})),r}static getURLsFailedToPreload(e){const t=[];e.traverse((e=>"network"===e.type&&t.push(e.record)));const r=t.filter((e=>e.isLinkPreload)),a=new Map;for(const e of r){const t=a.get(e.frameId)||new Set;t.add(e.url),a.set(e.frameId,t)}const n=t.filter((e=>{
1089
- const t=a.get(e.frameId);if(!t)return!1;if(!t.has(e.url))return!1;return!(e.fromDiskCache||e.fromMemoryCache||e.fromPrefetchCache)&&!e.isLinkPreload}));return new Set(n.map((e=>e.url)))}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!!tO.isCritical(e,t)&&(!ZP.isNonNetworkRequest(e)&&(r.length===a+2&&(e.frameId===t.frameId&&XP.rootDomainsMatch(e.url,t.url)))))}static computeWasteWithGraph(e,t,r){if(!e.size)return{wastedMs:0,results:[]};const a=r.simulate(t,{flexibleOrdering:!0}),n=t.cloneWithRelationships(),i=[];let o=null;if(n.traverse((t=>{"network"===t.type&&(t.isMainDocument()?o=t:t.record&&e.has(t.record.url)&&i.push(t))})),!o)throw new Error("Could not find main document node");for(const e of i)e.removeAllDependencies(),e.addDependency(o);const s=r.simulate(n,{flexibleOrdering:!0}),c=Array.from(a.nodeTimings.keys()).reduce(((e,t)=>e.set(t.record,t)),new Map),l=[];for(const e of i){
1090
- const t=c.get(e.record),r=s.nodeTimings.get(e),n=a.nodeTimings.get(t);if(!n||!r)throw new Error("Missing preload node");const i=Math.round(n.endTime-r.endTime);i<100||l.push({url:e.record.url,wastedMs:i})}return l.length?{wastedMs:Math.max(...l.map((e=>e.wastedMs))),results:l}:{wastedMs:0,results:l}}static async audit_(e,t){const r=e.traces[UsesRelPreloadAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS],n=e.URL,i={devtoolsLog:a,settings:t.settings},[o,s,c]=await Promise.all([aO.request({devtoolsLog:a,URL:n},t),nO.request({trace:r,devtoolsLog:a},t),iO.request(i,t)]),l=UsesRelPreloadAudit.getURLsToPreload(o,s),{results:u,wastedMs:d}=UsesRelPreloadAudit.computeWasteWithGraph(l,s,c);let m;u.sort(((e,t)=>t.wastedMs-e.wastedMs));const p=UsesRelPreloadAudit.getURLsFailedToPreload(s);p.size&&(m=Array.from(p).map((e=>sO(oO.crossoriginWarning,{preloadURL:e}))));const h=[{key:"url",valueType:"url",label:sO(rO.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",
1091
- label:sO(rO.UIStrings.columnWastedMs)}],f=QP.makeOpportunityDetails(h,u,d);return{score:eO.scoreForWastedMs(d),numericValue:d,numericUnit:"millisecond",displayValue:d?sO(rO.UIStrings.displayValueMsSavings,{wastedMs:d}):"",details:f,warnings:m}}static async audit(){return{score:1,notApplicable:!0,details:QP.makeOpportunityDetails([],[],0)}}}JP.exports=UsesRelPreloadAudit,JP.exports.UIStrings=oO;var cO={exports:{}};
1047
+ Robots$1.prototype.getPreferredHost=function(){return this._preferredHost},Robots$1.prototype.getSitemaps=function(){return this._sitemaps.slice(0)};var fL=Robots$1;const yL=kc,robotsParser=function(e,t){return new fL(e,t)},vL=ji,bL=HT,wL=new Set(["noindex","none"]),SL="unavailable_after",TL={title:"Page isn’t blocked from indexing",failureTitle:"Page is blocked from indexing",description:"Search engines are unable to include your pages in search results if they don't have permission to crawl them. [Learn more](https://web.dev/is-crawable/)."},EL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/is-crawlable.js",TL);function hasBlockingDirective(e){return e.split(",").map((e=>e.toLowerCase().trim())).some((e=>wL.has(e)||function isUnavailable(e){const t=e.split(":");if(t.length<=1||t[0]!==SL)return!1;const r=Date.parse(t.slice(1).join(":"));return!isNaN(r)&&r<Date.now()}(e)))}gL.exports=class IsCrawlable extends yL{static get meta(){return{id:"is-crawlable",title:EL(TL.title),
1048
+ failureTitle:EL(TL.failureTitle),description:EL(TL.description),supportedModes:["navigation"],requiredArtifacts:["MetaElements","RobotsTxt","URL","devtoolsLogs"]}}static audit(e,t){const r=e.devtoolsLogs[yL.DEFAULT_PASS],a=e.MetaElements.find((e=>"robots"===e.name));return bL.request({devtoolsLog:r,URL:e.URL},t).then((t=>{const r=[];if(a){const e=a.content||"";hasBlockingDirective(e)&&r.push({source:{...yL.makeNodeItem(a.node),snippet:`<meta name="robots" content="${e}" />`}})}if(t.responseHeaders&&t.responseHeaders.filter((e=>"x-robots-tag"===e.name.toLowerCase()&&!function hasUserAgent(e){const t=e.match(/^([^,:]+):/);return!!t&&t[1].toLowerCase()!==SL}(e.value)&&hasBlockingDirective(e.value))).forEach((e=>r.push({source:`${e.name}: ${e.value}`}))),e.RobotsTxt.content){const a=new vL("/robots.txt",t.url),n=robotsParser(a.href,e.RobotsTxt.content);if(!n.isAllowed(t.url)){const e=n.getMatchingLineNumber(t.url)||1;r.push({source:{type:"source-location",url:a.href,urlProvider:"network",
1049
+ line:e-1,column:0}})}}const n=yL.makeTableDetails([{key:"source",itemType:"code",text:"Blocking Directive Source"}],r);return{score:Number(0===r.length),details:n}}))}},gL.exports.UIStrings=TL;var xL={exports:{}};const _L=kc,AL=ji,RL=new Set(["click here","click this","go","here","information","learn more","more","more info","more information","right here","read more","see more","start","this","ここをクリック","こちらをクリック","リンク","続きを読む","続く","全文表示","click aquí","click aqui","clicka aquí","clicka aqui","pincha aquí","pincha aqui","aquí","aqui","más","mas","más información","más informacion","mas información","mas informacion","este","enlace","este enlace","empezar","clique aqui","ir","mais informação","mais informações","mais","veja mais","여기","여기를 클릭","클릭","링크","자세히","자세히 보기","계속","이동","전체 보기","här","klicka här","läs mer","mer","mer info","mer information"]),kL={title:"Links have descriptive text",failureTitle:"Links do not have descriptive text",
1050
+ description:"Descriptive link text helps search engines understand your content. [Learn more](https://web.dev/link-text/).",displayValue:"{itemCount, plural,\n =1 {1 link found}\n other {# links found}\n }"},DL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/link-text.js",kL);xL.exports=class LinkText extends _L{static get meta(){return{id:"link-text",title:DL(kL.title),failureTitle:DL(kL.failureTitle),description:DL(kL.description),requiredArtifacts:["URL","AnchorElements"]}}static audit(e){const t=e.AnchorElements.filter((e=>e.href&&!e.rel.includes("nofollow"))).filter((t=>{const r=t.href.toLowerCase();return!(r.startsWith("javascript:")||r.startsWith("mailto:")||AL.equalWithExcludedFragments(t.href,e.URL.finalUrl))&&RL.has(t.text.trim().toLowerCase())})).map((e=>({href:e.href,text:e.text.trim()}))),r=_L.makeTableDetails([{key:"href",itemType:"url",text:"Link destination"},{key:"text",itemType:"text",text:"Link Text"}],t,{});let a
1051
+ ;return t.length&&(a=DL(kL.displayValue,{itemCount:t.length})),{score:Number(0===t.length),details:r,displayValue:a}}},xL.exports.UIStrings=kL;var CL={exports:{}};const IL=iy,NL={description:"Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data/).",title:"Structured data is valid"},LL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/manual/structured-data.js",NL);CL.exports=class StructuredData extends IL{static get meta(){return Object.assign({id:"structured-data",description:LL(NL.description),title:LL(NL.title)},super.partialMeta)}},CL.exports.UIStrings=NL;var ML={exports:{}};const PL=kc,OL={title:"Document has a meta description",failureTitle:"Document does not have a meta description",
1052
+ description:"Meta descriptions may be included in search results to concisely summarize page content. [Learn more](https://web.dev/meta-description/).",explanation:"Description text is empty."},FL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/meta-description.js",OL);ML.exports=class Description extends PL{static get meta(){return{id:"meta-description",title:FL(OL.title),failureTitle:FL(OL.failureTitle),description:FL(OL.description),requiredArtifacts:["MetaElements"]}}static audit(e){const t=e.MetaElements.find((e=>"description"===e.name));if(!t)return{score:0};return 0===(t.content||"").trim().length?{score:0,explanation:FL(OL.explanation)}:{score:1}}},ML.exports.UIStrings=OL;var UL={exports:{}};const jL=kc,BL=ji,$L="application/x-java-applet",qL="application/x-java-bean",zL=new Set(["application/x-shockwave-flash",$L,qL,"application/x-silverlight","application/x-silverlight-2"]),VL=new Set(["swf","flv","class","xap"]),WL=new Set(["code","movie","source","src"]),GL={
1053
+ title:"Document avoids plugins",failureTitle:"Document uses plugins",description:"Search engines can't index plugin content, and many devices restrict plugins or don't support them. [Learn more](https://web.dev/plugins/)."},HL=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/plugins.js",GL);function isPluginURL(e){try{const t=new BL(e,"http://example.com").pathname.split(".");if(t.length<2)return!1;const r=t[t.length-1];return VL.has(r.trim().toLowerCase())}catch(e){return!1}}UL.exports=class Plugins extends jL{static get meta(){return{id:"plugins",title:HL(GL.title),failureTitle:HL(GL.failureTitle),description:HL(GL.description),requiredArtifacts:["EmbeddedContent"]}}static audit(e){const t=e.EmbeddedContent.filter((e=>{if("APPLET"===e.tagName)return!0;if(("EMBED"===e.tagName||"OBJECT"===e.tagName)&&e.type&&function isPluginType(e){return e=e.trim().toLowerCase(),zL.has(e)||e.startsWith($L)||e.startsWith(qL)}(e.type))return!0;const t=e.src||e.code
1054
+ ;if("EMBED"===e.tagName&&t&&isPluginURL(t))return!0;if("OBJECT"===e.tagName&&e.data&&isPluginURL(e.data))return!0;return e.params.filter((e=>WL.has(e.name.trim().toLowerCase())&&isPluginURL(e.value))).length>0})).map((e=>({source:jL.makeNodeItem(e.node)}))),r=jL.makeTableDetails([{key:"source",itemType:"code",text:"Element source"}],t);return{score:Number(0===t.length),details:r}}},UL.exports.UIStrings=GL;var YL={exports:{}};const KL=kc,JL=ji,XL="sitemap",ZL="user-agent",QL="allow",eM="disallow",tM=new Set([QL,eM]),rM=new Set([ZL,eM,QL,XL,"crawl-delay","clean-param","host","request-rate","visit-time","noindex"]),aM=new Set(["https:","http:","ftp:"]),nM={title:"robots.txt is valid",failureTitle:"robots.txt is not valid",description:"If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt/).",displayValueHttpBadCode:"Request for robots.txt returned HTTP status: {statusCode}",
1055
+ displayValueValidationError:"{itemCount, plural,\n =1 {1 error found}\n other {# errors found}\n }",explanation:"Lighthouse was unable to download a robots.txt file"},iM=oi.createMessageInstanceIdFn("lighthouse-core/audits/seo/robots-txt.js",nM);function parseLine(e){const t=e.indexOf("#");if(-1!==t&&(e=e.substr(0,t)),0===(e=e.trim()).length)return null;const r=e.indexOf(":");if(-1===r)throw new Error("Syntax not understood");const a=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim();return function verifyDirective(e,t){if(!rM.has(e))throw new Error("Unknown directive");if(e===XL){let e;try{e=new JL(t)}catch(e){throw new Error("Invalid sitemap URL")}if(!aM.has(e.protocol))throw new Error("Invalid sitemap URL protocol")}if(e===ZL&&!t)throw new Error("No user-agent specified");if(e===QL||e===eM){if(""!==t&&"/"!==t[0]&&"*"!==t[0])throw new Error('Pattern should either be empty, start with "/" or "*"');const e=t.indexOf("$")
1056
+ ;if(-1!==e&&e!==t.length-1)throw new Error('"$" should only be used at the end of the pattern')}}(a,n),{directive:a,value:n}}YL.exports=class RobotsTxt extends KL{static get meta(){return{id:"robots-txt",title:iM(nM.title),failureTitle:iM(nM.failureTitle),description:iM(nM.description),requiredArtifacts:["RobotsTxt"]}}static audit(e){const{status:t,content:r}=e.RobotsTxt;if(!t)return{score:0,explanation:iM(nM.explanation)};if(t>=500)return{score:0,displayValue:iM(nM.displayValueHttpBadCode,{statusCode:t})};if(t>=400||""===r)return{score:1,notApplicable:!0};if(null===r)throw new Error(`Status ${t} was valid, but content was null`);const a=function validateRobots(e){const t=[];let r=!1;return e.split(/\r\n|\r|\n/).forEach(((e,a)=>{let n;try{n=parseLine(e)}catch(r){t.push({index:(a+1).toString(),line:e,message:r.message.toString()})}n&&(n.directive===ZL?r=!0:!r&&tM.has(n.directive)&&t.push({index:(a+1).toString(),line:e,message:"No user-agent specified"}))})),t
1057
+ }(r),n=KL.makeTableDetails([{key:"index",itemType:"text",text:"Line #"},{key:"line",itemType:"code",text:"Content"},{key:"message",itemType:"code",text:"Error"}],a,{});let i;return a.length&&(i=iM(nM.displayValueValidationError,{itemCount:a.length})),{score:Number(0===a.length),details:n,displayValue:i}}},YL.exports.UIStrings=nM;var oM={exports:{}};const sM=kp;function almostEqual(e,t){return Math.abs(e-t)<=10}function mergeTouchingClientRects(e){for(let t=0;t<e.length;t++)for(let r=t+1;r<e.length;r++){const a=e[t],n=e[r],i=almostEqual(a.top,n.top)||almostEqual(a.bottom,n.bottom),o=almostEqual(a.left,n.left)||almostEqual(a.right,n.right);if(sM.rectsTouchOrOverlap(a,n)&&(i||o)){const t=sM.getBoundingRect([a,n]),r=sM.getRectCenterPoint(t);if(!sM.rectContainsPoint(a,r)&&!sM.rectContainsPoint(n,r))continue;return(e=e.filter((e=>e!==a&&e!==n))).push(t),mergeTouchingClientRects(e)}}return e}var cM={getTappableRectsFromClientRects:function getTappableRectsFromClientRects$1(e){
1058
+ return e=sM.filterOutTinyRects(e),e=mergeTouchingClientRects(e=sM.filterOutRectsContainedByOthers(e))}};const lM=kc,uM=KN,{rectsTouchOrOverlap:dM,getRectOverlapArea:mM,getRectAtCenter:pM,allRectsContainedWithinEachOther:hM,getLargestRect:gM,getBoundingRectWithPadding:fM}=kp,{getTappableRectsFromClientRects:yM}=cM,vM=oi,bM={title:"Tap targets are sized appropriately",failureTitle:"Tap targets are not sized appropriately",description:"Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets/).",tapTargetHeader:"Tap Target",overlappingTargetHeader:"Overlapping Target",explanationViewportMetaNotOptimized:"Tap targets are too small because there's no viewport meta tag optimized for mobile screens",displayValue:"{decimalProportion, number, percent} appropriately sized tap targets"
1059
+ },wM=vM.createMessageInstanceIdFn("lighthouse-core/audits/seo/tap-targets.js",bM);function clientRectBelowMinimumSize(e){return e.width<48||e.height<48}function getOverlapFailureForTargetPair(e,t){let r=null;for(const a of e){const e=pM(a,48),n=mM(e,a);for(const a of t){const t=mM(e,a),i=t/n;i<.25||(!r||i>r.overlapScoreRatio)&&(r={overlapScoreRatio:i,tapTargetScore:n,overlappingTargetScore:t})}}return r}class TapTargets extends lM{static get meta(){return{id:"tap-targets",title:wM(bM.title),failureTitle:wM(bM.failureTitle),description:wM(bM.description),requiredArtifacts:["MetaElements","TapTargets"]}}static async audit(e,t){if("desktop"===t.settings.formFactor)return{score:1,notApplicable:!0};if(!(await uM.request(e.MetaElements,t)).isMobileOptimized)return{score:0,explanation:wM(bM.explanationViewportMetaNotOptimized)};const r=function getBoundedTapTargets(e){return e.map((e=>({tapTarget:e,paddedBoundsRect:fM(e.clientRects,48)})))}(e.TapTargets),a=function getAllOverlapFailures(e,t){
1060
+ const r=[];return e.forEach((e=>{const a=yM(e.tapTarget.clientRects);for(const n of t){if(n===e)continue;if(!dM(e.paddedBoundsRect,n.paddedBoundsRect))continue;if(e.tapTarget.href===n.tapTarget.href&&/https?:\/\//.test(e.tapTarget.href))continue;const t=n.tapTarget.clientRects;if(hM(a,t))continue;const i=getOverlapFailureForTargetPair(a,t);i&&r.push({...i,tapTarget:e.tapTarget,overlappingTarget:n.tapTarget})}})),r}(function getTooSmallTargets(e){return e.filter((e=>e.tapTarget.clientRects.every(clientRectBelowMinimumSize)))}(r),r),n=function getTableItems(e){const t=e.map((e=>{const t=gM(e.tapTarget.clientRects),r=Math.floor(t.width),a=Math.floor(t.height),n=r+"x"+a;return{tapTarget:lM.makeNodeItem(e.tapTarget.node),overlappingTarget:lM.makeNodeItem(e.overlappingTarget.node),tapTargetScore:e.tapTargetScore,overlappingTargetScore:e.overlappingTargetScore,overlapScoreRatio:e.overlapScoreRatio,size:n,width:r,height:a}}));return t.sort(((e,t)=>t.overlapScoreRatio-e.overlapScoreRatio)),t
1061
+ }(function mergeSymmetricFailures(e){const t=[];return e.forEach(((r,a)=>{const n=e.find((e=>e.tapTarget===r.overlappingTarget&&e.overlappingTarget===r.tapTarget));if(!n)return void t.push(r);const{overlapScoreRatio:i}=r,{overlapScoreRatio:o}=n;(i>o||i===o&&a<e.indexOf(n))&&t.push(r)})),t}(a)),i=[{key:"tapTarget",itemType:"node",text:wM(bM.tapTargetHeader)},{key:"size",itemType:"text",text:wM(vM.UIStrings.columnSize)},{key:"overlappingTarget",itemType:"node",text:wM(bM.overlappingTargetHeader)}],o=lM.makeTableDetails(i,n),s=e.TapTargets.length,c=new Set(a.map((e=>e.tapTarget))).size;let l=1,u=1;c>0&&(u=(s-c)/s,l=.89*u);return{score:l,details:o,displayValue:wM(bM.displayValue,{decimalProportion:u})}}}TapTargets.FINGER_SIZE_PX=48,oM.exports=TapTargets,oM.exports.UIStrings=bM;var SM={exports:{}};const TM=kc,EM=oi,xM=HT,_M=Lo,AM=Fo,RM={title:"Initial server response time was short",failureTitle:"Reduce initial server response time",
1062
+ description:"Keep the server response time for the main document short because all other requests depend on it. [Learn more](https://web.dev/time-to-first-byte/).",displayValue:"Root document took {timeInMs, number, milliseconds} ms"},kM=EM.createMessageInstanceIdFn("lighthouse-core/audits/server-response-time.js",RM);class ServerResponseTime extends TM{static get meta(){return{id:"server-response-time",title:kM(RM.title),failureTitle:kM(RM.failureTitle),description:kM(RM.description),supportedModes:["timespan","navigation"],requiredArtifacts:["devtoolsLogs","URL","GatherContext"]}}static calculateResponseTime(e){const t=e.timing;return t?t.receiveHeadersEnd-t.sendEnd:0}static async audit(e,t){const r=e.devtoolsLogs[TM.DEFAULT_PASS];let a;if("timespan"===e.GatherContext.gatherMode){const n=await _M.request(r,t),i=AM.findOptionalMainDocument(n,e.URL.finalUrl);if(!i)return{score:null,notApplicable:!0};a=i}else a=await xM.request({devtoolsLog:r,URL:e.URL},t)
1063
+ ;const n=ServerResponseTime.calculateResponseTime(a),i=n<600,o=kM(RM.displayValue,{timeInMs:n}),s=[{key:"url",valueType:"url",label:kM(EM.UIStrings.columnURL)},{key:"responseTime",valueType:"timespanMs",label:kM(EM.UIStrings.columnTimeSpent)}],c=TM.makeOpportunityDetails(s,[{url:a.url,responseTime:n}],n-100);return{numericValue:n,numericUnit:"millisecond",score:Number(i),displayValue:o,details:c}}}SM.exports=ServerResponseTime,SM.exports.UIStrings=RM;var DM={exports:{}};const CM=ji,IM=kc,NM={title:"Registers a service worker that controls page and `start_url`",failureTitle:"Does not register a service worker that controls page and `start_url`",description:"The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://web.dev/service-worker/).",explanationOutOfScope:"This origin has one or more service workers, however the page ({pageUrl}) is not in scope.",
1064
+ explanationNoManifest:"This page is controlled by a service worker, however no `start_url` was found because no manifest was fetched.",explanationBadManifest:"This page is controlled by a service worker, however no `start_url` was found because manifest failed to parse as valid JSON",explanationBadStartUrl:"This page is controlled by a service worker, however the `start_url` ({startUrl}) is not in the service worker's scope ({scopeUrl})"},LM=oi.createMessageInstanceIdFn("lighthouse-core/audits/service-worker.js",NM);class ServiceWorker extends IM{static get meta(){return{id:"service-worker",title:LM(NM.title),failureTitle:LM(NM.failureTitle),description:LM(NM.description),requiredArtifacts:["URL","ServiceWorker","WebAppManifest"]}}static getVersionsForOrigin(e,t){return e.filter((e=>"activated"===e.status)).filter((e=>new CM(e.scriptURL).origin===t.origin))}static getControllingServiceWorker(e,t,r){const a=[];for(const r of e){const e=t.find((e=>e.registrationId===r.registrationId))
1065
+ ;if(e){const t=new CM(e.scopeURL).href,n=new CM(r.scriptURL).href;a.push({scopeUrl:t,scriptUrl:n})}}return a.filter((e=>r.href.startsWith(e.scopeUrl))).sort(((e,t)=>e.scopeUrl.length-t.scopeUrl.length)).pop()}static checkStartUrl(e,t){if(!e)return LM(NM.explanationNoManifest);if(!e.value)return LM(NM.explanationBadManifest);const r=e.value.start_url.value;return r.startsWith(t)?void 0:LM(NM.explanationBadStartUrl,{startUrl:r,scopeUrl:t})}static audit(e){const t=new CM(e.URL.finalUrl),{versions:r,registrations:a}=e.ServiceWorker,n=ServiceWorker.getVersionsForOrigin(r,t);if(0===n.length)return{score:0};const i=ServiceWorker.getControllingServiceWorker(n,a,t);if(!i)return{score:0,explanation:LM(NM.explanationOutOfScope,{pageUrl:t.href})};const{scriptUrl:o,scopeUrl:s}=i,c={type:"debugdata",scriptUrl:o,scopeUrl:s},l=ServiceWorker.checkStartUrl(e.WebAppManifest,i.scopeUrl);return l?{score:0,details:c,explanation:l}:{score:1,details:c}}}DM.exports=ServiceWorker,DM.exports.UIStrings=NM
1066
+ ;var MM={exports:{}};const PM=kc;var OM=class MultiCheckAudit$2 extends PM{static async audit(e,t){const r=await this.audit_(e,t);return this.createAuditProduct(r)}static createAuditProduct(e){const t={...e,...e.manifestValues,manifestValues:void 0,allChecks:void 0};e.manifestValues?.allChecks&&e.manifestValues.allChecks.forEach((e=>{t[e.id]=e.passing}));const r={type:"debugdata",items:[t]};return e.failures.length>0?{score:0,explanation:`Failures: ${e.failures.join(",\n")}.`,details:r}:{score:1,details:r}}static audit_(e,t){throw new Error("audit_ unimplemented")}};const FM=OM,UM=DA,jM={title:"Configured for a custom splash screen",failureTitle:"Is not configured for a custom splash screen",description:"A themed splash screen ensures a high-quality experience when users launch your app from their homescreens. [Learn more](https://web.dev/splash-screen/)."},BM=oi.createMessageInstanceIdFn("lighthouse-core/audits/splash-screen.js",jM);class SplashScreen extends FM{static get meta(){
1067
+ return{id:"splash-screen",title:BM(jM.title),failureTitle:BM(jM.failureTitle),description:BM(jM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors"]}}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=["hasName","hasBackgroundColor","hasThemeColor","hasIconsAtLeast512px"];e.allChecks.filter((e=>r.includes(e.id))).forEach((e=>{e.passing||t.push(e.failureText)}))}static async audit_(e,t){const r=[],a=await UM.request(e,t);return SplashScreen.assessManifest(a,r),{failures:r,manifestValues:a}}}MM.exports=SplashScreen,MM.exports.UIStrings=jM;var $M={exports:{}};const qM=OM,zM=DA,VM=Rs,WM={title:"Sets a theme color for the address bar.",failureTitle:"Does not set a theme color for the address bar.",description:"The browser address bar can be themed to match your site. [Learn more](https://web.dev/themed-omnibox/)."
1068
+ },GM=oi.createMessageInstanceIdFn("lighthouse-core/audits/themed-omnibox.js",WM);class ThemedOmnibox extends qM{static get meta(){return{id:"themed-omnibox",title:GM(WM.title),failureTitle:GM(WM.failureTitle),description:GM(WM.description),supportedModes:["navigation"],requiredArtifacts:["WebAppManifest","InstallabilityErrors","MetaElements"]}}static isValidColor(e){return VM.valueType(e)===VM.TYPES.COLOR}static assessMetaThemecolor(e,t){e?ThemedOmnibox.isValidColor(e.content||"")||t.push("The theme-color meta tag did not contain a valid CSS color"):t.push('No `<meta name="theme-color">` tag found')}static assessManifest(e,t){if(e.isParseFailure&&e.parseFailureReason)return void t.push(e.parseFailureReason);const r=e.allChecks.find((e=>"hasThemeColor"===e.id));r&&!r.passing&&t.push(r.failureText)}static async audit_(e,t){const r=[],a=e.MetaElements.find((e=>"theme-color"===e.name)),n=await zM.request(e,t);return ThemedOmnibox.assessManifest(n,r),ThemedOmnibox.assessMetaThemecolor(a,r),
1069
+ {failures:r,manifestValues:n,themeColor:a?.content||null}}}$M.exports=ThemedOmnibox,$M.exports.UIStrings=WM;var HM={exports:{}},YM={exports:{}};const KM=kc,JM=oi,XM=uw,ZM=Lo,QM=Rv,{getJavaScriptURLs:eP,getAttributableURLForTask:tP}=Iv,rP={title:"Minimize third-party usage",failureTitle:"Reduce the impact of third-party code",description:"Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).",columnThirdParty:"Third-Party",displayValue:"Third-party code blocked the main thread for {timeInMs, number, milliseconds} ms"},aP=JM.createMessageInstanceIdFn("lighthouse-core/audits/third-party-summary.js",rP);class ThirdPartySummary$1 extends KM{static get meta(){return{id:"third-party-summary",title:aP(rP.title),
1070
+ failureTitle:aP(rP.failureTitle),description:aP(rP.description),requiredArtifacts:["traces","devtoolsLogs","URL"]}}static getSummaries(e,t,r){const a=new Map,n=new Map,i={mainThreadTime:0,blockingTime:0,transferSize:0};for(const t of e){const e=a.get(t.url)||{...i};e.transferSize+=t.transferSize,a.set(t.url,e)}const o=eP(e);for(const e of t){const t=tP(e,o),n=a.get(t)||{...i},s=e.selfTime*r;n.mainThreadTime+=s,n.blockingTime+=Math.max(s-50,0),a.set(t,n)}const s=new Map;for(const[e,t]of a.entries()){const r=XM.getEntity(e);if(!r){a.delete(e);continue}const o=n.get(r)||{...i};o.transferSize+=t.transferSize,o.mainThreadTime+=t.mainThreadTime,o.blockingTime+=t.blockingTime,n.set(r,o);const c=s.get(r)||[];c.push(e),s.set(r,c)}return{byURL:a,byEntity:n,urls:s}}static makeSubItems(e,t,r){let a=(t.urls.get(e)||[]).map((e=>({url:e,...t.byURL.get(e)}))).filter((e=>e.transferSize>0)).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize));const n={transferSize:0,blockingTime:0
1071
+ },i=Math.max(4096,r.transferSize/20),o=Math.min(5,a.length);let s=0;for(;s<o;){const e=a[s];if(0===e.blockingTime&&e.transferSize<i)break;s++,n.transferSize+=e.transferSize,n.blockingTime+=e.blockingTime}if(!n.blockingTime&&!n.transferSize)return[];a=a.slice(0,s);const c={url:aP(JM.UIStrings.otherResourcesLabel),transferSize:r.transferSize-n.transferSize,blockingTime:r.blockingTime-n.blockingTime};return c.transferSize>i&&a.push(c),a}static async audit(e,t){const r=t.settings||{},a=e.traces[KM.DEFAULT_PASS],n=e.devtoolsLogs[KM.DEFAULT_PASS],i=await ZM.request(n,t),o=XM.getEntity(e.URL.finalUrl),s=await QM.request(a,t),c="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,l=ThirdPartySummary$1.getSummaries(i,s,c),u={wastedBytes:0,wastedMs:0},d=Array.from(l.byEntity.entries()).filter((([e])=>!(o&&o.name===e.name))).map((([e,t])=>(u.wastedBytes+=t.transferSize,u.wastedMs+=t.blockingTime,{...t,entity:{type:"link",text:e.name,url:e.homepage||""},subItems:{type:"subitems",
1072
+ items:ThirdPartySummary$1.makeSubItems(e,l,t)}}))).sort(((e,t)=>t.blockingTime-e.blockingTime||t.transferSize-e.transferSize)),m=[{key:"entity",itemType:"link",text:aP(rP.columnThirdParty),subItemsHeading:{key:"url",itemType:"url"}},{key:"transferSize",granularity:1,itemType:"bytes",text:aP(JM.UIStrings.columnTransferSize),subItemsHeading:{key:"transferSize"}},{key:"blockingTime",granularity:1,itemType:"ms",text:aP(JM.UIStrings.columnBlockingTime),subItemsHeading:{key:"blockingTime"}}];return d.length?{score:Number(u.wastedMs<=250),displayValue:aP(rP.displayValue,{timeInMs:u.wastedMs}),details:KM.makeTableDetails(m,d,u)}:{score:1,notApplicable:!0}}}YM.exports=ThirdPartySummary$1,YM.exports.UIStrings=rP;const nP=kc,iP=oi,oP=uw,sP=Lo,cP=HT,lP=Rv,uP=YM.exports,dP={title:"Lazy load third-party resources with facades",failureTitle:"Some third-party resources can be lazy loaded with a facade",
1073
+ description:"Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required. [Learn more](https://web.dev/third-party-facades/).",displayValue:"{itemCount, plural,\n =1 {# facade alternative available}\n other {# facade alternatives available}\n }",columnProduct:"Product",categoryVideo:"{productName} (Video)",categoryCustomerSuccess:"{productName} (Customer Success)",categoryMarketing:"{productName} (Marketing)",categorySocial:"{productName} (Social)"},mP=iP.createMessageInstanceIdFn("lighthouse-core/audits/third-party-facades.js",dP),pP={video:dP.categoryVideo,"customer-success":dP.categoryCustomerSuccess,marketing:dP.categoryMarketing,social:dP.categorySocial};class ThirdPartyFacades extends nP{static get meta(){return{id:"third-party-facades",title:mP(dP.title),failureTitle:mP(dP.failureTitle),description:mP(dP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL"]}}static condenseItems(e){
1074
+ e.sort(((e,t)=>t.transferSize-e.transferSize));let t=e.findIndex((e=>e.transferSize<1e3))||1;if((-1===t||t>5)&&(t=5),t>=e.length-1)return;const r=e.splice(t).reduce(((e,t)=>(e.transferSize+=t.transferSize,e.blockingTime+=t.blockingTime,e)));r.transferSize<1e3||(r.url=mP(iP.UIStrings.otherResourcesLabel),e.push(r))}static getProductsWithFacade(e,t){const r=new Map;for(const a of e.keys()){const e=oP.getEntity(a);if(!e||oP.isFirstParty(a,t))continue;const n=oP.getProduct(a);n&&n.facades&&n.facades.length&&(r.has(n.name)||r.set(n.name,{product:n,entity:e}))}return Array.from(r.values())}static async audit(e,t){const r=t.settings,a=e.traces[nP.DEFAULT_PASS],n=e.devtoolsLogs[nP.DEFAULT_PASS],i=await sP.request(n,t),o=await cP.request({devtoolsLog:n,URL:e.URL},t),s=oP.getEntity(o.url),c=await lP.request(a,t),l="simulate"===r.throttlingMethod?r.throttling.cpuSlowdownMultiplier:1,u=uP.getSummaries(i,c,l),d=ThirdPartyFacades.getProductsWithFacade(u.byURL,s),m=[]
1075
+ ;for(const{product:e,entity:t}of d){const r=pP[e.categories[0]];let a;a=r?mP(r,{productName:e.name}):e.name;const n=u.urls.get(t),i=u.byEntity.get(t);if(!n||!i)continue;const o=Array.from(n).map((e=>({url:e,...u.byURL.get(e)})));this.condenseItems(o),m.push({product:a,transferSize:i.transferSize,blockingTime:i.blockingTime,subItems:{type:"subitems",items:o}})}if(!m.length)return{score:1,notApplicable:!0};const p=[{key:"product",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:mP(dP.columnProduct)},{key:"transferSize",itemType:"bytes",subItemsHeading:{key:"transferSize"},granularity:1,text:mP(iP.UIStrings.columnTransferSize)},{key:"blockingTime",itemType:"ms",subItemsHeading:{key:"blockingTime"},granularity:1,text:mP(iP.UIStrings.columnBlockingTime)}];return{score:0,displayValue:mP(dP.displayValue,{itemCount:m.length}),details:nP.makeTableDetails(p,m)}}}HM.exports=ThirdPartyFacades,HM.exports.UIStrings=dP;var hP={exports:{}};const gP=kc,fP=CD,yP=HT,vP=Tu,bP=oi,wP={
1076
+ title:"Timing budget",description:"Set a timing budget to help you keep an eye on the performance of your site. Performant sites load fast and respond to user input events quickly. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",columnTimingMetric:"Metric",columnMeasurement:"Measurement"},SP=bP.createMessageInstanceIdFn("lighthouse-core/audits/timing-budget.js",wP);hP.exports=class TimingBudget extends gP{static get meta(){return{id:"timing-budget",title:SP(wP.title),description:SP(wP.description),scoreDisplayMode:gP.SCORING_MODES.INFORMATIVE,supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL","GatherContext"]}}static getRowLabel(e){const t={"first-contentful-paint":bP.UIStrings.firstContentfulPaintMetric,interactive:bP.UIStrings.interactiveMetric,"first-meaningful-paint":bP.UIStrings.firstMeaningfulPaintMetric,"max-potential-fid":bP.UIStrings.maxPotentialFIDMetric,"total-blocking-time":bP.UIStrings.totalBlockingTimeMetric,
1077
+ "speed-index":bP.UIStrings.speedIndexMetric,"largest-contentful-paint":bP.UIStrings.largestContentfulPaintMetric,"cumulative-layout-shift":bP.UIStrings.cumulativeLayoutShiftMetric};return SP(t[e])}static getMeasurement(e,t){return{"first-contentful-paint":t.firstContentfulPaint,interactive:t.interactive,"first-meaningful-paint":t.firstMeaningfulPaint,"max-potential-fid":t.maxPotentialFID,"total-blocking-time":t.totalBlockingTime,"speed-index":t.speedIndex,"largest-contentful-paint":t.largestContentfulPaint,"cumulative-layout-shift":t.cumulativeLayoutShift}[e]}static tableItems(e,t){let r=[];if(!e.timings)return r;r=e.timings.map((e=>{const r=e.metric,a=this.getRowLabel(r),n=this.getMeasurement(r,t);return{metric:r,label:a,measurement:n,overBudget:n&&n>e.budget?n-e.budget:void 0}})).sort(((e,t)=>(t.overBudget||0)-(e.overBudget||0)));const a=r.find((e=>"cumulative-layout-shift"===e.metric));return a&&("number"==typeof a.measurement&&(a.measurement={type:"numeric",
1078
+ value:Number(a.measurement),granularity:.01}),"number"==typeof a.overBudget&&(a.overBudget={type:"numeric",value:Number(a.overBudget),granularity:.01})),r}static async audit(e,t){const r=e.GatherContext,a=e.devtoolsLogs[gP.DEFAULT_PASS],n=e.traces[gP.DEFAULT_PASS],i=await yP.request({URL:e.URL,devtoolsLog:a},t),o={trace:n,devtoolsLog:a,gatherContext:r,settings:t.settings},s=(await fP.request(o,t)).metrics,c=vP.getMatchingBudget(t.settings.budgets,i.url);if(!c)return{score:0,notApplicable:!0};const l=[{key:"label",itemType:"text",text:SP(wP.columnTimingMetric)},{key:"measurement",itemType:"ms",text:SP(wP.columnMeasurement)},{key:"overBudget",itemType:"ms",text:SP(bP.UIStrings.columnOverBudget)}];return{details:gP.makeTableDetails(l,this.tableItems(c,s)),score:1}}},hP.exports.UIStrings=wP;var TP={exports:{}};const EP=kc,xP=oi,_P=ji,AP={title:"Image elements have explicit `width` and `height`",failureTitle:"Image elements do not have explicit `width` and `height`",
1079
+ description:"Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn more](https://web.dev/optimize-cls/#images-without-dimensions)"},RP=xP.createMessageInstanceIdFn("lighthouse-core/audits/unsized-images.js",AP);class UnsizedImages extends EP{static get meta(){return{id:"unsized-images",title:RP(AP.title),failureTitle:RP(AP.failureTitle),description:RP(AP.description),requiredArtifacts:["ImageElements"]}}static doesHtmlAttrProvideExplicitSize(e){if(!e)return!1;if(e.startsWith("+"))return!1;return parseInt(e,10)>=0}static isCssPropExplicitlySet(e){return!!e&&!["auto","initial","unset","inherit"].includes(e)}static isSizedImage(e){if(void 0===e.cssEffectiveRules)return!0
1080
+ ;const t=e.attributeWidth,r=e.attributeHeight,a=e.cssEffectiveRules.width,n=e.cssEffectiveRules.height,i=e.cssEffectiveRules.aspectRatio,o=UnsizedImages.doesHtmlAttrProvideExplicitSize(t),s=UnsizedImages.isCssPropExplicitlySet(a),c=UnsizedImages.doesHtmlAttrProvideExplicitSize(r),l=UnsizedImages.isCssPropExplicitlySet(n),u=UnsizedImages.isCssPropExplicitlySet(i),d=o||s,m=c||l;return d&&m||d&&u||m&&u}static isNonNetworkSvg(e){const t="image/svg+xml"===_P.guessMimeType(e.src),r=e.src.slice(0,e.src.indexOf(":")),a=_P.isNonNetworkProtocol(r);return t&&a}static async audit(e){const t=e.ImageElements.filter((e=>!e.isCss&&!e.isInShadowDOM)),r=[];for(const e of t){if("fixed"===e.computedStyles.position||"absolute"===e.computedStyles.position)continue;if(UnsizedImages.isNonNetworkSvg(e))continue;if(UnsizedImages.isSizedImage(e))continue;const t=e.node.boundingRect;0===t.width&&0===t.height||r.push({url:_P.elideDataURI(e.src),node:EP.makeNodeItem(e.node)})}const a=[{key:"node",itemType:"node",
1081
+ text:""},{key:"url",itemType:"url",text:RP(xP.UIStrings.columnURL)}];return{score:r.length>0?0:1,notApplicable:0===t.length,details:EP.makeTableDetails(a,r)}}}TP.exports=UnsizedImages,TP.exports.UIStrings=AP;var kP={exports:{}};const DP=Ao,CP=Yp;var IP=DP(class UserTimings$1{static async compute_(e,t){const r=await CP.request(e,t),a=[],n={};return r.processEvents.filter((e=>!!e.cat.includes("blink.user_timing")&&("requestStart"!==e.name&&"navigationStart"!==e.name&&"paintNonDefaultBackgroundColor"!==e.name&&void 0===e.args.frame))).forEach((e=>{"R"===e.ph||"I"===e.ph.toUpperCase()?a.push({name:e.name,isMark:!0,args:e.args,startTime:e.ts}):"b"===e.ph.toLowerCase()?n[e.name]=e.ts:"e"===e.ph.toLowerCase()&&a.push({name:e.name,isMark:!1,args:e.args,startTime:n[e.name],endTime:e.ts,duration:e.ts-n[e.name]})})),a.forEach((e=>{e.startTime=(e.startTime-r.timeOriginEvt.ts)/1e3,e.isMark||(e.endTime=(e.endTime-r.timeOriginEvt.ts)/1e3,e.duration=e.duration/1e3)})),a}},null)
1082
+ ;const NP=kc,LP=oi,MP=IP,PP={title:"User Timing marks and measures",description:"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more](https://web.dev/user-timings/).",displayValue:"{itemCount, plural,\n =1 {1 user timing}\n other {# user timings}\n }",columnType:"Type"},OP=LP.createMessageInstanceIdFn("lighthouse-core/audits/user-timings.js",PP);class UserTimings extends NP{static get meta(){return{id:"user-timings",title:OP(PP.title),description:OP(PP.description),scoreDisplayMode:NP.SCORING_MODES.INFORMATIVE,requiredArtifacts:["traces"]}}static get excludedPrefixes(){return["goog_"]}static excludeEvent(e){return UserTimings.excludedPrefixes.every((t=>!e.name.startsWith(t)))}static audit(e,t){const r=e.traces[NP.DEFAULT_PASS];return MP.request(r,t).then((e=>{const t=e.filter(UserTimings.excludeEvent),r=t.map((e=>({name:e.name,startTime:e.startTime,duration:e.isMark?void 0:e.duration,
1083
+ timingType:e.isMark?"Mark":"Measure"}))).sort(((e,t)=>e.timingType===t.timingType?e.startTime-t.startTime:"Measure"===e.timingType?-1:1)),a=[{key:"name",itemType:"text",text:OP(LP.UIStrings.columnName)},{key:"timingType",itemType:"text",text:OP(PP.columnType)},{key:"startTime",itemType:"ms",granularity:.01,text:OP(LP.UIStrings.columnStartTime)},{key:"duration",itemType:"ms",granularity:.01,text:OP(LP.UIStrings.columnDuration)}],n=NP.makeTableDetails(a,r);let i;return t.length&&(i=OP(PP.displayValue,{itemCount:t.length})),{score:Number(0===t.length),notApplicable:0===t.length,displayValue:i,details:n}}))}}kP.exports=UserTimings,kP.exports.UIStrings=PP;var FP={exports:{}};const UP=kc,jP=Ib,BP=ji,$P=oi,qP=Lo,zP=HT,VP=Dl,WP=Yp,GP=Xp,HP=eb,YP=vk,KP={title:"Preconnect to required origins",description:"Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect/).",
1084
+ unusedWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Only use `preconnect` for important origins that the page will certainly request.',crossoriginWarning:'A `<link rel=preconnect>` was found for "{securityOrigin}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.',tooManyPreconnectLinksWarning:"More than 2 `<link rel=preconnect>` connections were found. These should be used sparingly and only to the most important origins."},JP=$P.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preconnect.js",KP);class UsesRelPreconnectAudit extends UP{static get meta(){return{id:"uses-rel-preconnect",title:JP(KP.title),description:JP(KP.description),supportedModes:["navigation"],requiredArtifacts:["traces","devtoolsLogs","URL","LinkElements"],scoreDisplayMode:UP.SCORING_MODES.NUMERIC}}static hasValidTiming(e){return!!e.timing&&e.timing.connectEnd>0&&e.timing.connectStart>0}
1085
+ static hasAlreadyConnectedToOrigin(e){return!!e.timing&&e.timing.dnsEnd-e.timing.dnsStart==0&&e.timing.connectEnd-e.timing.connectStart==0}static socketStartTimeIsBelowThreshold(e,t){return Math.max(0,e.startTime-t.endTime)<15}static async audit(e,t){const r=e.traces[UsesRelPreconnectAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS],n=t.settings;let i=0;const o=[],s=await WP.request(r,t),[c,l,u,d,m]=await Promise.all([qP.request(a,t),zP.request({devtoolsLog:a,URL:e.URL},t),VP.request({devtoolsLog:a,settings:n},t),GP.request(s,t),HP.request({trace:r,devtoolsLog:a},t)]),{rtt:p,additionalRttByOrigin:h}=u.getOptions(),f=await YP.getPessimisticGraph(m,d),y=new Set;f.traverse((e=>{"network"===e.type&&y.add(e.record.url)}));const v=new Map;c.forEach((e=>{
1086
+ if(!UsesRelPreconnectAudit.hasValidTiming(e)||e.initiator.url===l.url||!e.parsedURL||!e.parsedURL.securityOrigin||l.parsedURL.securityOrigin===e.parsedURL.securityOrigin||!y.has(e.url)||UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(e)||!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(e,l))return;const t=e.parsedURL.securityOrigin,r=v.get(t)||[];r.push(e),v.set(t,r)}));const b=e.LinkElements.filter((e=>"preconnect"===e.rel)),w=new Set(b.map((e=>BP.getOrigin(e.href||""))));let S=[];v.forEach((e=>{const t=e.reduce(((e,t)=>t.startTime<e.startTime?t:e));if(!t.timing)return;const r=t.parsedURL.securityOrigin,a=h.get(r)||0;let n=p+a;"https"===t.parsedURL.scheme&&(n*=2);const s=1e3*t.startTime-1e3*l.endTime+t.timing.dnsStart,c=Math.min(n,s);c<50||(w.has(r)?o.push(JP(KP.crossoriginWarning,{securityOrigin:r})):(i=Math.max(c,i),S.push({url:r,wastedMs:c})))})),S=S.sort(((e,t)=>t.wastedMs-e.wastedMs))
1087
+ ;for(const e of w)e&&(c.some((t=>e===t.parsedURL.securityOrigin))||o.push(JP(KP.unusedWarning,{securityOrigin:e})));if(b.length>=2)return{score:1,warnings:b.length>=3?[...o,JP(KP.tooManyPreconnectLinksWarning)]:o};const T=[{key:"url",valueType:"url",label:JP($P.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",label:JP($P.UIStrings.columnWastedMs)}],E=UP.makeOpportunityDetails(T,S,i);return{score:jP.scoreForWastedMs(i),numericValue:i,numericUnit:"millisecond",displayValue:i?JP($P.UIStrings.displayValueMsSavings,{wastedMs:i}):"",warnings:o,details:E}}}FP.exports=UsesRelPreconnectAudit,FP.exports.UIStrings=KP;var XP={exports:{}};const ZP=ji,QP=Ki,eO=kc,tO=Ib,rO=ZT,aO=oi,nO=HT,iO=eb,oO=Dl,sO={title:"Preload key requests",description:"Consider using `<link rel=preload>` to prioritize fetching resources that are currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload/).",
1088
+ crossoriginWarning:'A preload `<link>` was found for "{preloadURL}" but was not used by the browser. Check that you are using the `crossorigin` attribute properly.'},cO=aO.createMessageInstanceIdFn("lighthouse-core/audits/uses-rel-preload.js",sO);class UsesRelPreloadAudit extends eO{static get meta(){return{id:"uses-rel-preload",title:cO(sO.title),description:cO(sO.description),supportedModes:["navigation"],requiredArtifacts:["devtoolsLogs","traces","URL"],scoreDisplayMode:eO.SCORING_MODES.NUMERIC}}static getURLsToPreload(e,t){const r=new Set;return t.traverse(((t,a)=>{if("network"!==t.type)return;const n=a.slice(1).filter((e=>"network"===e.type));UsesRelPreloadAudit.shouldPreloadRequest(t.record,e,n)&&r.add(t.record.url)})),r}static getURLsFailedToPreload(e){const t=[];e.traverse((e=>"network"===e.type&&t.push(e.record)));const r=t.filter((e=>e.isLinkPreload)),a=new Map;for(const e of r){const t=a.get(e.frameId)||new Set;t.add(e.url),a.set(e.frameId,t)}const n=t.filter((e=>{
1089
+ const t=a.get(e.frameId);if(!t)return!1;if(!t.has(e.url))return!1;return!(e.fromDiskCache||e.fromMemoryCache||e.fromPrefetchCache)&&!e.isLinkPreload}));return new Set(n.map((e=>e.url)))}static shouldPreloadRequest(e,t,r){const a=t.redirects?t.redirects.length:0;return!e.isLinkPreload&&(!!rO.isCritical(e,t)&&(!QP.isNonNetworkRequest(e)&&(r.length===a+2&&(e.frameId===t.frameId&&ZP.rootDomainsMatch(e.url,t.url)))))}static computeWasteWithGraph(e,t,r){if(!e.size)return{wastedMs:0,results:[]};const a=r.simulate(t,{flexibleOrdering:!0}),n=t.cloneWithRelationships(),i=[];let o=null;if(n.traverse((t=>{"network"===t.type&&(t.isMainDocument()?o=t:t.record&&e.has(t.record.url)&&i.push(t))})),!o)throw new Error("Could not find main document node");for(const e of i)e.removeAllDependencies(),e.addDependency(o);const s=r.simulate(n,{flexibleOrdering:!0}),c=Array.from(a.nodeTimings.keys()).reduce(((e,t)=>e.set(t.record,t)),new Map),l=[];for(const e of i){
1090
+ const t=c.get(e.record),r=s.nodeTimings.get(e),n=a.nodeTimings.get(t);if(!n||!r)throw new Error("Missing preload node");const i=Math.round(n.endTime-r.endTime);i<100||l.push({url:e.record.url,wastedMs:i})}return l.length?{wastedMs:Math.max(...l.map((e=>e.wastedMs))),results:l}:{wastedMs:0,results:l}}static async audit_(e,t){const r=e.traces[UsesRelPreloadAudit.DEFAULT_PASS],a=e.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS],n=e.URL,i={devtoolsLog:a,settings:t.settings},[o,s,c]=await Promise.all([nO.request({devtoolsLog:a,URL:n},t),iO.request({trace:r,devtoolsLog:a},t),oO.request(i,t)]),l=UsesRelPreloadAudit.getURLsToPreload(o,s),{results:u,wastedMs:d}=UsesRelPreloadAudit.computeWasteWithGraph(l,s,c);let m;u.sort(((e,t)=>t.wastedMs-e.wastedMs));const p=UsesRelPreloadAudit.getURLsFailedToPreload(s);p.size&&(m=Array.from(p).map((e=>cO(sO.crossoriginWarning,{preloadURL:e}))));const h=[{key:"url",valueType:"url",label:cO(aO.UIStrings.columnURL)},{key:"wastedMs",valueType:"timespanMs",
1091
+ label:cO(aO.UIStrings.columnWastedMs)}],f=eO.makeOpportunityDetails(h,u,d);return{score:tO.scoreForWastedMs(d),numericValue:d,numericUnit:"millisecond",displayValue:d?cO(aO.UIStrings.displayValueMsSavings,{wastedMs:d}):"",details:f,warnings:m}}static async audit(){return{score:1,notApplicable:!0,details:eO.makeOpportunityDetails([],[],0)}}}XP.exports=UsesRelPreloadAudit,XP.exports.UIStrings=sO;var lO={exports:{}};
1092
1092
  /**
1093
1093
  * @license Copyright 2020 Google Inc. All Rights Reserved.
1094
1094
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
1095
1095
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
1096
- */const lO=uw,uO=kc,dO=oi,mO={title:"Page has valid source maps",failureTitle:"Missing source maps for large first-party JavaScript",description:"Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps).",columnMapURL:"Map URL",missingSourceMapErrorMessage:"Large JavaScript file is missing a source map",missingSourceMapItemsWarningMesssage:"{missingItems, plural,\n =1 {Warning: missing 1 item in `.sourcesContent`}\n other {Warning: missing # items in `.sourcesContent`}\n }"},pO=dO.createMessageInstanceIdFn("lighthouse-core/audits/valid-source-maps.js",mO);cO.exports=class ValidSourceMaps extends uO{static get meta(){return{id:"valid-source-maps",title:pO(mO.title),failureTitle:pO(mO.failureTitle),
1097
- description:pO(mO.description),requiredArtifacts:["ScriptElements","SourceMaps","URL"]}}static isLargeFirstPartyJS(e,t){if(null===e.content)return!1;const r=e.content.length>=512e3,a=!!e.src&&lO.isFirstParty(e.src,lO.getEntity(t));return r&&a}static async audit(e){const{SourceMaps:t}=e,r=new Set;let a=!1;const n=[];for(const i of e.ScriptElements){if(!i.src)continue;const o=t.find((e=>e.scriptUrl===i.src)),s=[];if(!this.isLargeFirstPartyJS(i,e.URL.finalUrl)||o&&o.map||(a=!0,r.add(i.src),s.push({error:pO(mO.missingSourceMapErrorMessage)})),o&&!o.map&&s.push({error:o.errorMessage}),o?.map){const e=o.map.sourcesContent||[];let t=0;for(let r=0;r<o.map.sources.length;r++)(e.length<r||!e[r])&&(t+=1);t>0&&s.push({error:pO(mO.missingSourceMapItemsWarningMesssage,{missingItems:t})})}(o||s.length)&&n.push({scriptUrl:i.src,sourceMapUrl:o?.sourceMapUrl,subItems:{type:"subitems",items:s}})}const i=[{key:"scriptUrl",itemType:"url",subItemsHeading:{key:"error"},text:pO(dO.UIStrings.columnURL)},{
1098
- key:"sourceMapUrl",itemType:"url",text:pO(mO.columnMapURL)}];return n.sort(((e,t)=>{const a=r.has(e.scriptUrl),n=r.has(t.scriptUrl);return a&&!n?-1:!a&&n?1:e.subItems.items.length&&!t.subItems.items.length?-1:!e.subItems.items.length&&t.subItems.items.length?1:t.scriptUrl.localeCompare(e.scriptUrl)})),{score:a?0:1,details:uO.makeTableDetails(i,n)}}},cO.exports.UIStrings=mO;var hO={exports:{}};const gO=kc,fO=YN,yO={title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',failureTitle:'Does not have a `<meta name="viewport">` tag with `width` or `initial-scale`',description:'A `<meta name="viewport">` not only optimizes your app for mobile screen sizes, but also prevents [a 300 millisecond delay to user input](https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away). [Learn more](https://web.dev/viewport/).',explanationNoTag:'No `<meta name="viewport">` tag found'},vO=oi.createMessageInstanceIdFn("lighthouse-core/audits/viewport.js",yO)
1099
- ;hO.exports=class Viewport extends gO{static get meta(){return{id:"viewport",title:vO(yO.title),failureTitle:vO(yO.failureTitle),description:vO(yO.description),requiredArtifacts:["MetaElements"]}}static async audit(e,t){const r=await fO.request(e.MetaElements,t);return r.hasViewportTag?{score:Number(r.isMobileOptimized),warnings:r.parserWarnings}:{score:0,explanation:vO(yO.explanationNoTag)}}},hO.exports.UIStrings=yO;var bO={exports:{}};const wO=kc,SO=ah,TO=Yp,EO=oi,xO=Lo,_O=Ev,{taskGroups:AO}=wv,RO=ao,{getExecutionTimingsByURL:kO}=Iv,DO=$D.exports.defaultOptions,CO=vi.exports,IO={title:"Minimizes work during key interaction",failureTitle:"Minimize work during key interaction",description:"This is the thread-blocking work occurring during the Interaction to Next Paint measurement. [Learn more](https://web.dev/inp/).",inputDelay:"Input delay",processingDelay:"Processing delay",presentationDelay:"Presentation delay",
1100
- displayValue:"{timeInMs, number, milliseconds} ms spent on event '{interactionType}'",eventTarget:"Event target"},NO=EO.createMessageInstanceIdFn("lighthouse-core/audits/work-during-interaction.js",IO);class WorkDuringInteraction extends wO{static get meta(){return{id:"work-during-interaction",title:NO(IO.title),failureTitle:NO(IO.failureTitle),description:NO(IO.description),scoreDisplayMode:wO.SCORING_MODES.NUMERIC,supportedModes:["timespan"],requiredArtifacts:["traces","devtoolsLogs","TraceElements"]}}static recursivelyClipTasks(e,t,r,a){const n=e.event.ts,i=e.endEvent?.ts??e.event.ts+Number(e.event.dur||0);e.startTime=Math.max(r,Math.min(a,n))/1e3,e.endTime=Math.max(r,Math.min(a,i))/1e3,e.duration=e.endTime-e.startTime;const o=e.children.map((t=>WorkDuringInteraction.recursivelyClipTasks(t,e,r,a))).reduce(((e,t)=>e+t),0);return e.selfTime=e.duration-o,e.duration}static clipTasksByTs(e,t,r){for(const a of e)a.parent||WorkDuringInteraction.recursivelyClipTasks(a,void 0,t,r)}
1101
- static getPhaseTimes(e){const t=e.args.data,r=e.ts,a=r-1e3*t.timeStamp,n=a+1e3*t.processingStart,i=a+1e3*t.processingEnd;return{inputDelay:{startTs:r,endTs:n},processingDelay:{startTs:n,endTs:i},presentationDelay:{startTs:i,endTs:r+1e3*t.duration}}}static getThreadBreakdownTable(e,t,r,a){const n=RO.filteredTraceSort(t.traceEvents,(t=>t.pid===e.pid&&t.tid===e.tid)),i=n.reduce(((e,t)=>Math.max(t.ts+(t.dur||0),e)),0),{frames:o}=r,s=_O.getMainThreadTasks(n,o,i),c=WorkDuringInteraction.getPhaseTimes(e),l=[];for(const[e,t]of Object.entries(c)){WorkDuringInteraction.clipTasksByTs(s,t.startTs,t.endTs);const r=kO(s,a),n=[];for(const[e,t]of r){const r=Object.values(t).reduce(((e,t)=>e+t)),a=t[AO.scriptEvaluation.id]||0,i=t[AO.styleLayout.id]||0,o=t[AO.paintCompositeRender.id]||0;n.push({url:e,total:r,scripting:a,layout:i,render:o})}const i=n.filter((e=>e.total>1)).sort(((e,t)=>t.total-e.total));l.push({phase:NO(IO[e]),total:(t.endTs-t.startTs)/1e3,subItems:{type:"subitems",items:i}})}const u=[{
1102
- key:"phase",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:"Phase"},{key:"total",itemType:"ms",subItemsHeading:{key:"total",granularity:1,itemType:"ms"},granularity:1,text:"Total time"},{key:null,itemType:"ms",subItemsHeading:{key:"scripting",granularity:1,itemType:"ms"},text:"Script evaluation"},{key:null,itemType:"ms",subItemsHeading:{key:"layout",granularity:1,itemType:"ms"},text:AO.styleLayout.label},{key:null,itemType:"ms",subItemsHeading:{key:"render",granularity:1,itemType:"ms"},text:AO.paintCompositeRender.label}];return{table:wO.makeTableDetails(u,l),phases:c}}static getTraceElementTable(e){const t=e.find((e=>"responsiveness"===e.traceEventType));if(!t)return;const r=[{key:"node",itemType:"node",text:NO(IO.eventTarget)}],a=[{node:wO.makeNodeItem(t.node)}];return wO.makeTableDetails(r,a)}static async audit(e,t){const{settings:r}=t;if("simulate"===r.throttlingMethod)return{score:null,notApplicable:!0};const a=e.traces[WorkDuringInteraction.DEFAULT_PASS],n={
1103
- trace:a,settings:r},i=await SO.request(n,t);if(null===i)return{score:null,notApplicable:!0};if("FallbackTiming"===i.name)throw new CO(CO.errors.UNSUPPORTED_OLD_CHROME,{featureName:"detailed EventTiming trace events"});const o=[],s=WorkDuringInteraction.getTraceElementTable(e.TraceElements);s&&o.push(s);const c=e.devtoolsLogs[WorkDuringInteraction.DEFAULT_PASS],l=await xO.request(c,t),u=await TO.request(a,t),{table:d,phases:m}=WorkDuringInteraction.getThreadBreakdownTable(i,a,u,l);o.push(d);const p=i.args.data.type;o.push({type:"debugdata",interactionType:p,phases:m});const h=i.args.data.duration,f=NO(IO.displayValue,{timeInMs:h,interactionType:p});return{score:h<DO.p10?1:0,displayValue:f,details:{type:"list",items:o}}}}bO.exports=WorkDuringInteraction,bO.exports.UIStrings=IO;var LO={exports:{}},MO={exports:{}};const PO={GROUPS__METRICS:"Metrics",GROUPS__ADS_PERFORMANCE:"Ad Speed",GROUPS__ADS_BEST_PRACTICES:"Tag Best Practices",NOT_APPLICABLE__DEFAULT:"Audit not applicable",
1096
+ */const uO=uw,dO=kc,mO=oi,pO={title:"Page has valid source maps",failureTitle:"Missing source maps for large first-party JavaScript",description:"Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps).",columnMapURL:"Map URL",missingSourceMapErrorMessage:"Large JavaScript file is missing a source map",missingSourceMapItemsWarningMesssage:"{missingItems, plural,\n =1 {Warning: missing 1 item in `.sourcesContent`}\n other {Warning: missing # items in `.sourcesContent`}\n }"},hO=mO.createMessageInstanceIdFn("lighthouse-core/audits/valid-source-maps.js",pO);lO.exports=class ValidSourceMaps extends dO{static get meta(){return{id:"valid-source-maps",title:hO(pO.title),failureTitle:hO(pO.failureTitle),
1097
+ description:hO(pO.description),requiredArtifacts:["ScriptElements","SourceMaps","URL"]}}static isLargeFirstPartyJS(e,t){if(null===e.content)return!1;const r=e.content.length>=512e3,a=!!e.src&&uO.isFirstParty(e.src,uO.getEntity(t));return r&&a}static async audit(e){const{SourceMaps:t}=e,r=new Set;let a=!1;const n=[];for(const i of e.ScriptElements){if(!i.src)continue;const o=t.find((e=>e.scriptUrl===i.src)),s=[];if(!this.isLargeFirstPartyJS(i,e.URL.finalUrl)||o&&o.map||(a=!0,r.add(i.src),s.push({error:hO(pO.missingSourceMapErrorMessage)})),o&&!o.map&&s.push({error:o.errorMessage}),o?.map){const e=o.map.sourcesContent||[];let t=0;for(let r=0;r<o.map.sources.length;r++)(e.length<r||!e[r])&&(t+=1);t>0&&s.push({error:hO(pO.missingSourceMapItemsWarningMesssage,{missingItems:t})})}(o||s.length)&&n.push({scriptUrl:i.src,sourceMapUrl:o?.sourceMapUrl,subItems:{type:"subitems",items:s}})}const i=[{key:"scriptUrl",itemType:"url",subItemsHeading:{key:"error"},text:hO(mO.UIStrings.columnURL)},{
1098
+ key:"sourceMapUrl",itemType:"url",text:hO(pO.columnMapURL)}];return n.sort(((e,t)=>{const a=r.has(e.scriptUrl),n=r.has(t.scriptUrl);return a&&!n?-1:!a&&n?1:e.subItems.items.length&&!t.subItems.items.length?-1:!e.subItems.items.length&&t.subItems.items.length?1:t.scriptUrl.localeCompare(e.scriptUrl)})),{score:a?0:1,details:dO.makeTableDetails(i,n)}}},lO.exports.UIStrings=pO;var gO={exports:{}};const fO=kc,yO=KN,vO={title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',failureTitle:'Does not have a `<meta name="viewport">` tag with `width` or `initial-scale`',description:'A `<meta name="viewport">` not only optimizes your app for mobile screen sizes, but also prevents [a 300 millisecond delay to user input](https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away). [Learn more](https://web.dev/viewport/).',explanationNoTag:'No `<meta name="viewport">` tag found'},bO=oi.createMessageInstanceIdFn("lighthouse-core/audits/viewport.js",vO)
1099
+ ;gO.exports=class Viewport extends fO{static get meta(){return{id:"viewport",title:bO(vO.title),failureTitle:bO(vO.failureTitle),description:bO(vO.description),requiredArtifacts:["MetaElements"]}}static async audit(e,t){const r=await yO.request(e.MetaElements,t);return r.hasViewportTag?{score:Number(r.isMobileOptimized),warnings:r.parserWarnings}:{score:0,explanation:bO(vO.explanationNoTag)}}},gO.exports.UIStrings=vO;var wO={exports:{}};const SO=kc,TO=ah,EO=Yp,xO=oi,_O=Lo,AO=Ev,{taskGroups:RO}=wv,kO=ao,{getExecutionTimingsByURL:DO}=Iv,CO=$D.exports.defaultOptions,IO=vi.exports,NO={title:"Minimizes work during key interaction",failureTitle:"Minimize work during key interaction",description:"This is the thread-blocking work occurring during the Interaction to Next Paint measurement. [Learn more](https://web.dev/inp/).",inputDelay:"Input delay",processingDelay:"Processing delay",presentationDelay:"Presentation delay",
1100
+ displayValue:"{timeInMs, number, milliseconds} ms spent on event '{interactionType}'",eventTarget:"Event target"},LO=xO.createMessageInstanceIdFn("lighthouse-core/audits/work-during-interaction.js",NO);class WorkDuringInteraction extends SO{static get meta(){return{id:"work-during-interaction",title:LO(NO.title),failureTitle:LO(NO.failureTitle),description:LO(NO.description),scoreDisplayMode:SO.SCORING_MODES.NUMERIC,supportedModes:["timespan"],requiredArtifacts:["traces","devtoolsLogs","TraceElements"]}}static recursivelyClipTasks(e,t,r,a){const n=e.event.ts,i=e.endEvent?.ts??e.event.ts+Number(e.event.dur||0);e.startTime=Math.max(r,Math.min(a,n))/1e3,e.endTime=Math.max(r,Math.min(a,i))/1e3,e.duration=e.endTime-e.startTime;const o=e.children.map((t=>WorkDuringInteraction.recursivelyClipTasks(t,e,r,a))).reduce(((e,t)=>e+t),0);return e.selfTime=e.duration-o,e.duration}static clipTasksByTs(e,t,r){for(const a of e)a.parent||WorkDuringInteraction.recursivelyClipTasks(a,void 0,t,r)}
1101
+ static getPhaseTimes(e){const t=e.args.data,r=e.ts,a=r-1e3*t.timeStamp,n=a+1e3*t.processingStart,i=a+1e3*t.processingEnd;return{inputDelay:{startTs:r,endTs:n},processingDelay:{startTs:n,endTs:i},presentationDelay:{startTs:i,endTs:r+1e3*t.duration}}}static getThreadBreakdownTable(e,t,r,a){const n=kO.filteredTraceSort(t.traceEvents,(t=>t.pid===e.pid&&t.tid===e.tid)),i=n.reduce(((e,t)=>Math.max(t.ts+(t.dur||0),e)),0),{frames:o}=r,s=AO.getMainThreadTasks(n,o,i),c=WorkDuringInteraction.getPhaseTimes(e),l=[];for(const[e,t]of Object.entries(c)){WorkDuringInteraction.clipTasksByTs(s,t.startTs,t.endTs);const r=DO(s,a),n=[];for(const[e,t]of r){const r=Object.values(t).reduce(((e,t)=>e+t)),a=t[RO.scriptEvaluation.id]||0,i=t[RO.styleLayout.id]||0,o=t[RO.paintCompositeRender.id]||0;n.push({url:e,total:r,scripting:a,layout:i,render:o})}const i=n.filter((e=>e.total>1)).sort(((e,t)=>t.total-e.total));l.push({phase:LO(NO[e]),total:(t.endTs-t.startTs)/1e3,subItems:{type:"subitems",items:i}})}const u=[{
1102
+ key:"phase",itemType:"text",subItemsHeading:{key:"url",itemType:"url"},text:"Phase"},{key:"total",itemType:"ms",subItemsHeading:{key:"total",granularity:1,itemType:"ms"},granularity:1,text:"Total time"},{key:null,itemType:"ms",subItemsHeading:{key:"scripting",granularity:1,itemType:"ms"},text:"Script evaluation"},{key:null,itemType:"ms",subItemsHeading:{key:"layout",granularity:1,itemType:"ms"},text:RO.styleLayout.label},{key:null,itemType:"ms",subItemsHeading:{key:"render",granularity:1,itemType:"ms"},text:RO.paintCompositeRender.label}];return{table:SO.makeTableDetails(u,l),phases:c}}static getTraceElementTable(e){const t=e.find((e=>"responsiveness"===e.traceEventType));if(!t)return;const r=[{key:"node",itemType:"node",text:LO(NO.eventTarget)}],a=[{node:SO.makeNodeItem(t.node)}];return SO.makeTableDetails(r,a)}static async audit(e,t){const{settings:r}=t;if("simulate"===r.throttlingMethod)return{score:null,notApplicable:!0};const a=e.traces[WorkDuringInteraction.DEFAULT_PASS],n={
1103
+ trace:a,settings:r},i=await TO.request(n,t);if(null===i)return{score:null,notApplicable:!0};if("FallbackTiming"===i.name)throw new IO(IO.errors.UNSUPPORTED_OLD_CHROME,{featureName:"detailed EventTiming trace events"});const o=[],s=WorkDuringInteraction.getTraceElementTable(e.TraceElements);s&&o.push(s);const c=e.devtoolsLogs[WorkDuringInteraction.DEFAULT_PASS],l=await _O.request(c,t),u=await EO.request(a,t),{table:d,phases:m}=WorkDuringInteraction.getThreadBreakdownTable(i,a,u,l);o.push(d);const p=i.args.data.type;o.push({type:"debugdata",interactionType:p,phases:m});const h=i.args.data.duration,f=LO(NO.displayValue,{timeInMs:h,interactionType:p});return{score:h<CO.p10?1:0,displayValue:f,details:{type:"list",items:o}}}}wO.exports=WorkDuringInteraction,wO.exports.UIStrings=NO;var MO={exports:{}},PO={exports:{}};const OO={GROUPS__METRICS:"Metrics",GROUPS__ADS_PERFORMANCE:"Ad Speed",GROUPS__ADS_BEST_PRACTICES:"Tag Best Practices",NOT_APPLICABLE__DEFAULT:"Audit not applicable",
1104
1104
  NOT_APPLICABLE__INVALID_TIMING:"Invalid timing task data",NOT_APPLICABLE__NO_AD_RELATED_REQ:"No ad-related requests",NOT_APPLICABLE__NO_AD_RENDERED:"No ads rendered",NOT_APPLICABLE__NO_ADS_VIEWPORT:"No ads in viewport",NOT_APPLICABLE__NO_ADS:"No ads requested",NOT_APPLICABLE__NO_BIDS:"No bids detected",NOT_APPLICABLE__NO_EVENT_MATCHING_REQ:"No event matches network records",NOT_APPLICABLE__NO_GPT:"GPT not requested",NOT_APPLICABLE__NO_RECORDS:"No successful network records",NOT_APPLICABLE__NO_VISIBLE_SLOTS:"No visible slots",NOT_APPLICABLE__NO_TAG:"No tag requested",NOT_APPLICABLE__NO_TAGS:"No tags requested",NOT_APPLICABLE__NO_TASKS:"No tasks to compare",NOT_APPLICABLE__NO_VALID_AD_WIDTHS:"No requested ads contain ads of valid width",NOT_APPLICABLE__NO_LAYOUT_SHIFTS:"No layout shift events found",ERRORS__AREA_LARGER_THAN_VIEWPORT:"Calculated ad area is larger than viewport",ERRORS__VIEWPORT_AREA_ZERO:"Viewport area is zero",
1105
- WARNINGS__NO_ADS:"No ads were requested when fetching this page.",WARNINGS__NO_AD_RENDERED:"No ads were rendered when rendering this page.",WARNINGS__NO_TAG:"The GPT tag was not requested."},OO=oi.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js",PO),notApplicableObj=e=>({notApplicable:!0,score:1,displayValue:OO(e)}),FO={Default:notApplicableObj(PO.NOT_APPLICABLE__DEFAULT),InvalidTiming:notApplicableObj(PO.NOT_APPLICABLE__INVALID_TIMING),NoAdRelatedReq:notApplicableObj(PO.NOT_APPLICABLE__NO_AD_RELATED_REQ),NoAdRendered:notApplicableObj(PO.NOT_APPLICABLE__NO_AD_RENDERED),NoAdsViewport:notApplicableObj(PO.NOT_APPLICABLE__NO_ADS_VIEWPORT),NoAds:notApplicableObj(PO.NOT_APPLICABLE__NO_ADS),NoBids:notApplicableObj(PO.NOT_APPLICABLE__NO_BIDS),NoEventMatchingReq:notApplicableObj(PO.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),NoGpt:notApplicableObj(PO.NOT_APPLICABLE__NO_GPT),NoLayoutShifts:notApplicableObj(PO.NOT_APPLICABLE__NO_LAYOUT_SHIFTS),
1106
- NoRecords:notApplicableObj(PO.NOT_APPLICABLE__NO_RECORDS),NoVisibleSlots:notApplicableObj(PO.NOT_APPLICABLE__NO_VISIBLE_SLOTS),NoTag:notApplicableObj(PO.NOT_APPLICABLE__NO_TAG),NoTags:notApplicableObj(PO.NOT_APPLICABLE__NO_TAGS),NoTasks:notApplicableObj(PO.NOT_APPLICABLE__NO_TASKS),NoValidAdWidths:notApplicableObj(PO.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)},UO={NoAds:OO(PO.WARNINGS__NO_ADS),NoAdRendered:OO(PO.WARNINGS__NO_AD_RENDERED),NoTag:OO(PO.WARNINGS__NO_TAG)},jO={ViewportAreaZero:OO(PO.ERRORS__VIEWPORT_AREA_ZERO)},BO={Metrics:OO(PO.GROUPS__METRICS),AdsPerformance:OO(PO.GROUPS__ADS_PERFORMANCE),AdsBestPractices:OO(PO.GROUPS__ADS_BEST_PRACTICES)};MO.exports={auditNotApplicable:FO,runWarning:UO,auditError:jO,group:BO},MO.exports.UIStrings=PO,function(e){const t=oi,{group:r}=MO.exports,a="lighthouse-plugin-publisher-ads",n={
1105
+ WARNINGS__NO_ADS:"No ads were requested when fetching this page.",WARNINGS__NO_AD_RENDERED:"No ads were rendered when rendering this page.",WARNINGS__NO_TAG:"The GPT tag was not requested."},FO=oi.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js",OO),notApplicableObj=e=>({notApplicable:!0,score:1,displayValue:FO(e)}),UO={Default:notApplicableObj(OO.NOT_APPLICABLE__DEFAULT),InvalidTiming:notApplicableObj(OO.NOT_APPLICABLE__INVALID_TIMING),NoAdRelatedReq:notApplicableObj(OO.NOT_APPLICABLE__NO_AD_RELATED_REQ),NoAdRendered:notApplicableObj(OO.NOT_APPLICABLE__NO_AD_RENDERED),NoAdsViewport:notApplicableObj(OO.NOT_APPLICABLE__NO_ADS_VIEWPORT),NoAds:notApplicableObj(OO.NOT_APPLICABLE__NO_ADS),NoBids:notApplicableObj(OO.NOT_APPLICABLE__NO_BIDS),NoEventMatchingReq:notApplicableObj(OO.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),NoGpt:notApplicableObj(OO.NOT_APPLICABLE__NO_GPT),NoLayoutShifts:notApplicableObj(OO.NOT_APPLICABLE__NO_LAYOUT_SHIFTS),
1106
+ NoRecords:notApplicableObj(OO.NOT_APPLICABLE__NO_RECORDS),NoVisibleSlots:notApplicableObj(OO.NOT_APPLICABLE__NO_VISIBLE_SLOTS),NoTag:notApplicableObj(OO.NOT_APPLICABLE__NO_TAG),NoTags:notApplicableObj(OO.NOT_APPLICABLE__NO_TAGS),NoTasks:notApplicableObj(OO.NOT_APPLICABLE__NO_TASKS),NoValidAdWidths:notApplicableObj(OO.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)},jO={NoAds:FO(OO.WARNINGS__NO_ADS),NoAdRendered:FO(OO.WARNINGS__NO_AD_RENDERED),NoTag:FO(OO.WARNINGS__NO_TAG)},BO={ViewportAreaZero:FO(OO.ERRORS__VIEWPORT_AREA_ZERO)},$O={Metrics:FO(OO.GROUPS__METRICS),AdsPerformance:FO(OO.GROUPS__ADS_PERFORMANCE),AdsBestPractices:FO(OO.GROUPS__ADS_BEST_PRACTICES)};PO.exports={auditNotApplicable:UO,runWarning:jO,auditError:BO,group:$O},PO.exports.UIStrings=OO,function(e){const t=oi,{group:r}=PO.exports,a="lighthouse-plugin-publisher-ads",n={
1107
1107
  categoryDescription:"A Lighthouse plugin to improve ad speed and overall quality that is targeted at sites using GPT or AdSense tag. [Learn more](https://developers.google.com/publisher-ads-audits/reference)"},i=t.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/plugin.js",n);e.exports={audits:[{path:`${a}/audits/ad-blocking-tasks`},{path:`${a}/audits/ad-render-blocking-resources`},{path:`${a}/audits/ad-request-critical-path`},{path:`${a}/audits/bid-request-from-page-start`},{path:`${a}/audits/ad-request-from-page-start`},{path:`${a}/audits/ad-top-of-viewport`},{path:`${a}/audits/ads-in-viewport`},{path:`${a}/audits/async-ad-tags`},{path:`${a}/audits/blocking-load-events`},{path:`${a}/audits/bottleneck-requests`},{path:`${a}/audits/duplicate-tags`},{path:`${a}/audits/first-ad-render`},{path:`${a}/audits/full-width-slots`},{path:`${a}/audits/gpt-bids-parallel`},{path:`${a}/audits/loads-gpt-from-official-source`},{path:`${a}/audits/loads-ad-tag-over-https`},{
1108
1108
  path:`${a}/audits/script-injected-tags`},{path:`${a}/audits/serial-header-bidding`},{path:`${a}/audits/tag-load-time`},{path:`${a}/audits/viewport-ad-density`},{path:`${a}/audits/cumulative-ad-shift`},{path:`${a}/audits/deprecated-api-usage`},{path:`${a}/audits/gpt-errors-overall`},{path:`${a}/audits/total-ad-blocking-time`}],groups:{metrics:{title:r.Metrics},"ads-performance":{title:r.AdsPerformance},"ads-best-practices":{title:r.AdsBestPractices}},category:{title:"Publisher Ads",description:i(n.categoryDescription),auditRefs:[{id:"tag-load-time",weight:5,group:"metrics"},{id:"bid-request-from-page-start",weight:5,group:"metrics"},{id:"ad-request-from-page-start",weight:25,group:"metrics"},{id:"first-ad-render",weight:10,group:"metrics"},{id:"cumulative-ad-shift",weight:5,group:"metrics"},{id:"total-ad-blocking-time",weight:2,group:"metrics"},{id:"gpt-bids-parallel",weight:1,group:"ads-performance"},{id:"serial-header-bidding",weight:1,group:"ads-performance"},{
1109
1109
  id:"bottleneck-requests",weight:1,group:"ads-performance"},{id:"script-injected-tags",weight:1,group:"ads-performance"},{id:"blocking-load-events",weight:1,group:"ads-performance"},{id:"ad-render-blocking-resources",weight:1,group:"ads-performance"},{id:"ad-blocking-tasks",weight:1,group:"ads-performance"},{id:"ad-request-critical-path",weight:0,group:"ads-performance"},{id:"ads-in-viewport",weight:4,group:"ads-best-practices"},{id:"async-ad-tags",weight:2,group:"ads-best-practices"},{id:"loads-ad-tag-over-https",weight:1,group:"ads-best-practices"},{id:"loads-gpt-from-official-source",weight:4,group:"ads-best-practices"},{id:"viewport-ad-density",weight:2,group:"ads-best-practices"},{id:"ad-top-of-viewport",weight:2,group:"ads-best-practices"},{id:"duplicate-tags",weight:1,group:"ads-best-practices"},{id:"deprecated-gpt-api-usage",weight:0,group:"ads-best-practices"},{id:"gpt-errors-overall",weight:0,group:"ads-best-practices"}]}},Object.defineProperty(e.exports,"UIStrings",{
1110
- enumerable:!1,get:()=>n})}(LO);var $O={exports:{}},qO=[{label:"Prebid JS",patterns:["^https?://([^.]*.)?prebid[.]org/.*","^https?://acdn[.]adnxs[.]com/prebid/.*"]},{label:"33Across",patterns:["^https?://ssc[.]33across.com/api/.*"]},{label:"AppNexus",patterns:["^https?://ib[.]adnxs[.]com/.*"]},{label:"Amazon Ads",patterns:["^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*"]},{label:"AdTechus (AOL)",patterns:["^https?://([^.]*.)?adserver[.]adtechus[.]com/.*"]},{label:"Aardvark",patterns:["^https?://thor[.]rtk[.]io/.*"]},{label:"AdBlade",patterns:["^https?://rtb[.]adblade[.]com/prebidjs/bid.*"]},{label:"AdBund",patterns:["^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*","^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*"]},{label:"AdButler",patterns:["^https?://servedbyadbutler[.]com/adserve.*"]},{label:"Adequant",patterns:["^https?://rex[.]adequant[.]com/rex/c2s_prebid.*"]},{label:"AdForm",patterns:["^https?://adx[.]adform[.]net/adx.*"]},{label:"AdMedia",
1110
+ enumerable:!1,get:()=>n})}(MO);var qO={exports:{}},zO=[{label:"Prebid JS",patterns:["^https?://([^.]*.)?prebid[.]org/.*","^https?://acdn[.]adnxs[.]com/prebid/.*"]},{label:"33Across",patterns:["^https?://ssc[.]33across.com/api/.*"]},{label:"AppNexus",patterns:["^https?://ib[.]adnxs[.]com/.*"]},{label:"Amazon Ads",patterns:["^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*"]},{label:"AdTechus (AOL)",patterns:["^https?://([^.]*.)?adserver[.]adtechus[.]com/.*"]},{label:"Aardvark",patterns:["^https?://thor[.]rtk[.]io/.*"]},{label:"AdBlade",patterns:["^https?://rtb[.]adblade[.]com/prebidjs/bid.*"]},{label:"AdBund",patterns:["^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*","^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*"]},{label:"AdButler",patterns:["^https?://servedbyadbutler[.]com/adserve.*"]},{label:"Adequant",patterns:["^https?://rex[.]adequant[.]com/rex/c2s_prebid.*"]},{label:"AdForm",patterns:["^https?://adx[.]adform[.]net/adx.*"]},{label:"AdMedia",
1111
1111
  patterns:["^https?://b[.]admedia[.]com/banner/prebid/bidder.*"]},{label:"AdMixer",patterns:["^https?://inv-nets[.]admixer[.]net/prebid[.]aspx.*","^https?://inv-nets[.]admixer[.]net/videoprebid[.]aspx.*"]},{label:"AOL",patterns:["^https?://adserver-us[.]adtech[.]advertising[.]com.*","^https?://adserver-eu[.]adtech[.]advertising[.]com.*","^https?://adserver-as[.]adtech[.]advertising[.]com.*","^https?://adserver[.]adtech[.]de/pubapi/.*"]},{label:"Beachfront",patterns:["^https?://reachms[.]bfmio[.]com/bid[.]json?exchange_id=.*"]},{label:"Bidfluence",patterns:["^https?://cdn[.]bidfluence[.]com/forge[.]js.*"]},{label:"Brightcom",patterns:["^https?://hb[.]iselephant[.]com/auc/ortb.*"]},{label:"C1x",patterns:["^https?://ht-integration[.]c1exchange[.]com:9000/ht.*"]},{label:"CentroBid",patterns:["^https?://t[.]brand-server[.]com/hb.*"]},{label:"Conversant",patterns:["^https?://media[.]msg[.]dotomi[.]com/s2s/.*"]},{label:"Criteo",
1112
1112
  patterns:["^https?://static[.]criteo[.]net/js/ld/publishertag[.]js.*","^https?://([^.]*.)?bidder[.]criteo[.]com/cdb.*","^https?://([^.]*.)?rtax[.]criteo[.]com/delivery/rta.*","^https?://([^.]*.)?rtax[.]eu[.]criteo[.]com/delivery/rta.*"]},{label:"Datablocks",patterns:["^https?://[a-z0-9_.-]*[.]dblks[.]net/.*"]},{label:"Districtm",patterns:["^https?://prebid[.]districtm[.]ca/lib[.]js.*"]},{label:"E-Planning",patterns:["^https?://ads[.]us[.]e-planning[.]net.*"]},{label:"Essens",patterns:["^https?://bid[.]essrtb[.]com/bid/prebid_call.*"]},{label:"Facebook",patterns:["^https?://an[.]facebook[.]com/v2/placementbid[.]json.*"]},{label:"FeatureForward",patterns:["^https?://prmbdr[.]featureforward[.]com/newbidder/.*"]},{label:"Fidelity",patterns:["^https?://x[.]fidelity-media[.]com.*"]},{label:"GetIntent",patterns:["^https?://px[.]adhigh[.]net/rtb/direct_banner.*","^https?://px[.]adhigh[.]net/rtb/direct_vast.*"]},{label:"GumGum",patterns:["^https?://g2[.]gumgum[.]com/hbid/imp.*"]},{
1113
1113
  label:"Hiromedia",patterns:["^https?://hb-rtb[.]ktdpublishers[.]com/bid/get.*"]},{label:"Imonomy",patterns:["^https?://b[.]imonomy[.]com/openrtb/hb/.*"]},{label:"ImproveDigital",patterns:["^https?://ad[.]360yield[.]com/hb.*"]},{label:"IndexExchange",patterns:["^https?://as(-sec)?[.]casalemedia[.]com/(cygnus|headertag).*","^https?://js(-sec)?[.]indexww[.]com/ht/.*"]},{label:"InnerActive",patterns:["^https?://ad-tag[.]inner-active[.]mobi/simpleM2M/requestJsonAd.*"]},{label:"Innity",patterns:["^https?://as[.]innity[.]com/synd/.*"]},{label:"JCM",patterns:["^https?://media[.]adfrontiers[.]com/pq.*"]},{label:"JustPremium",patterns:["^https?://pre[.]ads[.]justpremium[.]com/v/.*"]},{label:"Kargo",patterns:["^https?://krk[.]kargo[.]com/api/v1/bid.*"]},{label:"Komoona",patterns:["^https?://bidder[.]komoona[.]com/v1/GetSBids.*"]},{label:"KruxLink",patterns:["^https?://link[.]krxd[.]net/hb.*"]},{label:"Kumma",patterns:["^https?://cdn[.]kumma[.]com/pb_ortb[.]js.*"]},{label:"Mantis",
1114
1114
  patterns:["^https?://mantodea[.]mantisadnetwork[.]com/website/prebid.*"]},{label:"MarsMedia",patterns:["^https?://bid306[.]rtbsrv[.]com:9306/bidder.*"]},{label:"Media.net",patterns:["^https?://contextual[.]media[.]net/bidexchange.*"]},{label:"MemeGlobal",patterns:["^https?://stinger[.]memeglobal[.]com/api/v1/services/prebid.*"]},{label:"MobFox",patterns:["^https?://my[.]mobfox[.]com/request[.]php.*"]},{label:"NanoInteractive",patterns:["^https?://tmp[.]audiencemanager[.]de/hb.*"]},{label:"OpenX",patterns:["^https?://([^.]*.)?d[.]openx[.]net/w/1[.]0/arj.*","^https?://([^.]*.)?servedbyopenx[.]com/.*"]},{label:"Piximedia",patterns:["^https?://static[.]adserver[.]pm/prebid.*"]},{label:"Platformio",patterns:["^https?://piohbdisp[.]hb[.]adx1[.]com.*"]},{label:"Pollux",patterns:["^https?://adn[.]plxnt[.]com/prebid.*"]},{label:"PubGears",patterns:["^https?://c[.]pubgears[.]com/tags.*"]},{label:"Pubmatic",
1115
1115
  patterns:["^https?://ads[.]pubmatic[.]com/AdServer/js/gshowad[.]js.*","^https?://([^.]*.)?gads.pubmatic[.]com/.*","^https?://hbopenbid.pubmatic[.]com/.*"]},{label:"Pulsepoint",patterns:["^https?://bid[.]contextweb[.]com/header/tag.*"]},{label:"Quantcast",patterns:["^https?://global[.]qc[.]rtb[.]quantserve[.]com:8080/qchb.*"]},{label:"Rhythmone",patterns:["^https?://tag[.]1rx[.]io/rmp/.*"]},{label:"Roxot",patterns:["^https?://r[.]rxthdr[.]com.*"]},{label:"Rubicon",patterns:["^https?://([^.]*.)?(fastlane|optimized-by|anvil)[.]rubiconproject[.]com/a/api.*","^https?://fastlane-adv[.]rubiconproject[.]com/v1/auction/video.*"]},{label:"Sekindo",patterns:["^https?://hb[.]sekindo[.]com/live/liveView[.]php.*"]},{label:"ShareThrough",patterns:["^https?://btlr[.]sharethrough[.]com/header-bid/.*"]},{label:"Smart AdServer",patterns:["^https?://prg[.]smartadserver[.]com/prebid.*"]},{label:"Sonobi",patterns:["^https?://apex[.]go[.]sonobi[.]com/trinity[.]js.*"]},{label:"Sovrn",
1116
1116
  patterns:["^https?://ap[.]lijit[.]com/rtb/bid.*"]},{label:"SpringServe",patterns:["^https?://bidder[.]springserve[.]com/display/hbid.*"]},{label:"StickyAds",patterns:["^https?://cdn[.]stickyadstv[.]com/mustang/mustang[.]min[.]js.*","^https?://cdn[.]stickyadstv[.]com/prime-time/.*"]},{label:"TapSense3",patterns:["^https?://ads04[.]tapsense[.]com/ads/headerad.*"]},{label:"ThoughtLeadr",patterns:["^https?://a[.]thoughtleadr[.]com/v4/.*"]},{label:"TremorBid",patterns:["^https?://([^.]*.)?ads[.]tremorhub[.]com/ad/tag.*"]},{label:"Trion",patterns:["^https?://in-appadvertising[.]com/api/bidRequest.*"]},{label:"TripleLift",patterns:["^https?://tlx[.]3lift[.]com/header/auction.*"]},{label:"TrustX",patterns:["^https?://sofia[.]trustx[.]org/hb.*"]},{label:"UCFunnel",patterns:["^https?://agent[.]aralego[.]com/header.*"]},{label:"Underdog Media",patterns:["^https?://udmserve[.]net/udm/img[.]fetch.*"]},{label:"UnRuly",patterns:["^https?://targeting[.]unrulymedia[.]com/prebid.*"]},{
1117
- label:"VertaMedia",patterns:["^https?://rtb[.]vertamedia[.]com/hb/.*"]},{label:"Vertoz",patterns:["^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*"]},{label:"WideOrbig",patterns:["^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*"]},{label:"WideSpace",patterns:["^https?://engine[.]widespace[.]com/map/engine/hb/.*"]},{label:"YieldBot",patterns:["^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*"]},{label:"YieldMo",patterns:["^https?://ads[.]yieldmo[.]com/exchange/prebid.*"]}];const zO=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g,VO="max-age",WO="s-maxage",GO="max-stale",HO="min-fresh",YO="immutable",KO="must-revalidate",JO="no-cache",XO="no-store",ZO="no-transform",QO="only-if-cached",eF="private",tF="proxy-revalidate",rF="public";function parseBooleanOnly(e){return null===e}function parseDuration(e){if(!e)return null;const t=parseInt(e,10);return!Number.isFinite(t)||t<0?null:t}class CacheControl{constructor(){this.maxAge=null,this.sharedMaxAge=null,
1118
- this.maxStale=null,this.maxStaleDuration=null,this.minFresh=null,this.immutable=null,this.mustRevalidate=null,this.noCache=null,this.noStore=null,this.noTransform=null,this.onlyIfCached=null,this.private=null,this.proxyRevalidate=null,this.public=null}parse(e){if(!e||0===e.length)return this;const t={},r=e.match(zO)||[];return Array.prototype.forEach.call(r,(e=>{const r=e.split("=",2),[a]=r;let n=null;r.length>1&&(n=r[1].trim()),t[a.toLowerCase()]=n})),this.maxAge=parseDuration(t[VO]),this.sharedMaxAge=parseDuration(t[WO]),this.maxStale=parseBooleanOnly(t[GO]),this.maxStaleDuration=parseDuration(t[GO]),this.maxStaleDuration&&(this.maxStale=!0),this.minFresh=parseDuration(t[HO]),this.immutable=parseBooleanOnly(t[YO]),this.mustRevalidate=parseBooleanOnly(t[KO]),this.noCache=parseBooleanOnly(t[JO]),this.noStore=parseBooleanOnly(t[XO]),this.noTransform=parseBooleanOnly(t[ZO]),this.onlyIfCached=parseBooleanOnly(t[QO]),this.private=parseBooleanOnly(t[eF]),
1119
- this.proxyRevalidate=parseBooleanOnly(t[tF]),this.public=parseBooleanOnly(t[rF]),this}format(){const e=[];return"number"==typeof this.maxAge&&e.push(`${VO}=${this.maxAge}`),"number"==typeof this.sharedMaxAge&&e.push(`${WO}=${this.sharedMaxAge}`),this.maxStale&&("number"==typeof this.maxStaleDuration?e.push(`${GO}=${this.maxStaleDuration}`):e.push(GO)),"number"==typeof this.minFresh&&e.push(`${HO}=${this.minFresh}`),this.immutable&&e.push(YO),this.mustRevalidate&&e.push(KO),this.noCache&&e.push(JO),this.noStore&&e.push(XO),this.noTransform&&e.push(ZO),this.onlyIfCached&&e.push(QO),this.private&&e.push(eF),this.proxyRevalidate&&e.push(tF),this.public&&e.push(rF),e.join(", ")}}var aF={CacheControl,parse:function parse(e){return(new CacheControl).parse(e)},format:function format$2(e){return e instanceof CacheControl?e.format():CacheControl.prototype.format.call(e)}};const nF=QS.exports,{parse:iF}=aF;function getHeader(e,t){const r=t.toLowerCase()
1120
- ;return(e.responseHeaders||[]).find((e=>e.name.toLowerCase()===r))}var oF={isCacheable:function isCacheable$2(e){if(!nF.isCacheableAsset(e))return!1;const t=getHeader(e,"cache-control");if(t){try{const e=iF(t.value);if(e.noStore||e.noCache||0===e.maxAge)return!1}catch(e){}return!0}return!!getHeader(e,"expires")||!!getHeader(e,"last-modified")}};const sF=qO,cF=uw,{isCacheable:lF}=oF,{URL:uF}=Gn;function toURL$2(e){let t;try{t="string"==typeof e?new uF(e):e}catch(e){t=new uF("http://_")}return t}function isGoogleAds$2(e){return e=toURL$2(e),/(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.test(e.hostname)}function isAdSenseTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=["/pagead/js/adsbygoogle.js","/pagead/show_ads.js"].includes(e.pathname);return t&&r}function isAdSenseImplTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=/(^\/pagead\/js\/.*\/show_ads_impl.*?\.js)/.test(e.pathname);return t&&r}function isAdSense$1(e){
1121
- return isAdSenseTag(e=toURL$2(e))||isAdSenseImplTag(e)}function isAdSenseAdRequest(e){if(!e)return!1;const t=new uF(e.url);return"/pagead/ads"===t.pathname&&"googleads.g.doubleclick.net"===t.host}function isAdSenseIframe(e){return/(^aswift_\d+)/.test(e.id)}function isGptTag$2(e){const{host:t,pathname:r}=toURL$2(e),a=["www.googletagservices.com","pagead2.googlesyndication.com","securepubads.g.doubleclick.net"].includes(t),n=["/tag/js/gpt.js","/tag/js/gpt_mobile.js"].includes(r);return a&&n}function isAMPTag(e){const{host:t,pathname:r}=toURL$2(e),a=["cdn.ampproject.org"].includes(t),n=["/v0/amp-ad-0.1.js"].includes(r);return a&&n}function isGptImplTag$4(e){return isGoogleAds$2(e)&&/(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.test(toURL$2(e).pathname)}function isAMPImplTag(e){return/^\/[a-z_]*\/\d+\/v0\/amp-ad-network-doubleclick-impl-0.1.js/.test(toURL$2(e).pathname)}function isGpt$3(e){return isGptTag$2(e=toURL$2(e))||isGptImplTag$4(e)}function isGptAdRequest$1(e){
1122
- if(!e)return!1;return"/gampad/ads"===new uF(e.url).pathname&&"XHR"===e.resourceType&&isGoogleAds$2(e.url)}function isAMPAdRequest(e){if(!e)return!1;const t=new uF(e.url);return"/gampad/ads"===t.pathname&&"securepubads.g.doubleclick.net"===t.host&&"Fetch"===e.resourceType}function isGptIframe$1(e){return/(^google_ads_iframe_)/.test(e.id)}function isAdScript$2(e){return isAdSense$1(e)||isGpt$3(e)||function isAMP(e){return isAMPTag(e)||isAMPImplTag(e)}(e)}function getHeaderBidder$2(e){for(const t of sF)for(const r of t.patterns)if(new RegExp(r).test(e))return t.label}function isBidRelatedRequest$1(e){return!!getHeaderBidder$2("string"==typeof e?e:e.url)}var dF={isGoogleAds:isGoogleAds$2,isGptAdRequest:isGptAdRequest$1,isImpressionPing:function isImpressionPing$3(e){const{host:t,pathname:r}=toURL$2(e);return["securepubads.g.doubleclick.net","googleads4.g.doubleclick.net"].includes(t)&&["/pcs/view","/pagead/adview"].includes(r)},isGpt:isGpt$3,isAdSense:isAdSense$1,isAdSenseTag,
1123
- isAdSenseImplTag,isAdSenseAdRequest,isAdSenseIframe,isGptTag:isGptTag$2,isGptImplTag:isGptImplTag$4,isGptIframe:isGptIframe$1,isAdTag:function isAdTag$3(e){return isAdSenseTag(e)||isGptTag$2(e)||isAMPTag(e)},isAdScript:isAdScript$2,isAdRequest:function isAdRequest$5(e){return isAdSenseAdRequest(e)||isGptAdRequest$1(e)||isAMPAdRequest(e)},isAdIframe:function isAdIframe$3(e){return isAdSenseIframe(e)||isGptIframe$1(e)},isImplTag:function isImplTag$3(e){return isAdSenseTag(e)||isGptImplTag$4(e)||isAMPImplTag(e)},containsAnySubstring:function containsAnySubstring$1(e,t){return t.some((t=>e.includes(t)))},hasImpressionPath:function hasImpressionPath(e){return"/pcs/view"===e.pathname||"/pagead/adview"===e.pathname},getHeaderBidder:getHeaderBidder$2,isBidRelatedRequest:isBidRelatedRequest$1,isBidRequest:function isBidRequest$4(e){return isBidRelatedRequest$1(e)&&function isPossibleBidRequest(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&!lF(e)}(e)},
1124
- isStaticRequest:function isStaticRequest$1(e){return["parser","preload","other"].includes(e.initiator.type)},toURL:toURL$2,trimUrl:function trimUrl$1(e){const t=new uF(e),r=t.pathname.length>60?t.pathname.substr(0,60)+"...":t.pathname;return t.origin+r},getNameOrTld:function getNameOrTld$2(e){const t=getHeaderBidder$2(e);if(t)return t;if(isGpt$3(e))return"GPT";if(isAdSense$1(e))return"AdSense";if(isAMPTag(e))return"AMP tag";const r=cF.getEntity(e);if(r)return r.name;const{host:a}=new uF(e),[n=""]=a.match(/([^.]*(\.[a-z]{2,3}){1,2})$/)||[];return n||a},isAMPTag,isAMPAdRequest,isAdRelated:function isAdRelated$3(e){const t="string"==typeof e?e:e.url;if(isAdScript$2(t)||getHeaderBidder$2(t))return!0;const r=cF.getEntity(t);return!!r&&r.categories.includes("ad")}};const mF=Zc,pF=sb,{isBidRelatedRequest:hF,isImpressionPing:gF,isGoogleAds:fF,isGptAdRequest:yF,isGptTag:vF,isGptImplTag:bF,toURL:wF}=dF;function getFrame(e){return e.args.frame||e.args.data&&e.args.data.frame||null}
1125
- function isAdTask(e){return!!function getCpuNodeUrls(e){const t=new Set;for(const{args:r}of e.childEvents)r.data&&r.data.url&&t.add(r.data.url);return Array.from(t)}(e).find((e=>hF(e)||fF(wF(e))))}function addEdge(e,t){e===t||e.endTime>t.startTime||e.addDependent(t)}function addEdges(e){const t=[],r=[];e.traverse((e=>{e.type===mF.TYPES.NETWORK&&(vF(e.record.url)&&"Script"===e.record.resourceType?r.push(e):yF(e.record)&&t.push(e))})),e.traverse((e=>{if(e.type===mF.TYPES.NETWORK){if(bF(e.record.url)){const t=e;for(const e of r)addEdge(e,t)}if(hF(e.record)){const r=e;for(const e of t)addEdge(r,e)}if(gF(e.record.url)){const r=e;for(const e of t){addEdge(e,r);for(const t of e.getDependents())addEdge(t,r)}}}}))}class AdLanternMetric$6 extends pF{static get COEFFICIENTS(){return{intercept:0,optimistic:1,pessimistic:0}}static getPessimisticGraph(e){const t=e.cloneWithRelationships((e=>!0));return addEdges(t),t}static getOptimisticGraph(e){
1126
- const t=e.record.frameId,r=AdLanternMetric$6.getPessimisticGraph(e),a=r.cloneWithRelationships((e=>{if(e.type===mF.TYPES.CPU)return function isLongTask(e){return e.event.dur>5e4}(e)||isAdTask(e)||!!getFrame(e.event)&&getFrame(e.event)!==t;if(e.hasRenderBlockingPriority())return!0;const r=e.record.url;return hF(r)||fF(wF(r))}));return addEdges(r),a}static getEstimateFromSimulation(e,t){throw new Error("getEstimateFromSimulation not implemented by "+this.name)}static findTiming(e,t){let r={startTime:1/0,endTime:-1/0,duration:0};for(const[a,n]of e.entries())t(a,n)&&r.startTime>n.startTime&&(r=n);return r}static findNetworkTiming(e,t){return this.findTiming(e,(e=>e.type===mF.TYPES.NETWORK&&t(e.record)))}}var SF=AdLanternMetric$6;const TF=SF,EF=Dl,xF=Lo,_F=eb,{isAdRequest:AF,isBidRequest:RF,isImplTag:kF,isImpressionPing:DF}=dF,{URL:CF}=Gn;function getPageStartTime$4(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.startTime:t}async function getTimingsByRecord$5(e,t,r){
1127
- const a=new Map,n=await xF.request(t,r);if("simulate"==r.settings.throttlingMethod){const n=await _F.request({trace:e,devtoolsLog:t},r),i=TF.getOptimisticGraph(n),o=await EF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:s}=o.simulate(i,{});for(const[{record:e},t]of s.entries())e&&a.set(e,t)}else{const e=getPageStartTime$4(n);for(const t of n)a.set(t,{startTime:1e3*(t.startTime-e),endTime:1e3*(t.endTime-e),duration:1e3*(t.endTime-t.startTime)})}return a}function getScriptUrl$1(e){if(e.args.data&&["EvaluateScript","FunctionCall"].includes(e.name))return e.args.data.url?e.args.data.url:e.args.data.stackTrace?e.args.data.stackTrace[0].url:void 0}var IF={getTagEndTime:function getTagEndTime$1(e){const t=e.find((e=>kF(new CF(e.url))));return t?t.endTime:-1},getImpressionStartTime:function getImpressionStartTime$1(e){const t=e.find((e=>DF(e.url)));return t?t.startTime:-1},getAdStartTime:function getAdStartTime$2(e){const t=e.find(AF);return t?t.startTime:-1},
1128
- getBidStartTime:function getBidStartTime$1(e){const t=e.find(RF);return t?t.startTime:-1},getPageStartTime:getPageStartTime$4,getPageResponseTime:function getPageResponseTime(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.responseReceivedTime:t},getScriptUrl:getScriptUrl$1,getTimingsByRecord:getTimingsByRecord$5,getScriptEvaluationTimes:async function getScriptEvaluationTimes$1(e,t,r){const a=1e3*getPageStartTime$4(await xF.request(t,r)),n=new Map;for(const t of e.traceEvents){const e=getScriptUrl$1(t);if(!e)continue;const r=t.ts/1e3-a;(!n.has(e)||n.get(e)>r)&&n.set(e,r)}if("simulate"!==r.settings.throttlingMethod)return n;const i=await getTimingsByRecord$5(e,t,r),o=new Map;for(const[e,t]of i.entries()){const i=n.get(e.url);if(!i)continue;if(o.has(e.url))continue;const s=1e3*e.startTime-a,c=t.endTime,l=r.settings.throttling.cpuSlowdownMultiplier*(i-s);o.set(e.url,c+l)}return o}};const NF=SF,LF=Ew,MF=Ao,{getAdStartTime:PF,getPageStartTime:OF}=IF,{isAdRequest:FF}=dF
1129
- ;class LanternAdRequestTime extends NF{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:NF.findNetworkTiming(r,FF).startTime,nodeTimings:r}}}LanternAdRequestTime=MF(LanternAdRequestTime);class AdRequestTime$1 extends LF{static async computeSimulatedMetric(e,t){return LanternAdRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=OF(t),a=1e3*(PF(t)-r);return Promise.resolve({timing:a})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var UF=AdRequestTime$1=MF(AdRequestTime$1);var jF={getAttributableUrl:function getAttributableUrl$3(e,t=new Set){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0],n=r||a;if(n)return n;let i=50,o="";for(const r of e.children){const e=getAttributableUrl$3(r,t);e&&r.duration>i&&(o=e,i=r.duration)}return o}};const BF=SF,$F=Zc,qF=Ew,{getAttributableUrl:zF}=jF,VF=Dl,WF=Rv,GF=Ao,HF=Lo,YF=eb;class LongTasks$2 extends qF{
1130
- static async getSimulationGraph(e,t,r){const a=await YF.request({trace:e,devtoolsLog:t},r);return BF.getOptimisticGraph(a)}static async computeSimulatedResult(e,t,r){const a=await this.getSimulationGraph(e,t,r),n=await VF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:i}=n.simulate(a,{}),o=[];for(const[e,t]of i.entries())e.type!==$F.TYPES.CPU||t.duration<100||o.push({event:e.event,startTime:t.startTime,endTime:t.endTime,duration:t.duration,selfTime:t.duration,attributableURLs:Array.from(e.getEvaluateScriptURLs()),children:[],parent:e.parent,unbounded:e.unbounded,group:e.group});return o}static async computeObservedResult(e,t,r){const a=await WF.request(e,r),n=await HF.request(t,r),i=new Set(n.filter((e=>"Script"===e.resourceType)).map((e=>e.url)));return a.filter((e=>function isLong(e,t){if(e.duration<50)return!1;const r=zF(e,t);if(!r)return!1;if(e.parent)return r!=zF(e.parent,t);return!0}(e,i)))}static async compute_({trace:e,devtoolsLog:t},r){
1131
- return"simulate"==r.settings.throttlingMethod?this.computeSimulatedResult(e,t,r):this.computeObservedResult(e,t,r)}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var KF=LongTasks$2=GF(LongTasks$2),JF=getAugmentedNamespace(Object.freeze({__proto__:null,Audit:kc}));const XF=UF,ZF=oi,QF=KF,{auditNotApplicable:eU}=MO.exports,{Audit:tU}=JF,{getAttributableUrl:rU}=jF,{isAdScript:aU}=dF,{URL:nU}=Gn,iU={title:"No long tasks blocking ad-related network requests",failureTitle:"Avoid long tasks that block ad-related network requests",description:"Tasks blocking the main thread can delay ad requests and cause a poor user experience. Consider removing long blocking tasks or moving them off of the main thread. These tasks can be especially detrimental to performance on less powerful devices. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",
1132
- columnScript:"Attributable URL",columnStartTime:"Start",columnDuration:"Duration"},oU=ZF.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js",iU),sU=[{key:"script",itemType:"url",text:oU(iU.columnScript)},{key:"startTime",itemType:"ms",text:oU(iU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:oU(iU.columnDuration),granularity:1}];class AdBlockingTasks extends tU{static get meta(){return{id:"ad-blocking-tasks",title:oU(iU.title),failureTitle:oU(iU.failureTitle),description:oU(iU.description),requiredArtifacts:["traces","devtoolsLogs"]}}static async audit(e,t){const r="simulate"==t.settings.throttlingMethod?200:100,a={trace:e.traces[tU.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[tU.DEFAULT_PASS],settings:t.settings};let n=[];try{n=await QF.request(a,t)}catch(e){return eU.InvalidTiming}if(!n.length)return eU.NoTasks;const{timing:i}=await XF.request(a,t);if(!(i>0))return eU.NoAdRelatedReq;const o=[];for(const e of n){
1133
- if(e.startTime>i||e.duration<r)continue;const t=rU(e);if(t&&aU(new nU(t)))continue;const a=t&&new nU(t),n=a&&a.origin+a.pathname||"Other";o.push({script:n,rawUrl:t,startTime:e.startTime,endTime:e.endTime,duration:e.duration,isTopLevel:!e.parent})}let s=Array.from(o);s.length>10&&(s=o.filter((e=>"Other"!==e.script&&e.isTopLevel)).sort(((e,t)=>t.duration-e.duration)).splice(0,10).sort(((e,t)=>e.startTime-t.startTime)));const c=s.reduce(((e,t)=>t.isTopLevel?e+t.duration:e),0),l=s.length>0;return{score:l?0:1,numericValue:c,numericUnit:"millisecond",displayValue:l?oU(iU.failureDisplayValue,{timeInMs:c}):"",details:AdBlockingTasks.makeTableDetails(sU,s)}}}$O.exports=AdBlockingTasks,$O.exports.UIStrings=iU;var cU={exports:{}};const lU=oi,uU=Lo,{auditNotApplicable:dU}=MO.exports,{Audit:mU}=JF,{getTimingsByRecord:pU}=IF,{isAdTag:hU}=dF,{URL:gU}=Gn,fU={title:"Minimal render-blocking resources found",failureTitle:"Avoid render-blocking resources",
1134
- description:"Render-blocking resources slow down tag load times. Consider loading critical JS/CSS inline or loading scripts asynchronously or loading the tag earlier in the head. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).",failureDisplayValue:"Up to {timeInMs, number, seconds} s tag load time improvement",columnUrl:"Resource",columnStartTime:"Start",columnDuration:"Duration"},yU=lU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js",fU),vU=[{key:"url",itemType:"url",text:yU(fU.columnUrl)},{key:"startTime",itemType:"ms",text:yU(fU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:yU(fU.columnDuration),granularity:1}];class AdRenderBlockingResources extends mU{static get meta(){return{id:"ad-render-blocking-resources",title:yU(fU.title),failureTitle:yU(fU.failureTitle),scoreDisplayMode:"binary",description:yU(fU.description),
1135
- requiredArtifacts:["LinkElements","ScriptElements","devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[mU.DEFAULT_PASS],a=e.traces[mU.DEFAULT_PASS],n=await uU.request(r,t),i=n.find((e=>hU(new gU(e.url))));if(!i)return dU.NoTag;const o=await pU(a,r,t),s=new Set;for(const t of e.LinkElements)t.href&&"stylesheet"==t.rel&&s.add(t.href);for(const t of e.ScriptElements)!t.src||t.defer||t.async||s.add(t.src);const c=n.filter((e=>e.endTime<i.startTime)).filter((e=>e!=i.initiatorRequest)).filter((e=>e.initiator.type="parser")).filter((e=>s.has(e.url))).map((e=>Object.assign({url:e.url},o.get(e))));c.sort(((e,t)=>e.endTime-t.endTime));const l=o.get(i)||{startTime:1/0},u=c.map((e=>e.startTime)),d=c.map((e=>e.endTime)),m=Math.min(...u),p=Math.min(Math.max(...d),l.startTime)-m;let h="";c.length>0&&p>0&&(h=yU(fU.failureDisplayValue,{timeInMs:p}));return{score:c.length>0&&p>100?0:1,numericValue:c.length,numericUnit:"unitless",displayValue:h,details:{opportunity:p,
1136
- ...AdRenderBlockingResources.makeTableDetails(vU,c)}}}}cU.exports=AdRenderBlockingResources,cU.exports.UIStrings=fU;var bU={exports:{}};var wU={assert:function assert$2(e){if(null==e)throw new Error("Expected not to be null");return e}};const SU=Zc,TU=Lo,{assert:EU}=wU,{getNameOrTld:xU,trimUrl:_U}=dF,{getNetworkInitiators:AU}=eb,{getTimingsByRecord:RU}=IF,{isAdRequest:kU,isAdSense:DU,isGpt:CU,isBidRequest:IU,isAdRelated:NU}=dF;function isXhrCritical(e,t,r){const a=t.xhrEdges.get(e.url);if(!a)return!1;for(const{url:e}of r)if(a.has(e))return!0;return!1}function addInitiatedRequests(e,t,r,a){const n=r.allRecords.filter((e=>null!=e.resourceType)).filter((e=>["Script","XHR"].includes(e.resourceType||"")&&e.endTime<t.startTime)).filter((t=>t.initiatorRequest==e||AU(t).includes(e.url)));for(const e of n){"XHR"==e.resourceType&&isXhrCritical(e,r,a)&&linkGraph(r,e,a)}}function linkGraph(e,t,r=new Set){if(!t||r.has(t))return r;r.add(t);const a=new Set
1137
- ;for(let n=t.initiator.stack;n;n=n.parent)for(const{url:i}of n.callFrames){if(a.has(i))continue;a.add(i);const o=e.requestsByUrl.get(i);if(o&&(linkGraph(e,o,r),"Script"==o.resourceType)){const a=n.callFrames[0].url,i=e.requestsByUrl.get(a);i&&addInitiatedRequests(i,t,e,r)}}return linkGraph(e,t.initiatorRequest||null,r),r}function buildNetworkSummary(e,t){const r=new Map;for(const t of e)r.set(t.url,t);const a=t.filter((e=>e.name.startsWith("XHR"))).filter((e=>!!(e.args.data||{}).url)),n=new Map;for(const e of a){const t=e.args.data||{},r=n.get(t.url)||new Set;for(const{url:e}of t.stackTrace||[])r.add(e);n.set(t.url,r)}return{requestsByUrl:r,xhrEdges:n,allRecords:e}}var LU={getTransitiveClosure:function getTransitiveClosure(e,t){const r=new Set,a=function findTargetRequest(e,t){let r=null;return e.traverse((e=>{e.type!==SU.TYPES.CPU&&t(e.record)&&(r&&r.startTime<e.startTime||(r=e))})),r}(e,t),n=[],i=[];if(null==a)return{requests:n,traceEvents:i};const o=[a];for(;o.length;){
1138
- const e=o.pop();e&&!r.has(e)&&(r.add(e),o.push(...e.getDependencies()))}const s=new Set;for(o.push(...e.getDependents());o.length;){const e=o.pop();if(e&&!s.has(e)){if(s.add(e),r.has(e))for(const e of o)r.add(e);o.push(...e.getDependents())}}for(const e of r)e.type===SU.TYPES.NETWORK?e.endTime<EU(a).startTime&&n.push(e.record):e.type===SU.TYPES.CPU&&e.event.ts<1e6*EU(a).startTime&&i.push(e.event,...e.childEvents);return{requests:n,traceEvents:i}},getCriticalGraph:function getCriticalGraph$1(e,t,r){const a=buildNetworkSummary(e,t),n=new Set;return linkGraph(a,r,n),n},computeAdRequestWaterfall:async function computeAdRequestWaterfall$4(e,t,r){const a=await TU.request(t,r),n=a.find(kU)||a.find(IU)||a.find(NU);if(null==n)return Promise.resolve([]);const i=new Set,o=EU(n),s=a.filter((e=>CU(e.url)||DU(e.url))),c=a.filter((e=>IU(e)&&e.endTime<=o.startTime)),l=buildNetworkSummary(a,e.traceEvents);for(const e of[o,...c,...s])linkGraph(l,e,i)
1139
- ;const u=new Set(["Script","XHR","Fetch","EventStream","Document",void 0]),d=Array.from(i).filter((e=>e.endTime<o.startTime)).filter((e=>u.has(e.resourceType))).filter((e=>"text/css"!=e.mimeType)),m=await RU(e,t,r),p=function computeSummaries(e){e.sort(((e,t)=>e.nameOrTld!=t.nameOrTld?e.nameOrTld<t.nameOrTld?-1:1:e.type!=t.type?e.type<t.type?-1:1:e.startTime!=t.startTime?e.startTime<t.startTime?-1:1:e.endTime-t.endTime));const t=[];for(let n=0;n<e.length;n++){const i=e[n];let o;for(;n<e.length&&(o=e[n+1],o&&(r=o,a=i,!(Math.max(r.startTime,a.startTime)>Math.min(r.endTime,a.endTime)||r.type&&a.type&&r.type!=a.type||"Script"==r.type||r.nameOrTld!=a.nameOrTld)));)i.endTime=Math.max(i.endTime,o.endTime),i.duration=i.endTime-i.startTime,n++;t.push(i)}var r,a;return t.sort(((e,t)=>e.startTime-t.startTime)),t}(d.map((e=>{const{startTime:t,endTime:r}=m.get(e)||e;return{startTime:t,endTime:r,duration:r-t,selfTime:0,url:_U(e.url),nameOrTld:xU(e.url),type:e.resourceType,record:e}})))
1140
- ;return function computeSelfTimes(e){if(!e.length)return[];let t=EU(e[0]);t.selfTime=t.duration;let r=t.startTime;for(const a of e){if(a.endTime<r||a==t)continue;const e=Math.max(r,a.startTime),n=Math.min(t.endTime,a.endTime);e<n&&(t.selfTime-=n-e),r=Math.max(r,n),a.endTime>t.endTime&&(a.selfTime=a.endTime-e,t=a)}}(p),p}};const MU=oi,{auditNotApplicable:PU}=MO.exports,{Audit:OU}=JF,{computeAdRequestWaterfall:FU}=LU,UU={title:"Ad request waterfall",failureTitle:"Reduce critical path for ad loading",description:"Consider reducing the number of resources, loading multiple resources simultaneously, or loading resources earlier to improve ad speed. Requests that block ad loading can be found below. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path).",displayValue:"{serialResources, plural, =1 {1 serial resource} other {# serial resources}}",columnUrl:"Request",columnType:"Type",columnStartTime:"Start",columnEndTime:"End"
1141
- },jU=MU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js",UU),BU=[{key:"nameOrTld",itemType:"text",text:jU(UU.columnType)},{key:"url",itemType:"url",text:jU(UU.columnUrl)},{key:"startTime",itemType:"ms",text:jU(UU.columnStartTime),granularity:1},{key:"endTime",itemType:"ms",text:jU(UU.columnEndTime),granularity:1}];class AdRequestCriticalPath extends OU{static get meta(){return{id:"ad-request-critical-path",title:jU(UU.title),failureTitle:jU(UU.failureTitle),description:jU(UU.description),scoreDisplayMode:"informative",requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[OU.DEFAULT_PASS],a=e.devtoolsLogs[OU.DEFAULT_PASS],n=(await FU(r,a,t)).filter((e=>e.startTime>0&&e.startTime<e.endTime));if(!n.length)return PU.NoAds;const i=function computeDepth(e){let t=0,r=0;for(const{startTime:a,endTime:n}of e)a>=t?(++r,t=n):t=Math.min(t,n);return r}(n),o=i>3;for(const e of n)delete e.record
1142
- ;const s=function computeIdleTimes(e){let t=1/0;const r=[];for(let a=0;a<e.length;){const{startTime:n,endTime:i}=e[a];for(n-t>150&&r.push(n-t),t=i;++a<e.length&&e[a].startTime<t;)t=Math.max(t,e[a].endTime)}return r}(n),c=Math.max(...s),l=s.reduce(((e,t)=>e+t),0);return{numericValue:i,numericUnit:"unitless",score:o?0:1,displayValue:jU(UU.displayValue,{serialResources:i}),details:{size:n.length,depth:i,maxIdleTime:c,totalIdleTime:l,...AdRequestCriticalPath.makeTableDetails(BU,n)}}}}bU.exports=AdRequestCriticalPath,bU.exports.UIStrings=UU;var $U={exports:{}};const qU=SF,zU=Ew,VU=Ao,{getAdStartTime:WU,getBidStartTime:GU,getPageStartTime:HU}=IF,{isAdRequest:YU,isBidRequest:KU}=dF;class LanternBidRequestTime extends qU{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e,a=qU.findNetworkTiming(r,KU).startTime;return a>qU.findNetworkTiming(r,YU).startTime?{timeInMs:-1,nodeTimings:r}:{timeInMs:a,nodeTimings:r}}}LanternBidRequestTime=VU(LanternBidRequestTime)
1143
- ;class BidRequestTime extends zU{static async computeSimulatedMetric(e,t){return LanternBidRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=HU(t),a=GU(t);if(WU(t)<a)return{timing:-1};return{timing:1e3*(a-r)}}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const JU=BidRequestTime=VU(BidRequestTime),XU=oi,{auditNotApplicable:ZU}=MO.exports,{Audit:QU}=JF,ej={title:"First bid request time",failureTitle:"Reduce time to send the first bid request",description:"This metric measures the elapsed time from the start of page load until the first bid request is made. Delayed bid requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bid-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"
1144
- },tj=XU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js",ej);$U.exports=class BidRequestFromPageStart extends QU{static get meta(){return{id:"bid-request-from-page-start",title:tj(ej.title),failureTitle:tj(ej.failureTitle),description:tj(ej.description),scoreDisplayMode:QU.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[QU.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[QU.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await JU.request(r,t);return n>0?{numericValue:n,numericUnit:"millisecond",score:QU.computeLogNormalScore(a,n),displayValue:tj(ej.displayValue,{timeInMs:n})}:ZU.NoBids}},$U.exports.UIStrings=ej;var rj={exports:{}}
1145
- ;const aj=UF,nj=oi,{auditNotApplicable:ij,runWarning:oj}=MO.exports,{Audit:sj}=JF,cj={title:"First ad request time",failureTitle:"Reduce time to send the first ad request",description:"This metric measures the elapsed time from the start of page load until the first ad request is made. Delayed ad requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"},lj=nj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js",cj);rj.exports=class AdRequestFromPageStart extends sj{static get meta(){return{id:"ad-request-from-page-start",title:lj(cj.title),failureTitle:lj(cj.failureTitle),description:lj(cj.description),scoreDisplayMode:sj.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{
1146
- p10:6500,median:1e4},provided:{p10:1900,median:3500}}}static async audit(e,t){const r={trace:e.traces[sj.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[sj.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await aj.request(r,t);if(!(n>0)){const e=ij.NoAds;return e.runWarnings=[oj.NoAds],e}return{numericValue:n,numericUnit:"millisecond",score:sj.computeLogNormalScore(a,n),displayValue:lj(cj.displayValue,{timeInMs:n})}}},rj.exports.UIStrings=cj;var uj={exports:{}};const dj=oi,{auditNotApplicable:mj}=MO.exports,{Audit:pj}=JF,{isAdIframe:hj}=dF,gj={title:"No ad found at the very top of the viewport",failureTitle:"Move the top ad further down the page",
1147
- description:"Over 10% of ads are never viewed because users scroll past them before they become viewable. By moving ad slots away from the very top of the viewport, users are more likely to see ads before scrolling away. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport).",failureDisplayValue:"A scroll of {valueInPx, number} px would hide half of your topmost ad",columnSlot:"Top Slot ID"},fj=dj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js",gj),yj=[{key:"slot",itemType:"text",text:fj(gj.columnSlot)}];class AdTopOfViewport extends pj{static get meta(){return{id:"ad-top-of-viewport",title:fj(gj.title),failureTitle:fj(gj.failureTitle),description:fj(gj.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter(hj).filter((e=>e.clientRect.width*e.clientRect.height>1&&!e.isPositionFixed)).map((e=>({
1148
- midpoint:e.clientRect.top+e.clientRect.height/2,id:e.id})));if(!r.length)return mj.NoVisibleSlots;const a=r.reduce(((e,t)=>e.midpoint<t.midpoint?e:t)),n=a.midpoint<t.innerHeight;if(!n)return mj.NoAdsViewport;const i=n&&a.midpoint<100?0:1;return{score:i,numericValue:a.midpoint,numericUnit:"unitless",displayValue:i?"":fj(gj.failureDisplayValue,{valueInPx:a.midpoint}),details:AdTopOfViewport.makeTableDetails(yj,i?[]:[{slot:a.id}])}}}uj.exports=AdTopOfViewport,uj.exports.UIStrings=gj;var vj={exports:{}};function isBoxInViewport$1(e,t){const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return n<o&&i<s&&n<r&&i<a&&0<o&&0<s}var bj={boxViewableArea:function boxViewableArea(e,t){if(!isBoxInViewport$1(e,t))return 0;const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return(Math.min(o,r)-Math.max(n,0))*(Math.min(s,a)-Math.max(i,0))},isBoxInViewport:isBoxInViewport$1,overlaps:function overlaps$1(e,t){
1149
- const r=!(e.right<t.left||t.right<e.left),a=!(e.bottom<t.top||t.bottom<e.top);return r&&a},toClientRect:function toClientRect$1([e,t,r,a]){return{left:e,top:t,width:r,height:a,right:e+r,bottom:t+a}}};const{auditNotApplicable:wj}=MO.exports,{Audit:Sj}=JF,Tj=oi,{isBoxInViewport:Ej}=bj,{isGptIframe:xj}=dF,_j={title:"Few or no ads loaded outside viewport",failureTitle:"Avoid loading ads until they are nearly on-screen",description:"Too many ads loaded outside the viewport lowers viewability rates and impacts user experience. Consider loading ads below the fold lazily as the user scrolls down. Consider using GPT's [Lazy Loading API](https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad). [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport).",failureDisplayValue:"{hiddenAds, plural, =1 {1 ad} other {# ads}} out of view",columnSlot:"Slots Outside Viewport"
1150
- },Aj=Tj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js",_j),Rj=[{key:"slot",itemType:"text",text:Aj(_j.columnSlot)}];class AdsInViewport extends Sj{static get meta(){return{id:"ads-in-viewport",title:Aj(_j.title),failureTitle:Aj(_j.failureTitle),description:Aj(_j.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>xj(e)&&e.clientRect.height*e.clientRect.width>1));if(!r.length)return wj.NoVisibleSlots;const a=r.filter((e=>!Ej(e.clientRect,t))).map((e=>({slot:e.id}))).sort(((e,t)=>e.slot.localeCompare(t.slot)));return{numericValue:(r.length-a.length)/r.length,numericUnit:"unitless",score:a.length>3?0:1,displayValue:a.length?Aj(_j.failureDisplayValue,{hiddenAds:a.length}):"",details:AdsInViewport.makeTableDetails(Rj,a)}}}vj.exports=AdsInViewport,vj.exports.UIStrings=_j;var kj={exports:{}};var Dj={count:function count(e,t){let r=0
1151
- ;for(const a of e)t(a)&&r++;return r},bucket:function bucket$1(e,t){const r=new Map;for(const a of e){const e=t(a);if(null!=e){const t=r.get(e)||[];t.push(a),r.set(e,t)}}return r},flatten:function flatten(e){const t=[];for(const r of e)t.push(...r);return t}};const Cj=Dj,Ij=oi,Nj=HT,Lj=Lo,{auditNotApplicable:Mj}=MO.exports,{Audit:Pj}=JF,{isAdTag:Oj,isStaticRequest:Fj}=dF,{URL:Uj}=Gn,jj={title:"Ad tag is loaded asynchronously",failureTitle:"Load ad tag asynchronously",description:"Loading the ad tag synchronously blocks content rendering until the tag is fetched and loaded. Consider using the `async` attribute to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags)."},Bj=Ij.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js",jj);function isAsync(e){return"Low"==e.priority||Fj(e)}kj.exports=class AsyncAdTags extends Pj{static get meta(){return{
1152
- id:"async-ad-tags",title:Bj(jj.title),failureTitle:Bj(jj.failureTitle),description:Bj(jj.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[Pj.DEFAULT_PASS],a=await Lj.request(r,t),n=await Nj.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>Oj(new Uj(e.url)))).filter((e=>e.frameId===n.frameId));if(!i.length)return Mj.NoTag;const o=Cj.count(i,isAsync)-i.length;return{score:Number(0===o),numericValue:o,numericUnit:"unitless"}}},kj.exports.UIStrings=jj;var $j={exports:{}};const qj=on.default,zj=Ao,Vj=Yp,Wj=Xp;qj.warn("trace-of-tab","trace-of-tab is deprecated, use processed-trace / processed-navigation instead");var Gj=zj(class TraceOfTab$1{static async compute_(e,t){const r=await Vj.request(e,t),a=await Wj.request(r,t);return{...r,...a}}},null);const Hj=oi,Yj=Lo,Kj=Gj,{auditNotApplicable:Jj}=MO.exports,{Audit:Xj}=JF,{computeAdRequestWaterfall:Zj}=LU,{getTimingsByRecord:Qj}=IF,eB={title:"Ads not blocked by load events",
1153
- failureTitle:"Avoid waiting on load events",description:"Waiting on load events increases ad latency. To speed up ads, eliminate the following load event handlers. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/blocking-load-events).",displayValue:"{timeInMs, number, seconds} s blocked",columnEvent:"Event Name",columnTime:"Event Time",columnScript:"Script",columnBlockedUrl:"Blocked URL",columnFunctionName:"Function"},tB=Hj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js",eB),rB=[{key:"eventName",itemType:"text",text:tB(eB.columnEvent)},{key:"time",itemType:"ms",text:tB(eB.columnTime),granularity:1},{key:"url",itemType:"url",text:tB(eB.columnScript)},{key:"functionName",itemType:"text",text:tB(eB.columnFunctionName)}];function findOriginalCallFrame(e){const{record:t}=e;let r=t&&t.initiator&&t.initiator.stack;if(r){for(;r.parent;)r=r.parent;return r.callFrames[r.callFrames.length-1]}}
1154
- function findTraceEventOfCallFrame(e,t){return t.find((t=>"FunctionCall"==t.name&&t.args.data&&t.args.data.functionName==e.functionName&&t.args.data.scriptId==e.scriptId&&t.args.data.url==e.url&&Math.abs(t.args.data.lineNumber==e.lineNumber)<2&&Math.abs(t.args.data.columnNumber==e.columnNumber)<2))}function findEventIntervals(e,t){let r={};const a=[];for(const n of t)n.name==`${e}EventStart`?r={start:n.ts,end:1/0,eventName:e}:n.name==`${e}EventEnd`&&(r.end=n.ts,a.push(r));return a}function quantifyBlockedTime(e,t,r){const a=t.find((t=>t.url==e.url)),n=t.find((t=>t.url==e.blockedUrl));if(!a||!n)return 0;const i=r.get(a),o=r.get(n);return i&&o?o.startTime-i.endTime:0}class BlockingLoadEvents extends Xj{static get meta(){return{id:"blocking-load-events",title:tB(eB.title),failureTitle:tB(eB.failureTitle),description:tB(eB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
1155
- const r=e.traces[Xj.DEFAULT_PASS],a=e.devtoolsLogs[Xj.DEFAULT_PASS],n=await Yj.request(a,t),{timings:i,processEvents:o}=await Kj.request(r,t),s=await Qj(r,a,t),c=(await Zj(r,a,t)).sort(((e,t)=>e.startTime-t.startTime));if(!c.length)return Jj.NoAdRelatedReq;const l=[...findEventIntervals("domContentLoaded",o),...findEventIntervals("load",o)],u=[],d=new Set;for(const e of c){const t=findOriginalCallFrame(e);if(!t)continue;const r=JSON.stringify(t);if(d.has(r))continue;d.add(r);const a=findTraceEventOfCallFrame(t,o);if(!a)continue;const c=l.find((e=>e.start<=a.ts&&a.ts<=e.end));if(c){const r=Object.assign({eventName:c.eventName,blockedUrl:e.url,time:i[c.eventName],blockedTime:1/0},t);r.blockedTime=quantifyBlockedTime(r,n,s),u.push(r)}}const m=u.length>0;let p=0;return m&&(p=Math.min(...u.map((e=>e.blockedTime)))),{numericValue:u.length,numericUnit:"unitless",score:m?0:1,displayValue:m&&p?tB(eB.displayValue,{timeInMs:p}):"",details:BlockingLoadEvents.makeTableDetails(rB,u)}}}
1156
- $j.exports=BlockingLoadEvents,$j.exports.UIStrings=eB;var aB={exports:{}};const nB=oi,{auditNotApplicable:iB}=MO.exports,{Audit:oB}=JF,{computeAdRequestWaterfall:sB}=LU,{isAdScript:cB,toURL:lB}=dF,uB={title:"No bottleneck requests found",failureTitle:"Avoid bottleneck requests",description:"Speed up, load earlier, parallelize, or eliminate the following requests and their dependencies in order to speed up ad loading. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bottleneck-requests).",displayValue:"{blockedTime, number, seconds} s spent blocked on requests",columnUrl:"Blocking Request",columnInitiatorUrl:"Initiator Request",columnStartTime:"Start",columnSelfTime:"Exclusive Time",columnDuration:"Total Time"},dB=nB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js",uB),mB=[{key:"url",itemType:"url",text:dB(uB.columnUrl)},{key:"selfTime",itemType:"ms",text:dB(uB.columnSelfTime),granularity:1},{
1157
- key:"duration",itemType:"ms",text:dB(uB.columnDuration),granularity:1}];class BottleneckRequests extends oB{static get meta(){return{id:"bottleneck-requests",title:dB(uB.title),failureTitle:dB(uB.failureTitle),description:dB(uB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[oB.DEFAULT_PASS],a=e.devtoolsLogs[oB.DEFAULT_PASS],n=(await sB(r,a,t)).filter((e=>e.startTime>0));if(!n.length)return iB.NoAdRelatedReq;const cost=e=>3*e.selfTime+e.duration,i=n.filter((e=>!cB(lB(e.url))&&(e.selfTime>250||e.duration>1e3))).sort(((e,t)=>cost(t)-cost(e))).slice(0,5),o=i.reduce(((e,t)=>e+t.selfTime),0)/1e3,s=1e3*o>1e3;for(const e of i)delete e.record;return{numericValue:i.length,numericUnit:"unitless",score:s?0:1,displayValue:s?dB(uB.displayValue,{blockedTime:o}):"",details:BottleneckRequests.makeTableDetails(mB,i)}}}aB.exports=BottleneckRequests,aB.exports.UIStrings=uB;var pB={exports:{}}
1158
- ;const hB=oi,gB=HT,fB=Lo,yB=Ki,{auditNotApplicable:vB}=MO.exports,{Audit:bB}=JF,{containsAnySubstring:wB}=dF,{URL:SB}=Gn,TB={title:"No duplicate tags found",failureTitle:"Load tags only once",description:"Loading a tag more than once in the same page is redundant and adds overhead without benefit. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags).",failureDisplayValue:"{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}",columnScript:"Script",columnNumReqs:"Duplicate Requests",columnFrameId:"Frame ID"},EB=hB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js",TB),xB=["googletagservices.com/tag/js/gpt.js","securepubads.g.doubleclick.net/tag/js/gpt.js","pagead2.googlesyndication.com/pagead/js/adsbygoogle.js","pagead2.googlesyndication.com/pagead/js/show_ads.js","cdn.ampproject.org/v0/amp-ad-0.1.js"],_B=[{key:"script",itemType:"url",text:EB(TB.columnScript)},{key:"numReqs",
1159
- itemType:"text",text:EB(TB.columnNumReqs)}];class DuplicateTags extends bB{static get meta(){return{id:"duplicate-tags",title:EB(TB.title),failureTitle:EB(TB.failureTitle),description:EB(TB.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[bB.DEFAULT_PASS],a=await fB.request(r,t),n=await gB.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>e.frameId===n.frameId)).filter((e=>wB(e.url,xB))).filter((e=>e.resourceType===yB.TYPES.Script));if(!i.length)return vB.NoTags;const o=new Map;for(const e of i){const t=new SB(e.url).pathname,r=o.get(t)||0;o.set(t,r+1)}const s=[];for(const[e,t]of o)t>1&&s.push({script:e,numReqs:t});return{numericValue:s.length,numericUnit:"unitless",score:s.length?0:1,details:DuplicateTags.makeTableDetails(_B,s),displayValue:s.length?EB(TB.failureDisplayValue,{duplicateTags:s.length}):""}}}pB.exports=DuplicateTags,pB.exports.UIStrings=TB;var AB={exports:{}}
1160
- ;const RB=SF,kB=Ew,DB=Ao,{getPageStartTime:CB,getImpressionStartTime:IB}=IF,{isImpressionPing:NB}=dF;class LanternAdRenderTime extends RB{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:RB.findNetworkTiming(r,(e=>!!e.url&&NB(new URL(e.url)))).startTime,nodeTimings:r}}}LanternAdRenderTime=DB(LanternAdRenderTime);class AdRenderTime extends kB{static async computeSimulatedMetric(e,t){return LanternAdRenderTime.request(e,t)}static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=CB(r),n=1e3*(IB(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const LB=AdRenderTime=DB(AdRenderTime),MB=oi,{auditNotApplicable:PB,runWarning:OB}=MO.exports,{Audit:FB}=JF,UB={title:"Latency of first ad render",failureTitle:"Reduce time to render first ad",
1161
- description:"This metric measures the time for the first ad iframe to render from page navigation. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/first-ad-render).",displayValue:"{timeInMs, number, seconds} s"},jB=MB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js",UB);AB.exports=class FirstAdRender extends FB{static get meta(){return{id:"first-ad-render",title:jB(UB.title),failureTitle:jB(UB.failureTitle),description:jB(UB.description),scoreDisplayMode:FB.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:12900,median:22e3},provided:{p10:2750,median:3700}}}static async audit(e,t){const r=e.traces[FB.DEFAULT_PASS],a={devtoolsLog:e.devtoolsLogs[FB.DEFAULT_PASS],trace:r,settings:t.settings},{timing:n}=await LB.request(a,t);if(!(n>0)){const e=PB.NoAdRendered;return e.runWarnings=[OB.NoAdRendered],e}
1162
- const i=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"];return{numericValue:n,numericUnit:"millisecond",score:FB.computeLogNormalScore(i,n),displayValue:jB(UB.displayValue,{timeInMs:n})}}},AB.exports.UIStrings=UB;var BB={exports:{}};const $B=oi,qB=Lo,{auditNotApplicable:zB}=MO.exports,{Audit:VB}=JF,{isAdRequest:WB}=dF,{URL:GB}=Gn,HB={title:"Ad slots effectively use horizontal space",failureTitle:"Increase the width of ad slots",description:"Ad slots that utilize most of the page width generally experience increased click-through rate over smaller ad sizes. We recommend leaving no more than 25% of the viewport width unutilized on mobile devices.",failureDisplayValue:"{percentUnused, number, percent} of viewport width is underutilized"},YB=$B.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js",HB);BB.exports=class FullWidthSlots extends VB{static get meta(){return{id:"full-width-slots",title:YB(HB.title),
1163
- failureTitle:YB(HB.failureTitle),description:YB(HB.description),requiredArtifacts:["ViewportDimensions","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[VB.DEFAULT_PASS],a=await qB.request(r,t),n=e.ViewportDimensions.innerWidth,i=a.filter(WB).map((e=>new GB(e.url)));if(!i.length)return zB.NoAds;const o=i.map((e=>e.searchParams.get("prev_iu_szs")||e.searchParams.get("sz"))).join("|").split(/[|,]/).map((e=>parseInt(e.split("x")[0]))).filter((e=>e<=n&&e>1));if(!o.length)return zB.NoValidAdWidths;const s=1-Math.max(...o)/n,c=s>.25?0:1;return{score:c,numericValue:s,numericUnit:"unitless",displayValue:c?"":YB(HB.failureDisplayValue,{percentUnused:s})}}},BB.exports.UIStrings=HB;var KB={exports:{}};const JB=Lo,{assert:XB}=wU,{auditNotApplicable:ZB}=MO.exports,{Audit:QB}=JF,{getCriticalGraph:e$}=LU,{getTimingsByRecord:t$}=IF,{isGptImplTag:r$,isBidRequest:a$,getHeaderBidder:n$}=dF,i$={title:"GPT and bids loaded in parallel",failureTitle:"Load GPT and bids in parallel",
1164
- description:"To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-bids-parallel).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},o$=[{key:"bidder",itemType:"text",text:i$.columnBidder},{key:"url",itemType:"url",text:i$.columnUrl},{key:"startTime",itemType:"ms",text:i$.columnStartTime},{key:"duration",itemType:"ms",text:i$.columnDuration}];class GptBidsInParallel extends QB{static get meta(){return{id:"gpt-bids-parallel",title:i$.title,failureTitle:i$.failureTitle,description:i$.description,requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[QB.DEFAULT_PASS],a=e.traces[QB.DEFAULT_PASS],n=await JB.request(r,t),i=n.find((e=>r$(e.url)));if(!i)return ZB.NoGpt
1165
- ;const o=n.filter(a$).filter((e=>e.frameId==i.frameId));if(!o.length)return ZB.NoBids;const s=await t$(a,r,t),c=[],l=new Set;for(const e of o)if(e$(n,a.traceEvents,e).has(i)){const{startTime:t,endTime:r}=s.get(e)||e,a=XB(n$(e.url));if(l.has(a))continue;l.add(a),c.push({bidder:a,url:e.url,startTime:t,duration:r-t})}const u=c.length>0;return{numericValue:c.length,numericUnit:"unitless",score:u?0:1,details:u?GptBidsInParallel.makeTableDetails(o$,c):void 0}}}KB.exports=GptBidsInParallel,KB.exports.UIStrings=i$;var s$={exports:{}};const c$=oi,l$=Lo,{auditNotApplicable:u$}=MO.exports,{Audit:d$}=JF,{isGptTag:m$}=dF,{URL:p$}=Gn,h$={title:"GPT tag is loaded from an official source",failureTitle:"Load GPT from an official source",description:"Load GPT from 'securepubads.g.doubleclick.net' for standard integrations or from 'pagead2.googlesyndication.com' for limited ads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-official-source)."
1166
- },g$=c$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source.js",h$);s$.exports=class LoadsGptFromOfficalSource extends d${static get meta(){return{id:"loads-gpt-from-official-source",title:g$(h$.title),failureTitle:g$(h$.failureTitle),description:g$(h$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[d$.DEFAULT_PASS],a=(await l$.request(r,t)).map((e=>new p$(e.url))).find(m$);if(!a)return u$.NoGpt;const n=["securepubads.g.doubleclick.net","pagead2.googlesyndication.com"].includes(a.host);return{score:Number(n),numericValue:Number(!n),numericUnit:"unitless"}}},s$.exports.UIStrings=h$;var f$={exports:{}};const y$=oi,v$=Lo,{auditNotApplicable:b$}=MO.exports,{Audit:w$}=JF,{isAdTag:S$}=dF,{URL:T$}=Gn,E$={title:"Ad tag is loaded over HTTPS",failureTitle:"Load ad tag over HTTPS",
1167
- description:'For privacy and security, always load GPT/AdSense over HTTPS. Insecure pages should explicitly request the ad script securely. GPT Example: `<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js">` AdSense Example: `<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">`. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https).'},x$=y$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js",E$);f$.exports=class LoadsAdTagOverHttps extends w${static get meta(){return{id:"loads-ad-tag-over-https",title:x$(E$.title),failureTitle:x$(E$.failureTitle),description:x$(E$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[w$.DEFAULT_PASS],a=await v$.request(r,t);if(!a.find((e=>200==e.statusCode)))return b$.NoRecords;const n=a.filter((e=>S$(new T$(e.url)))),i=n.filter((e=>e.isSecure)),o={
1168
- type:"debugdata",numAdTagHttpReqs:n.length-i.length,numAdTagHttpsReqs:i.length};if(!n.length){const e=b$.NoTag;return e.details=o,e}return{numericValue:o.numAdTagHttpReqs,score:o.numAdTagHttpReqs?0:1,details:o}}},f$.exports.UIStrings=E$;var _$={exports:{}};const A$=Dj,R$=oi,k$=eb,{auditNotApplicable:D$}=MO.exports,{Audit:C$}=JF,{computeAdRequestWaterfall:I$}=LU,{getScriptEvaluationTimes:N$}=IF,L$={title:"Ad scripts are loaded statically",failureTitle:"Load ad scripts statically",description:"Load the following scripts directly with `<script async src=...>` instead of injecting scripts with JavaScript. Doing so allows the browser to preload scripts sooner. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags).",failureDisplayValue:"Load {tags, plural, =1 {1 script} other {# scripts}} statically",columnUrl:"Script",columnLoadTime:"Load Time"
1169
- },M$=R$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js",L$),P$=[{key:"url",itemType:"url",text:M$(L$.columnUrl)},{key:"loadTime",itemType:"ms",granularity:1,text:M$(L$.columnLoadTime)}],O$=[/amazon-adsystem\.com\/aax2\/apstag.js/,/js-sec\.indexww\.com\/ht\/p\/.*\.js/,/pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,/static\.criteo\.net\/js\/.*\/publishertag\.js/,/www\.googletagservices\.com\/tag\/js\/gpt\.js/,/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/,/cdn\.ampproject\.org\/v0\/amp-ad-\d+\.\d+\.js/];function initiatedByInlineScript(e){if("script"!==e.initiator.type)return!1;const t=k$.getNetworkInitiators(e);return 1===t.length&&t[0]===e.documentURL}class StaticAdTags extends C${static get meta(){return{id:"script-injected-tags",title:M$(L$.title),failureTitle:M$(L$.failureTitle),description:M$(L$.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
1170
- const r=await async function findStaticallyLoadableTags(e,t){const r=e.devtoolsLogs[C$.DEFAULT_PASS],a=e.traces[C$.DEFAULT_PASS],n=[],i=await I$(a,r,t);for(const{record:e}of i)e&&"Script"===e.resourceType&&(initiatedByInlineScript(e)||O$.find((t=>e.url.match(t))))&&n.push(e);return n}(e,t);if(!r.length)return D$.NoTag;const a=new Set,n=[],i=e.devtoolsLogs[C$.DEFAULT_PASS],o=e.traces[C$.DEFAULT_PASS],s=await N$(o,i,t);for(const e of r){if(a.has(e.url))continue;a.add(e.url);const t=r.filter((t=>t.url===e.url));if(0===A$.count(t,(e=>"parser"===e.initiator.type&&!e.isLinkPreload))){const t=s.get(e.url)||0;if(t<400)continue;n.push({url:e.url,loadTime:t})}}n.sort(((e,t)=>e.loadTime-t.loadTime));const c=n.length>0;return{displayValue:c?M$(L$.failureDisplayValue,{tags:n.length}):"",score:Number(!c),numericValue:n.length,numericUnit:"unitless",details:StaticAdTags.makeTableDetails(P$,n)}}}_$.exports=StaticAdTags,_$.exports.UIStrings=L$;var F$={exports:{}}
1171
- ;const U$=UF,j$=oi,B$=HT,$$=Lo,{auditNotApplicable:q$}=MO.exports,{Audit:z$}=JF,{bucket:V$}=Dj,{getTimingsByRecord:W$}=IF,{isCacheable:G$}=oF,{isGoogleAds:H$,getHeaderBidder:Y$}=dF,{URL:K$}=Gn,J$={title:"Header bidding is parallelized",failureTitle:"Parallelize bid requests",description:"Send header bidding requests simultaneously, rather than serially, to retrieve bids more quickly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},X$=j$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js",J$),Z$=[{key:"bidder",itemType:"text",text:X$(J$.columnBidder)},{key:"url",itemType:"url",text:X$(J$.columnUrl)},{key:"startTime",itemType:"ms",text:X$(J$.columnStartTime)},{key:"duration",itemType:"ms",text:X$(J$.columnDuration)}],Q$="ad",tq="bid",rq="unknown";function checkRecordType(e){
1172
- return H$(new K$(e.url))?Q$:Y$(e.url)?tq:rq}function isPossibleBid(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&e.endTime-e.startTime>=.05&&!G$(e)}function clearQueryString(e){const t=new K$(e);return t.search="",t.toString()}class SerialHeaderBidding extends z${static get meta(){return{id:"serial-header-bidding",title:X$(J$.title),failureTitle:X$(J$.failureTitle),description:X$(J$.description),requiredArtifacts:["devtoolsLogs","traces","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[z$.DEFAULT_PASS],a=e.traces[z$.DEFAULT_PASS],n=await $$.request(r,t);if(!n.length)return q$.NoRecords;const i=await B$.request({URL:e.URL,devtoolsLog:r},t),o=n.filter(isPossibleBid).filter((e=>e.frameId==i.frameId)),s=V$(o,checkRecordType);if(!s.has(tq))return q$.NoBids;const c={trace:a,devtoolsLog:r,settings:t.settings},{timing:l}=await U$.request(c,t),u=await W$(a,r,t),d=function constructRecords(e,t,r){const a=[];for(const n of e){const e=r.get(n)
1173
- ;e&&a.push(Object.assign({},e,{url:n.url,type:t}))}return a}(s.get(tq)||[],tq,u);let m,p=[];for(const e of d)l>0&&e.endTime>l||(e.bidder=Y$(e.url),e.url=clearQueryString(e.url),m&&e.startTime>=m.endTime&&(p.push(m),p.push(e)),(!m||e.endTime<m.endTime||e.startTime>=m.endTime)&&(m=e));p=Array.from(new Set(p));const h=p.length>1;return{numericValue:Number(h),numericUnit:"unitless",score:h?0:1,details:h?SerialHeaderBidding.makeTableDetails(Z$,p):void 0}}}F$.exports=SerialHeaderBidding,F$.exports.UIStrings=J$;var aq={exports:{}};const nq=SF,iq=Ew,oq=Ao,{getPageStartTime:sq,getTagEndTime:cq}=IF,{isImplTag:lq}=dF,{URL:uq}=Gn;class LanternTagLoadTime extends nq{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:nq.findNetworkTiming(r,(e=>!!e.url&&lq(new uq(e.url)))).endTime,nodeTimings:r}}}LanternTagLoadTime=oq(LanternTagLoadTime);class TagLoadTime$1 extends iq{static async computeSimulatedMetric(e,t){return LanternTagLoadTime.request(e,t)}
1174
- static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=sq(r),n=1e3*(cq(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const dq=TagLoadTime$1=oq(TagLoadTime$1),mq=oi,{auditNotApplicable:pq,runWarning:hq}=MO.exports,{Audit:gq}=JF,fq={title:"Tag load time",failureTitle:"Reduce tag load time",description:"This metric measures the time for the ad tag's implementation script (pubads_impl.js for GPT; adsbygoogle.js for AdSense) to load after the page loads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/tag-load-time).",displayValue:"{timeInMs, number, seconds} s"},yq=mq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js",fq);aq.exports=class TagLoadTime extends gq{static get meta(){return{id:"tag-load-time",title:yq(fq.title),failureTitle:yq(fq.failureTitle),description:yq(fq.description),
1175
- scoreDisplayMode:gq.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[gq.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[gq.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await dq.request(r,t);if(!(n>0)){const e=pq.NoTag;return e.runWarnings=[hq.NoTag],e}return{numericValue:n,numericUnit:"millisecond",score:gq.computeLogNormalScore(a,n),displayValue:yq(fq.displayValue,{timeInMs:n})}}},aq.exports.UIStrings=fq;var vq={exports:{}};const bq=oi,{auditNotApplicable:wq,auditError:Sq}=MO.exports,{Audit:Tq}=JF,{isAdIframe:Eq}=dF,xq={title:"Ads to page-height ratio is within recommended range",failureTitle:"Reduce ads to page-height ratio",
1176
- description:"The ads to page-height ratio can impact user experience and ultimately user retention. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density).",displayValue:"{adDensity, number, percent} ads to page-height ratio"},_q=bq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js",xq);vq.exports=class ViewportAdDensity extends Tq{static get meta(){return{id:"viewport-ad-density",title:_q(xq.title),failureTitle:_q(xq.failureTitle),description:_q(xq.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>Eq(e)&&e.clientRect.width*e.clientRect.height>1));if(!r.length)return wq.NoVisibleSlots;if(t.innerHeight<=0)throw new Error(Sq.ViewportAreaZero);const a=function computeAdLength(e,t){
1177
- const r=new Set([...e.map((e=>e.clientRect.left)),...e.map((e=>e.clientRect.right))].map((e=>Math.min(Math.max(1,e),t.innerWidth-1))));e=e.sort(((e,t)=>e.clientRect.top!==t.clientRect.top?e.clientRect.top-t.clientRect.top:e.clientRect.bottom-t.clientRect.bottom));let a=0;for(const t of r){let r=0,n=0;for(const a of e){if(t<a.clientRect.left||t>a.clientRect.right)continue;if(a.isPositionFixed){r+=a.clientRect.height;continue}const e=a.clientRect.bottom-Math.max(n,a.clientRect.top);e>0&&(r+=e),n=Math.max(n,a.clientRect.bottom)}a=Math.max(a,r)}return a}(r,t),n=Math.max(...r.map((e=>e.clientRect.top+e.clientRect.height/2)))+t.innerHeight,i=Math.min(1,a/n);return{score:i>.3?0:1,numericValue:i,numericUnit:"unitless",displayValue:_q(xq.displayValue,{adDensity:i})}}},vq.exports.UIStrings=xq;var Aq={exports:{}};const Rq=oi,{auditNotApplicable:kq}=MO.exports,{Audit:Dq}=JF,{getScriptUrl:Cq}=IF,{isAdIframe:Iq,isAdRelated:Nq,isImplTag:Lq}=dF,{overlaps:Mq,toClientRect:Pq}=bj,Oq={
1178
- title:"Cumulative ad shift",failureTitle:"Reduce ad-related layout shift",description:"Measures layout shifts that were caused by ads or happened near ads. Reducing cumulative ad-related layout shift will improve user experience. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/cumulative-ad-shift)."},Fq=Rq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift.js",Oq);Aq.exports=class CumulativeAdShift extends Dq{static get meta(){return{id:"cumulative-ad-shift",title:Fq(Oq.title),failureTitle:Fq(Oq.failureTitle),description:Fq(Oq.description),scoreDisplayMode:Dq.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","IFrameElements"]}}static get defaultOptions(){return{p10:.05,median:.25}}static isAdExpansion(e,t){if(!e.args||!e.args.data)return!1;for(const r of e.args.data.impacted_nodes||[]){const e=Pq(r.old_rect||[]),a=Pq(r.new_rect||[]);if(!(e.top>a.top||e.height!==a.height))for(const r of t){
1179
- const t=r.clientRect;if((e.top>=t.top||a.top>=t.bottom)&&Mq(e,t))return!0}}return!1}static isAttributableToTask(e,t){if(!e.args||!e.args.data)return!1;return!!t.find((t=>t.ts<e.ts&&e.ts-t.ts<5e4))}static compute(e,t,r,a){let n=0,i=0,o=0,s=0,c=0,l=0;for(const u of e)u.args&&u.args.data&&u.args.data.is_main_frame&&(n+=u.args.data.score,i++,(this.isAdExpansion(u,r)||this.isAttributableToTask(u,t))&&(o+=u.args.data.score,s++,u.ts<a&&(c+=u.args.data.score,l++)));return{cumulativeShift:n,numShifts:i,cumulativeAdShift:o,numAdShifts:s,cumulativePreImplTagAdShift:c,numPreImplTagAdShifts:l}}static getLayoutShiftEventsByWindow(e){let t=0,r=[],a=0,n=[];for(const i of e){if("LayoutShift"!==i.name||!i.args||!i.args.data)continue;if(n.length){const e=n[0],o=n[n.length-1];(o.ts-e.ts>5e6||i.ts-o.ts>1e6)&&(a>t&&(r=n,t=a),n=[],a=0)}n.push(i);const e=i.args.data;a+=e.weighted_score_delta||e.score||0}return r.length||(r=n),r}static async audit(e,t){
1180
- const r=e.traces[Dq.DEFAULT_PASS],a=this.getLayoutShiftEventsByWindow(r.traceEvents);if(!a.length)return kq.NoLayoutShifts;const n=r.traceEvents.filter((e=>Nq(Cq(e)||""))),i=n.find((e=>Lq(Cq(e)||"")))||{ts:1/0},o=e.IFrameElements.filter(Iq),s=this.compute(a,n,o,i.ts),c=s.cumulativeAdShift;return o.length||c?{numericValue:c,numericUnit:"unitless",score:Dq.computeLogNormalScore({p10:t.options.p10,median:t.options.median},c),displayValue:c.toLocaleString(t.settings.locale),details:s}:kq.NoAdRendered}},Aq.exports.UIStrings=Oq;var Uq={exports:{}};const jq=oi,Bq=Lo,{auditNotApplicable:$q}=MO.exports,{Audit:qq}=JF,{isGpt:zq,isGptImplTag:Vq}=dF,Wq={title:"Deprecated GPT API Usage",failureTitle:"Avoid deprecated GPT APIs",description:"Deprecated GPT API methods should be avoided to ensure your page is tagged correctly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/deprecated-gpt-api-usage).",
1181
- displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},Gq=jq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/deprecated-api-usage.js",Wq);Uq.exports=class DeprecatedApiUsage extends qq{static get meta(){return{id:"deprecated-gpt-api-usage",title:Gq(Wq.title),failureTitle:Gq(Wq.failureTitle),description:Gq(Wq.description),scoreDisplayMode:"informative",requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[qq.DEFAULT_PASS];if(!(await Bq.request(r,t)).find((e=>Vq(e.url))))return $q.NoGpt;const a=e.ConsoleMessages.filter((e=>"warning"===e.level||"error"===e.level)).filter((e=>e.url&&zq(e.url))).filter((e=>e.text.toLowerCase().includes("deprecated")||e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:Gq(jq.UIStrings.columnURL)},{
1182
- key:"description",itemType:"code",text:Gq(jq.UIStrings.columnDescription)}],i=qq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:Gq(Wq.displayValue,{numErrors:o})}}},Uq.exports.UIStrings=Wq;var Hq={exports:{}};const Yq=oi,Kq=Lo,{auditNotApplicable:Jq}=MO.exports,{Audit:Xq}=JF,{isGpt:Zq,isGptImplTag:Qq}=dF,ez={title:"GPT Errors",failureTitle:"Fix GPT errors",description:"Fix GPT errors to ensure your page is tagged as intended. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-errors-overall).",displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},tz=Yq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/gpt-errors-overall.js",ez);Hq.exports=class GptErrorsOverall extends Xq{static get meta(){return{id:"gpt-errors-overall",title:tz(ez.title),failureTitle:tz(ez.failureTitle),description:tz(ez.description),scoreDisplayMode:"informative",
1183
- requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[Xq.DEFAULT_PASS];if(!(await Kq.request(r,t)).find((e=>Qq(e.url))))return Jq.NoGpt;const a=e.ConsoleMessages.filter((e=>"error"===e.level||"warning"===e.level)).filter((e=>e.url&&Zq(e.url))).filter((e=>!e.text.toLowerCase().includes("deprecated")&&!e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:tz(Yq.UIStrings.columnURL)},{key:"description",itemType:"code",text:tz(Yq.UIStrings.columnDescription)}],i=Xq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:tz(ez.displayValue,{numErrors:o})}}},Hq.exports.UIStrings=ez;var rz={exports:{}};const az=oi,nz=KF,iz=Lo,{auditNotApplicable:oz}=MO.exports,{Audit:sz}=JF,{getAttributableUrl:cz}=jF,{isAdRelated:lz,getNameOrTld:uz}=dF,dz={
1184
- title:"Total ad JS blocking time",failureTitle:"Reduce ad JS blocking time",description:"Ad-related scripts are blocking the main thread. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/total-ad-blocking-time).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",columnName:"Name",columnBlockingTime:"Blocking Time"},mz=az.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time.js",dz),pz=[{key:"name",itemType:"text",text:mz(dz.columnName)},{key:"blockingTime",itemType:"ms",text:mz(dz.columnBlockingTime),granularity:1}];class TotalAdBlockingTime extends sz{static get meta(){return{id:"total-ad-blocking-time",title:mz(dz.title),failureTitle:mz(dz.failureTitle),description:mz(dz.description),requiredArtifacts:["traces","devtoolsLogs"]}}static get defaultOptions(){return{simulate:{p10:290,median:600},provided:{p10:150,median:350}}}static async audit(e,t){
1185
- const r=e.traces[sz.DEFAULT_PASS],a=e.devtoolsLogs[sz.DEFAULT_PASS];if(!(await iz.request(a,t)).find((e=>lz(e.url))))return oz.NoAdRelatedReq;const n={trace:r,devtoolsLog:a,settings:t.settings};let i=[];try{i=await nz.request(n,t)}catch(e){return oz.InvalidTiming}let o=0;const s=new Map;for(const e of i){const t=cz(e);if(!t||!lz(t))continue;if(e.parent)continue;const r=e.duration-50;o+=r;const a=uz(t),n=s.get(a)||0;s.set(a,n+r)}const c=[];for(const[e,t]of s.entries())c.push({name:e,blockingTime:t});c.sort(((e,t)=>t.blockingTime-e.blockingTime));const l=t.options[t.settings.throttlingMethod]||t.options.provided;return{score:sz.computeLogNormalScore(l,o),numericValue:o,numericUnit:"millisecond",displayValue:mz(dz.failureDisplayValue,{timeInMs:o}),details:TotalAdBlockingTime.makeTableDetails(pz,c)}}}rz.exports=TotalAdBlockingTime,rz.exports.UIStrings=dz;const hz=bn,gz=la,fz=mn,yz=Tu,vz=xu,bz=pu,wz=oi,Sz=Su;function isBundledEnvironment(){
1186
- if(globalThis.isDevtools||globalThis.isLightrider)return!0;try{return require.resolve("lighthouse-logger"),!1}catch(e){return!0}}const mergeOptionsOfItems=function(e){const t=[];for(const r of e){const e=r.path&&t.find((e=>e.path===r.path));e?e.options=Object.assign({},e.options,r.options):t.push(r)}return t};const Tz=function _mergeConfigFragment(e,t,r=!1){if(null==e)return t;if(void 0===t)return e;if(Array.isArray(t)){if(r)return t;if(!Array.isArray(e))throw new TypeError("Expected array but got "+typeof e);const a=e.slice();return t.forEach((e=>{a.some((t=>gz(t,e)))||a.push(e)})),a}if("object"==typeof t){if("object"!=typeof e)throw new TypeError("Expected object but got "+typeof e);if(Array.isArray(e))throw new TypeError("Expected object but got Array");return Object.keys(t).forEach((a=>{const n=r||"settings"===a&&"object"==typeof e[a];e[a]=_mergeConfigFragment(e[a],t[a],n)})),e}return t}
1187
- ;const Ez=new Map([["../gather/gatherers/accessibility",ku],["../gather/gatherers/anchor-elements",Lu],["../gather/gatherers/cache-contents",Pu],["../gather/gatherers/console-messages",Fu],["../gather/gatherers/css-usage",$u],["../gather/gatherers/devtools-log-compat",Vu],["../gather/gatherers/devtools-log",Ws],["../gather/gatherers/dobetterweb/doctype",Gu],["../gather/gatherers/dobetterweb/domstats",Ku],["../gather/gatherers/dobetterweb/optimized-images",nd],["../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste",sd],["../gather/gatherers/dobetterweb/response-compression",gm],["../gather/gatherers/dobetterweb/tags-blocking-first-paint",bm],["../gather/gatherers/full-page-screenshot",_m],["../gather/gatherers/global-listeners",Rm],["../gather/gatherers/iframe-elements",Cm],["../gather/gatherers/image-elements",Fm],["../gather/gatherers/inputs",Bm],["../gather/gatherers/inspector-issues",Vm],["../gather/gatherers/installability-errors",$s],["../gather/gatherers/js-usage",Gm],["../gather/gatherers/link-elements",ip],["../gather/gatherers/main-document-content",dp],["../gather/gatherers/meta-elements",hp],["../gather/gatherers/network-user-agent",Ys],["../gather/gatherers/script-elements",Tp],["../gather/gatherers/seo/embedded-content",_p],["../gather/gatherers/seo/font-size",Im.exports],["../gather/gatherers/seo/robots-txt",Rp],["../gather/gatherers/seo/tap-targets",Lp],["../gather/gatherers/service-worker",Op],["../gather/gatherers/source-maps",jp],["../gather/gatherers/stacks",Xs],["../gather/gatherers/trace-compat",qp],["../gather/gatherers/trace-elements",hh],["../gather/gatherers/trace",oo],["../gather/gatherers/viewport-dimensions",fh],["../gather/gatherers/web-app-manifest",Us],["../audits/accessibility/accesskeys",yh.exports],["../audits/accessibility/aria-allowed-attr",_h.exports],["../audits/accessibility/aria-command-name",Dh.exports],["../audits/accessibility/aria-hidden-body",Lh.exports],["../audits/accessibility/aria-hidden-focus",Fh.exports],["../audits/accessibility/aria-input-field-name",$h.exports],["../audits/accessibility/aria-meter-name",Wh.exports],["../audits/accessibility/aria-progressbar-name",Kh.exports],["../audits/accessibility/aria-required-attr",Qh.exports],["../audits/accessibility/aria-required-children",ag.exports],["../audits/accessibility/aria-required-parent",sg.exports],["../audits/accessibility/aria-roles",dg.exports],["../audits/accessibility/aria-toggle-field-name",gg.exports],["../audits/accessibility/aria-tooltip-name",bg.exports],["../audits/accessibility/aria-treeitem-name",Eg.exports],["../audits/accessibility/aria-valid-attr-value",Rg.exports],["../audits/accessibility/aria-valid-attr",Ig.exports],["../audits/accessibility/button-name",Pg.exports],["../audits/accessibility/bypass",jg.exports],["../audits/accessibility/color-contrast",zg.exports],["../audits/accessibility/definition-list",Hg.exports],["../audits/accessibility/dlitem",Xg.exports],["../audits/accessibility/document-title",tf.exports],["../audits/accessibility/duplicate-id-active",of.exports],["../audits/accessibility/duplicate-id-aria",uf.exports],["../audits/accessibility/form-field-multiple-labels",hf.exports],["../audits/accessibility/frame-title",vf.exports],["../audits/accessibility/heading-order",Tf.exports],["../audits/accessibility/html-has-lang",Af.exports],["../audits/accessibility/html-lang-valid",Cf.exports],["../audits/accessibility/image-alt",Mf.exports],["../audits/accessibility/input-image-alt",Uf.exports],["../audits/accessibility/label",qf.exports],["../audits/accessibility/link-name",Gf.exports],["../audits/accessibility/list",Jf.exports],["../audits/accessibility/listitem",ey.exports],["../audits/accessibility/manual/custom-controls-labels",sy],["../audits/accessibility/manual/custom-controls-roles",ly],["../audits/accessibility/manual/focus-traps",dy],["../audits/accessibility/manual/focusable-controls",py],["../audits/accessibility/manual/interactive-element-affordance",gy],["../audits/accessibility/manual/logical-tab-order",yy],["../audits/accessibility/manual/managed-focus",by],["../audits/accessibility/manual/offscreen-content-hidden",Sy],["../audits/accessibility/manual/use-landmarks",Ey],["../audits/accessibility/manual/visual-order-follows-dom",_y],["../audits/accessibility/meta-refresh",Ay.exports],["../audits/accessibility/meta-viewport",Cy.exports],["../audits/accessibility/object-alt",My.exports],["../audits/accessibility/tabindex",Uy.exports],["../audits/accessibility/td-headers-attr",qy.exports],["../audits/accessibility/th-has-data-cells",Gy.exports],["../audits/accessibility/valid-lang",Jy.exports],["../audits/accessibility/video-caption",ev.exports],["../audits/apple-touch-icon",nv.exports],["../audits/autocomplete",cv.exports],["../audits/bootup-time",yv.exports],["../audits/byte-efficiency/duplicated-javascript",Bv.exports],["../audits/byte-efficiency/efficient-animated-content",Jb.exports],["../audits/byte-efficiency/legacy-javascript",rw.exports],["../audits/byte-efficiency/modern-image-formats",mw.exports],["../audits/byte-efficiency/offscreen-images",vw.exports],["../audits/byte-efficiency/render-blocking-resources",zw.exports],["../audits/byte-efficiency/total-byte-weight",dS.exports],["../audits/byte-efficiency/unminified-css",vS.exports],["../audits/byte-efficiency/unminified-javascript",kS.exports],["../audits/byte-efficiency/unused-css-rules",PS.exports],["../audits/byte-efficiency/unused-javascript",$S.exports],["../audits/byte-efficiency/uses-long-cache-ttl",QS.exports],["../audits/byte-efficiency/uses-optimized-images",lT.exports],["../audits/byte-efficiency/uses-responsive-images-snapshot",gT.exports],["../audits/byte-efficiency/uses-responsive-images",fT.exports],["../audits/byte-efficiency/uses-text-compression",LT.exports],["../audits/content-width",jT.exports],["../audits/critical-request-chains",zT.exports],["../audits/csp-xss",aE.exports],["../audits/deprecations",tx.exports],["../audits/diagnostics",mx],["../audits/dobetterweb/charset",px.exports],["../audits/dobetterweb/doctype",Sx.exports],["../audits/dobetterweb/dom-size",_x.exports],["../audits/dobetterweb/geolocation-on-start",Cx.exports],["../audits/dobetterweb/inspector-issues",Ux.exports],["../audits/dobetterweb/js-libraries",qx.exports],["../audits/dobetterweb/no-document-write",Hx.exports],["../audits/dobetterweb/no-vulnerable-libraries",Zx.exports],["../audits/dobetterweb/notification-on-start",l_.exports],["../audits/dobetterweb/password-inputs-can-be-pasted-into",h_.exports],["../audits/dobetterweb/uses-http2",b_.exports],["../audits/dobetterweb/uses-passive-event-listeners",M_.exports],["../audits/errors-in-console",j_.exports],["../audits/final-screenshot",Z_],["../audits/font-display",Q_.exports],["../audits/full-page-screenshot",dA],["../audits/image-aspect-ratio",mA.exports],["../audits/image-size-responsive",vA.exports],["../audits/installable-manifest",xA.exports],["../audits/is-on-https",MA.exports],["../audits/largest-contentful-paint-element",qA.exports],["../audits/layout-shift-elements",HA.exports],["../audits/lcp-lazy-loaded",ZA.exports],["../audits/long-tasks",aR.exports],["../audits/main-thread-tasks",yR],["../audits/mainthread-work-breakdown",vR.exports],["../audits/manual/pwa-cross-browser",_R.exports],["../audits/manual/pwa-each-page-has-url",DR.exports],["../audits/manual/pwa-page-transitions",LR.exports],["../audits/maskable-icon",FR.exports],["../audits/metrics",MD],["../audits/metrics/cumulative-layout-shift",PD.exports],["../audits/metrics/experimental-interaction-to-next-paint",$D.exports],["../audits/metrics/first-contentful-paint-3g",JD],["../audits/metrics/first-contentful-paint",XD.exports],["../audits/metrics/first-meaningful-paint",aC.exports],["../audits/metrics/interactive",lC.exports],["../audits/metrics/largest-contentful-paint",gC.exports],["../audits/metrics/max-potential-fid",TC.exports],["../audits/metrics/speed-index",kC.exports],["../audits/metrics/total-blocking-time",MC.exports],["../audits/network-requests",zC],["../audits/network-rtt",VC.exports],["../audits/network-server-latency",XC.exports],["../audits/no-unload-listeners",nI.exports],["../audits/non-composited-animations",uI.exports],["../audits/oopif-iframe-test-audit",{
1117
+ label:"VertaMedia",patterns:["^https?://rtb[.]vertamedia[.]com/hb/.*"]},{label:"Vertoz",patterns:["^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*"]},{label:"WideOrbig",patterns:["^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*"]},{label:"WideSpace",patterns:["^https?://engine[.]widespace[.]com/map/engine/hb/.*"]},{label:"YieldBot",patterns:["^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*"]},{label:"YieldMo",patterns:["^https?://ads[.]yieldmo[.]com/exchange/prebid.*"]}];const VO=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g,WO="max-age",GO="s-maxage",HO="max-stale",YO="min-fresh",KO="immutable",JO="must-revalidate",XO="no-cache",ZO="no-store",QO="no-transform",eF="only-if-cached",tF="private",rF="proxy-revalidate",aF="public";function parseBooleanOnly(e){return null===e}function parseDuration(e){if(!e)return null;const t=parseInt(e,10);return!Number.isFinite(t)||t<0?null:t}class CacheControl{constructor(){this.maxAge=null,this.sharedMaxAge=null,
1118
+ this.maxStale=null,this.maxStaleDuration=null,this.minFresh=null,this.immutable=null,this.mustRevalidate=null,this.noCache=null,this.noStore=null,this.noTransform=null,this.onlyIfCached=null,this.private=null,this.proxyRevalidate=null,this.public=null}parse(e){if(!e||0===e.length)return this;const t={},r=e.match(VO)||[];return Array.prototype.forEach.call(r,(e=>{const r=e.split("=",2),[a]=r;let n=null;r.length>1&&(n=r[1].trim()),t[a.toLowerCase()]=n})),this.maxAge=parseDuration(t[WO]),this.sharedMaxAge=parseDuration(t[GO]),this.maxStale=parseBooleanOnly(t[HO]),this.maxStaleDuration=parseDuration(t[HO]),this.maxStaleDuration&&(this.maxStale=!0),this.minFresh=parseDuration(t[YO]),this.immutable=parseBooleanOnly(t[KO]),this.mustRevalidate=parseBooleanOnly(t[JO]),this.noCache=parseBooleanOnly(t[XO]),this.noStore=parseBooleanOnly(t[ZO]),this.noTransform=parseBooleanOnly(t[QO]),this.onlyIfCached=parseBooleanOnly(t[eF]),this.private=parseBooleanOnly(t[tF]),
1119
+ this.proxyRevalidate=parseBooleanOnly(t[rF]),this.public=parseBooleanOnly(t[aF]),this}format(){const e=[];return"number"==typeof this.maxAge&&e.push(`${WO}=${this.maxAge}`),"number"==typeof this.sharedMaxAge&&e.push(`${GO}=${this.sharedMaxAge}`),this.maxStale&&("number"==typeof this.maxStaleDuration?e.push(`${HO}=${this.maxStaleDuration}`):e.push(HO)),"number"==typeof this.minFresh&&e.push(`${YO}=${this.minFresh}`),this.immutable&&e.push(KO),this.mustRevalidate&&e.push(JO),this.noCache&&e.push(XO),this.noStore&&e.push(ZO),this.noTransform&&e.push(QO),this.onlyIfCached&&e.push(eF),this.private&&e.push(tF),this.proxyRevalidate&&e.push(rF),this.public&&e.push(aF),e.join(", ")}}var nF={CacheControl,parse:function parse(e){return(new CacheControl).parse(e)},format:function format$2(e){return e instanceof CacheControl?e.format():CacheControl.prototype.format.call(e)}};const iF=QS.exports,{parse:oF}=nF;function getHeader(e,t){const r=t.toLowerCase()
1120
+ ;return(e.responseHeaders||[]).find((e=>e.name.toLowerCase()===r))}var sF={isCacheable:function isCacheable$2(e){if(!iF.isCacheableAsset(e))return!1;const t=getHeader(e,"cache-control");if(t){try{const e=oF(t.value);if(e.noStore||e.noCache||0===e.maxAge)return!1}catch(e){}return!0}return!!getHeader(e,"expires")||!!getHeader(e,"last-modified")}};const cF=zO,lF=uw,{isCacheable:uF}=sF,{URL:dF}=Gn;function toURL$2(e){let t;try{t="string"==typeof e?new dF(e):e}catch(e){t=new dF("http://_")}return t}function isGoogleAds$2(e){return e=toURL$2(e),/(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.test(e.hostname)}function isAdSenseTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=["/pagead/js/adsbygoogle.js","/pagead/show_ads.js"].includes(e.pathname);return t&&r}function isAdSenseImplTag(e){const t="pagead2.googlesyndication.com"===(e=toURL$2(e)).host,r=/(^\/pagead\/js\/.*\/show_ads_impl.*?\.js)/.test(e.pathname);return t&&r}function isAdSense$1(e){
1121
+ return isAdSenseTag(e=toURL$2(e))||isAdSenseImplTag(e)}function isAdSenseAdRequest(e){if(!e)return!1;const t=new dF(e.url);return"/pagead/ads"===t.pathname&&"googleads.g.doubleclick.net"===t.host}function isAdSenseIframe(e){return/(^aswift_\d+)/.test(e.id)}function isGptTag$2(e){const{host:t,pathname:r}=toURL$2(e),a=["www.googletagservices.com","pagead2.googlesyndication.com","securepubads.g.doubleclick.net"].includes(t),n=["/tag/js/gpt.js","/tag/js/gpt_mobile.js"].includes(r);return a&&n}function isAMPTag(e){const{host:t,pathname:r}=toURL$2(e),a=["cdn.ampproject.org"].includes(t),n=["/v0/amp-ad-0.1.js"].includes(r);return a&&n}function isGptImplTag$4(e){return isGoogleAds$2(e)&&/(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.test(toURL$2(e).pathname)}function isAMPImplTag(e){return/^\/[a-z_]*\/\d+\/v0\/amp-ad-network-doubleclick-impl-0.1.js/.test(toURL$2(e).pathname)}function isGpt$3(e){return isGptTag$2(e=toURL$2(e))||isGptImplTag$4(e)}function isGptAdRequest$1(e){
1122
+ if(!e)return!1;return"/gampad/ads"===new dF(e.url).pathname&&"XHR"===e.resourceType&&isGoogleAds$2(e.url)}function isAMPAdRequest(e){if(!e)return!1;const t=new dF(e.url);return"/gampad/ads"===t.pathname&&"securepubads.g.doubleclick.net"===t.host&&"Fetch"===e.resourceType}function isGptIframe$1(e){return/(^google_ads_iframe_)/.test(e.id)}function isAdScript$2(e){return isAdSense$1(e)||isGpt$3(e)||function isAMP(e){return isAMPTag(e)||isAMPImplTag(e)}(e)}function getHeaderBidder$2(e){for(const t of cF)for(const r of t.patterns)if(new RegExp(r).test(e))return t.label}function isBidRelatedRequest$1(e){return!!getHeaderBidder$2("string"==typeof e?e:e.url)}var mF={isGoogleAds:isGoogleAds$2,isGptAdRequest:isGptAdRequest$1,isImpressionPing:function isImpressionPing$3(e){const{host:t,pathname:r}=toURL$2(e);return["securepubads.g.doubleclick.net","googleads4.g.doubleclick.net"].includes(t)&&["/pcs/view","/pagead/adview"].includes(r)},isGpt:isGpt$3,isAdSense:isAdSense$1,isAdSenseTag,
1123
+ isAdSenseImplTag,isAdSenseAdRequest,isAdSenseIframe,isGptTag:isGptTag$2,isGptImplTag:isGptImplTag$4,isGptIframe:isGptIframe$1,isAdTag:function isAdTag$3(e){return isAdSenseTag(e)||isGptTag$2(e)||isAMPTag(e)},isAdScript:isAdScript$2,isAdRequest:function isAdRequest$5(e){return isAdSenseAdRequest(e)||isGptAdRequest$1(e)||isAMPAdRequest(e)},isAdIframe:function isAdIframe$3(e){return isAdSenseIframe(e)||isGptIframe$1(e)},isImplTag:function isImplTag$3(e){return isAdSenseTag(e)||isGptImplTag$4(e)||isAMPImplTag(e)},containsAnySubstring:function containsAnySubstring$1(e,t){return t.some((t=>e.includes(t)))},hasImpressionPath:function hasImpressionPath(e){return"/pcs/view"===e.pathname||"/pagead/adview"===e.pathname},getHeaderBidder:getHeaderBidder$2,isBidRelatedRequest:isBidRelatedRequest$1,isBidRequest:function isBidRequest$4(e){return isBidRelatedRequest$1(e)&&function isPossibleBidRequest(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&!uF(e)}(e)},
1124
+ isStaticRequest:function isStaticRequest$1(e){return["parser","preload","other"].includes(e.initiator.type)},toURL:toURL$2,trimUrl:function trimUrl$1(e){const t=new dF(e),r=t.pathname.length>60?t.pathname.substr(0,60)+"...":t.pathname;return t.origin+r},getNameOrTld:function getNameOrTld$2(e){const t=getHeaderBidder$2(e);if(t)return t;if(isGpt$3(e))return"GPT";if(isAdSense$1(e))return"AdSense";if(isAMPTag(e))return"AMP tag";const r=lF.getEntity(e);if(r)return r.name;const{host:a}=new dF(e),[n=""]=a.match(/([^.]*(\.[a-z]{2,3}){1,2})$/)||[];return n||a},isAMPTag,isAMPAdRequest,isAdRelated:function isAdRelated$3(e){const t="string"==typeof e?e:e.url;if(isAdScript$2(t)||getHeaderBidder$2(t))return!0;const r=lF.getEntity(t);return!!r&&r.categories.includes("ad")}};const pF=Zc,hF=sb,{isBidRelatedRequest:gF,isImpressionPing:fF,isGoogleAds:yF,isGptAdRequest:vF,isGptTag:bF,isGptImplTag:wF,toURL:SF}=mF;function getFrame(e){return e.args.frame||e.args.data&&e.args.data.frame||null}
1125
+ function isAdTask(e){return!!function getCpuNodeUrls(e){const t=new Set;for(const{args:r}of e.childEvents)r.data&&r.data.url&&t.add(r.data.url);return Array.from(t)}(e).find((e=>gF(e)||yF(SF(e))))}function addEdge(e,t){e===t||e.endTime>t.startTime||e.addDependent(t)}function addEdges(e){const t=[],r=[];e.traverse((e=>{e.type===pF.TYPES.NETWORK&&(bF(e.record.url)&&"Script"===e.record.resourceType?r.push(e):vF(e.record)&&t.push(e))})),e.traverse((e=>{if(e.type===pF.TYPES.NETWORK){if(wF(e.record.url)){const t=e;for(const e of r)addEdge(e,t)}if(gF(e.record)){const r=e;for(const e of t)addEdge(r,e)}if(fF(e.record.url)){const r=e;for(const e of t){addEdge(e,r);for(const t of e.getDependents())addEdge(t,r)}}}}))}class AdLanternMetric$6 extends hF{static get COEFFICIENTS(){return{intercept:0,optimistic:1,pessimistic:0}}static getPessimisticGraph(e){const t=e.cloneWithRelationships((e=>!0));return addEdges(t),t}static getOptimisticGraph(e){
1126
+ const t=e.record.frameId,r=AdLanternMetric$6.getPessimisticGraph(e),a=r.cloneWithRelationships((e=>{if(e.type===pF.TYPES.CPU)return function isLongTask(e){return e.event.dur>5e4}(e)||isAdTask(e)||!!getFrame(e.event)&&getFrame(e.event)!==t;if(e.hasRenderBlockingPriority())return!0;const r=e.record.url;return gF(r)||yF(SF(r))}));return addEdges(r),a}static getEstimateFromSimulation(e,t){throw new Error("getEstimateFromSimulation not implemented by "+this.name)}static findTiming(e,t){let r={startTime:1/0,endTime:-1/0,duration:0};for(const[a,n]of e.entries())t(a,n)&&r.startTime>n.startTime&&(r=n);return r}static findNetworkTiming(e,t){return this.findTiming(e,(e=>e.type===pF.TYPES.NETWORK&&t(e.record)))}}var TF=AdLanternMetric$6;const EF=TF,xF=Dl,_F=Lo,AF=eb,{isAdRequest:RF,isBidRequest:kF,isImplTag:DF,isImpressionPing:CF}=mF,{URL:IF}=Gn;function getPageStartTime$4(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.startTime:t}async function getTimingsByRecord$5(e,t,r){
1127
+ const a=new Map,n=await _F.request(t,r);if("simulate"==r.settings.throttlingMethod){const n=await AF.request({trace:e,devtoolsLog:t},r),i=EF.getOptimisticGraph(n),o=await xF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:s}=o.simulate(i,{});for(const[{record:e},t]of s.entries())e&&a.set(e,t)}else{const e=getPageStartTime$4(n);for(const t of n)a.set(t,{startTime:1e3*(t.startTime-e),endTime:1e3*(t.endTime-e),duration:1e3*(t.endTime-t.startTime)})}return a}function getScriptUrl$1(e){if(e.args.data&&["EvaluateScript","FunctionCall"].includes(e.name))return e.args.data.url?e.args.data.url:e.args.data.stackTrace?e.args.data.stackTrace[0].url:void 0}var NF={getTagEndTime:function getTagEndTime$1(e){const t=e.find((e=>DF(new IF(e.url))));return t?t.endTime:-1},getImpressionStartTime:function getImpressionStartTime$1(e){const t=e.find((e=>CF(e.url)));return t?t.startTime:-1},getAdStartTime:function getAdStartTime$2(e){const t=e.find(RF);return t?t.startTime:-1},
1128
+ getBidStartTime:function getBidStartTime$1(e){const t=e.find(kF);return t?t.startTime:-1},getPageStartTime:getPageStartTime$4,getPageResponseTime:function getPageResponseTime(e,t=-1){const r=e.find((e=>200==e.statusCode));return r?r.responseReceivedTime:t},getScriptUrl:getScriptUrl$1,getTimingsByRecord:getTimingsByRecord$5,getScriptEvaluationTimes:async function getScriptEvaluationTimes$1(e,t,r){const a=1e3*getPageStartTime$4(await _F.request(t,r)),n=new Map;for(const t of e.traceEvents){const e=getScriptUrl$1(t);if(!e)continue;const r=t.ts/1e3-a;(!n.has(e)||n.get(e)>r)&&n.set(e,r)}if("simulate"!==r.settings.throttlingMethod)return n;const i=await getTimingsByRecord$5(e,t,r),o=new Map;for(const[e,t]of i.entries()){const i=n.get(e.url);if(!i)continue;if(o.has(e.url))continue;const s=1e3*e.startTime-a,c=t.endTime,l=r.settings.throttling.cpuSlowdownMultiplier*(i-s);o.set(e.url,c+l)}return o}};const LF=TF,MF=Ew,PF=Ao,{getAdStartTime:OF,getPageStartTime:FF}=NF,{isAdRequest:UF}=mF
1129
+ ;class LanternAdRequestTime extends LF{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:LF.findNetworkTiming(r,UF).startTime,nodeTimings:r}}}LanternAdRequestTime=PF(LanternAdRequestTime);class AdRequestTime$1 extends MF{static async computeSimulatedMetric(e,t){return LanternAdRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=FF(t),a=1e3*(OF(t)-r);return Promise.resolve({timing:a})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var jF=AdRequestTime$1=PF(AdRequestTime$1);var BF={getAttributableUrl:function getAttributableUrl$3(e,t=new Set){const r=e.attributableURLs.find((e=>t.has(e))),a=e.attributableURLs[0],n=r||a;if(n)return n;let i=50,o="";for(const r of e.children){const e=getAttributableUrl$3(r,t);e&&r.duration>i&&(o=e,i=r.duration)}return o}};const $F=TF,qF=Zc,zF=Ew,{getAttributableUrl:VF}=BF,WF=Dl,GF=Rv,HF=Ao,YF=Lo,KF=eb;class LongTasks$2 extends zF{
1130
+ static async getSimulationGraph(e,t,r){const a=await KF.request({trace:e,devtoolsLog:t},r);return $F.getOptimisticGraph(a)}static async computeSimulatedResult(e,t,r){const a=await this.getSimulationGraph(e,t,r),n=await WF.request({devtoolsLog:t,settings:r.settings},r),{nodeTimings:i}=n.simulate(a,{}),o=[];for(const[e,t]of i.entries())e.type!==qF.TYPES.CPU||t.duration<100||o.push({event:e.event,startTime:t.startTime,endTime:t.endTime,duration:t.duration,selfTime:t.duration,attributableURLs:Array.from(e.getEvaluateScriptURLs()),children:[],parent:e.parent,unbounded:e.unbounded,group:e.group});return o}static async computeObservedResult(e,t,r){const a=await GF.request(e,r),n=await YF.request(t,r),i=new Set(n.filter((e=>"Script"===e.resourceType)).map((e=>e.url)));return a.filter((e=>function isLong(e,t){if(e.duration<50)return!1;const r=VF(e,t);if(!r)return!1;if(e.parent)return r!=VF(e.parent,t);return!0}(e,i)))}static async compute_({trace:e,devtoolsLog:t},r){
1131
+ return"simulate"==r.settings.throttlingMethod?this.computeSimulatedResult(e,t,r):this.computeObservedResult(e,t,r)}static async request(e,t){throw Error("Not implemented -- class not decorated")}}var JF=LongTasks$2=HF(LongTasks$2),XF=getAugmentedNamespace(Object.freeze({__proto__:null,Audit:kc}));const ZF=jF,QF=oi,eU=JF,{auditNotApplicable:tU}=PO.exports,{Audit:rU}=XF,{getAttributableUrl:aU}=BF,{isAdScript:nU}=mF,{URL:iU}=Gn,oU={title:"No long tasks blocking ad-related network requests",failureTitle:"Avoid long tasks that block ad-related network requests",description:"Tasks blocking the main thread can delay ad requests and cause a poor user experience. Consider removing long blocking tasks or moving them off of the main thread. These tasks can be especially detrimental to performance on less powerful devices. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",
1132
+ columnScript:"Attributable URL",columnStartTime:"Start",columnDuration:"Duration"},sU=QF.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js",oU),cU=[{key:"script",itemType:"url",text:sU(oU.columnScript)},{key:"startTime",itemType:"ms",text:sU(oU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:sU(oU.columnDuration),granularity:1}];class AdBlockingTasks extends rU{static get meta(){return{id:"ad-blocking-tasks",title:sU(oU.title),failureTitle:sU(oU.failureTitle),description:sU(oU.description),requiredArtifacts:["traces","devtoolsLogs"]}}static async audit(e,t){const r="simulate"==t.settings.throttlingMethod?200:100,a={trace:e.traces[rU.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[rU.DEFAULT_PASS],settings:t.settings};let n=[];try{n=await eU.request(a,t)}catch(e){return tU.InvalidTiming}if(!n.length)return tU.NoTasks;const{timing:i}=await ZF.request(a,t);if(!(i>0))return tU.NoAdRelatedReq;const o=[];for(const e of n){
1133
+ if(e.startTime>i||e.duration<r)continue;const t=aU(e);if(t&&nU(new iU(t)))continue;const a=t&&new iU(t),n=a&&a.origin+a.pathname||"Other";o.push({script:n,rawUrl:t,startTime:e.startTime,endTime:e.endTime,duration:e.duration,isTopLevel:!e.parent})}let s=Array.from(o);s.length>10&&(s=o.filter((e=>"Other"!==e.script&&e.isTopLevel)).sort(((e,t)=>t.duration-e.duration)).splice(0,10).sort(((e,t)=>e.startTime-t.startTime)));const c=s.reduce(((e,t)=>t.isTopLevel?e+t.duration:e),0),l=s.length>0;return{score:l?0:1,numericValue:c,numericUnit:"millisecond",displayValue:l?sU(oU.failureDisplayValue,{timeInMs:c}):"",details:AdBlockingTasks.makeTableDetails(cU,s)}}}qO.exports=AdBlockingTasks,qO.exports.UIStrings=oU;var lU={exports:{}};const uU=oi,dU=Lo,{auditNotApplicable:mU}=PO.exports,{Audit:pU}=XF,{getTimingsByRecord:hU}=NF,{isAdTag:gU}=mF,{URL:fU}=Gn,yU={title:"Minimal render-blocking resources found",failureTitle:"Avoid render-blocking resources",
1134
+ description:"Render-blocking resources slow down tag load times. Consider loading critical JS/CSS inline or loading scripts asynchronously or loading the tag earlier in the head. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).",failureDisplayValue:"Up to {timeInMs, number, seconds} s tag load time improvement",columnUrl:"Resource",columnStartTime:"Start",columnDuration:"Duration"},vU=uU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js",yU),bU=[{key:"url",itemType:"url",text:vU(yU.columnUrl)},{key:"startTime",itemType:"ms",text:vU(yU.columnStartTime),granularity:1},{key:"duration",itemType:"ms",text:vU(yU.columnDuration),granularity:1}];class AdRenderBlockingResources extends pU{static get meta(){return{id:"ad-render-blocking-resources",title:vU(yU.title),failureTitle:vU(yU.failureTitle),scoreDisplayMode:"binary",description:vU(yU.description),
1135
+ requiredArtifacts:["LinkElements","ScriptElements","devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[pU.DEFAULT_PASS],a=e.traces[pU.DEFAULT_PASS],n=await dU.request(r,t),i=n.find((e=>gU(new fU(e.url))));if(!i)return mU.NoTag;const o=await hU(a,r,t),s=new Set;for(const t of e.LinkElements)t.href&&"stylesheet"==t.rel&&s.add(t.href);for(const t of e.ScriptElements)!t.src||t.defer||t.async||s.add(t.src);const c=n.filter((e=>e.endTime<i.startTime)).filter((e=>e!=i.initiatorRequest)).filter((e=>e.initiator.type="parser")).filter((e=>s.has(e.url))).map((e=>Object.assign({url:e.url},o.get(e))));c.sort(((e,t)=>e.endTime-t.endTime));const l=o.get(i)||{startTime:1/0},u=c.map((e=>e.startTime)),d=c.map((e=>e.endTime)),m=Math.min(...u),p=Math.min(Math.max(...d),l.startTime)-m;let h="";c.length>0&&p>0&&(h=vU(yU.failureDisplayValue,{timeInMs:p}));return{score:c.length>0&&p>100?0:1,numericValue:c.length,numericUnit:"unitless",displayValue:h,details:{opportunity:p,
1136
+ ...AdRenderBlockingResources.makeTableDetails(bU,c)}}}}lU.exports=AdRenderBlockingResources,lU.exports.UIStrings=yU;var wU={exports:{}};var SU={assert:function assert$2(e){if(null==e)throw new Error("Expected not to be null");return e}};const TU=Zc,EU=Lo,{assert:xU}=SU,{getNameOrTld:_U,trimUrl:AU}=mF,{getNetworkInitiators:RU}=eb,{getTimingsByRecord:kU}=NF,{isAdRequest:DU,isAdSense:CU,isGpt:IU,isBidRequest:NU,isAdRelated:LU}=mF;function isXhrCritical(e,t,r){const a=t.xhrEdges.get(e.url);if(!a)return!1;for(const{url:e}of r)if(a.has(e))return!0;return!1}function addInitiatedRequests(e,t,r,a){const n=r.allRecords.filter((e=>null!=e.resourceType)).filter((e=>["Script","XHR"].includes(e.resourceType||"")&&e.endTime<t.startTime)).filter((t=>t.initiatorRequest==e||RU(t).includes(e.url)));for(const e of n){"XHR"==e.resourceType&&isXhrCritical(e,r,a)&&linkGraph(r,e,a)}}function linkGraph(e,t,r=new Set){if(!t||r.has(t))return r;r.add(t);const a=new Set
1137
+ ;for(let n=t.initiator.stack;n;n=n.parent)for(const{url:i}of n.callFrames){if(a.has(i))continue;a.add(i);const o=e.requestsByUrl.get(i);if(o&&(linkGraph(e,o,r),"Script"==o.resourceType)){const a=n.callFrames[0].url,i=e.requestsByUrl.get(a);i&&addInitiatedRequests(i,t,e,r)}}return linkGraph(e,t.initiatorRequest||null,r),r}function buildNetworkSummary(e,t){const r=new Map;for(const t of e)r.set(t.url,t);const a=t.filter((e=>e.name.startsWith("XHR"))).filter((e=>!!(e.args.data||{}).url)),n=new Map;for(const e of a){const t=e.args.data||{},r=n.get(t.url)||new Set;for(const{url:e}of t.stackTrace||[])r.add(e);n.set(t.url,r)}return{requestsByUrl:r,xhrEdges:n,allRecords:e}}var MU={getTransitiveClosure:function getTransitiveClosure(e,t){const r=new Set,a=function findTargetRequest(e,t){let r=null;return e.traverse((e=>{e.type!==TU.TYPES.CPU&&t(e.record)&&(r&&r.startTime<e.startTime||(r=e))})),r}(e,t),n=[],i=[];if(null==a)return{requests:n,traceEvents:i};const o=[a];for(;o.length;){
1138
+ const e=o.pop();e&&!r.has(e)&&(r.add(e),o.push(...e.getDependencies()))}const s=new Set;for(o.push(...e.getDependents());o.length;){const e=o.pop();if(e&&!s.has(e)){if(s.add(e),r.has(e))for(const e of o)r.add(e);o.push(...e.getDependents())}}for(const e of r)e.type===TU.TYPES.NETWORK?e.endTime<xU(a).startTime&&n.push(e.record):e.type===TU.TYPES.CPU&&e.event.ts<1e6*xU(a).startTime&&i.push(e.event,...e.childEvents);return{requests:n,traceEvents:i}},getCriticalGraph:function getCriticalGraph$1(e,t,r){const a=buildNetworkSummary(e,t),n=new Set;return linkGraph(a,r,n),n},computeAdRequestWaterfall:async function computeAdRequestWaterfall$4(e,t,r){const a=await EU.request(t,r),n=a.find(DU)||a.find(NU)||a.find(LU);if(null==n)return Promise.resolve([]);const i=new Set,o=xU(n),s=a.filter((e=>IU(e.url)||CU(e.url))),c=a.filter((e=>NU(e)&&e.endTime<=o.startTime)),l=buildNetworkSummary(a,e.traceEvents);for(const e of[o,...c,...s])linkGraph(l,e,i)
1139
+ ;const u=new Set(["Script","XHR","Fetch","EventStream","Document",void 0]),d=Array.from(i).filter((e=>e.endTime<o.startTime)).filter((e=>u.has(e.resourceType))).filter((e=>"text/css"!=e.mimeType)),m=await kU(e,t,r),p=function computeSummaries(e){e.sort(((e,t)=>e.nameOrTld!=t.nameOrTld?e.nameOrTld<t.nameOrTld?-1:1:e.type!=t.type?e.type<t.type?-1:1:e.startTime!=t.startTime?e.startTime<t.startTime?-1:1:e.endTime-t.endTime));const t=[];for(let n=0;n<e.length;n++){const i=e[n];let o;for(;n<e.length&&(o=e[n+1],o&&(r=o,a=i,!(Math.max(r.startTime,a.startTime)>Math.min(r.endTime,a.endTime)||r.type&&a.type&&r.type!=a.type||"Script"==r.type||r.nameOrTld!=a.nameOrTld)));)i.endTime=Math.max(i.endTime,o.endTime),i.duration=i.endTime-i.startTime,n++;t.push(i)}var r,a;return t.sort(((e,t)=>e.startTime-t.startTime)),t}(d.map((e=>{const{startTime:t,endTime:r}=m.get(e)||e;return{startTime:t,endTime:r,duration:r-t,selfTime:0,url:AU(e.url),nameOrTld:_U(e.url),type:e.resourceType,record:e}})))
1140
+ ;return function computeSelfTimes(e){if(!e.length)return[];let t=xU(e[0]);t.selfTime=t.duration;let r=t.startTime;for(const a of e){if(a.endTime<r||a==t)continue;const e=Math.max(r,a.startTime),n=Math.min(t.endTime,a.endTime);e<n&&(t.selfTime-=n-e),r=Math.max(r,n),a.endTime>t.endTime&&(a.selfTime=a.endTime-e,t=a)}}(p),p}};const PU=oi,{auditNotApplicable:OU}=PO.exports,{Audit:FU}=XF,{computeAdRequestWaterfall:UU}=MU,jU={title:"Ad request waterfall",failureTitle:"Reduce critical path for ad loading",description:"Consider reducing the number of resources, loading multiple resources simultaneously, or loading resources earlier to improve ad speed. Requests that block ad loading can be found below. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path).",displayValue:"{serialResources, plural, =1 {1 serial resource} other {# serial resources}}",columnUrl:"Request",columnType:"Type",columnStartTime:"Start",columnEndTime:"End"
1141
+ },BU=PU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js",jU),$U=[{key:"nameOrTld",itemType:"text",text:BU(jU.columnType)},{key:"url",itemType:"url",text:BU(jU.columnUrl)},{key:"startTime",itemType:"ms",text:BU(jU.columnStartTime),granularity:1},{key:"endTime",itemType:"ms",text:BU(jU.columnEndTime),granularity:1}];class AdRequestCriticalPath extends FU{static get meta(){return{id:"ad-request-critical-path",title:BU(jU.title),failureTitle:BU(jU.failureTitle),description:BU(jU.description),scoreDisplayMode:"informative",requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[FU.DEFAULT_PASS],a=e.devtoolsLogs[FU.DEFAULT_PASS],n=(await UU(r,a,t)).filter((e=>e.startTime>0&&e.startTime<e.endTime));if(!n.length)return OU.NoAds;const i=function computeDepth(e){let t=0,r=0;for(const{startTime:a,endTime:n}of e)a>=t?(++r,t=n):t=Math.min(t,n);return r}(n),o=i>3;for(const e of n)delete e.record
1142
+ ;const s=function computeIdleTimes(e){let t=1/0;const r=[];for(let a=0;a<e.length;){const{startTime:n,endTime:i}=e[a];for(n-t>150&&r.push(n-t),t=i;++a<e.length&&e[a].startTime<t;)t=Math.max(t,e[a].endTime)}return r}(n),c=Math.max(...s),l=s.reduce(((e,t)=>e+t),0);return{numericValue:i,numericUnit:"unitless",score:o?0:1,displayValue:BU(jU.displayValue,{serialResources:i}),details:{size:n.length,depth:i,maxIdleTime:c,totalIdleTime:l,...AdRequestCriticalPath.makeTableDetails($U,n)}}}}wU.exports=AdRequestCriticalPath,wU.exports.UIStrings=jU;var qU={exports:{}};const zU=TF,VU=Ew,WU=Ao,{getAdStartTime:GU,getBidStartTime:HU,getPageStartTime:YU}=NF,{isAdRequest:KU,isBidRequest:JU}=mF;class LanternBidRequestTime extends zU{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e,a=zU.findNetworkTiming(r,JU).startTime;return a>zU.findNetworkTiming(r,KU).startTime?{timeInMs:-1,nodeTimings:r}:{timeInMs:a,nodeTimings:r}}}LanternBidRequestTime=WU(LanternBidRequestTime)
1143
+ ;class BidRequestTime extends VU{static async computeSimulatedMetric(e,t){return LanternBidRequestTime.request(e,t)}static async computeObservedMetric(e){const{networkRecords:t}=e,r=YU(t),a=HU(t);if(GU(t)<a)return{timing:-1};return{timing:1e3*(a-r)}}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const XU=BidRequestTime=WU(BidRequestTime),ZU=oi,{auditNotApplicable:QU}=PO.exports,{Audit:ej}=XF,tj={title:"First bid request time",failureTitle:"Reduce time to send the first bid request",description:"This metric measures the elapsed time from the start of page load until the first bid request is made. Delayed bid requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bid-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"
1144
+ },rj=ZU.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js",tj);qU.exports=class BidRequestFromPageStart extends ej{static get meta(){return{id:"bid-request-from-page-start",title:rj(tj.title),failureTitle:rj(tj.failureTitle),description:rj(tj.description),scoreDisplayMode:ej.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[ej.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[ej.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await XU.request(r,t);return n>0?{numericValue:n,numericUnit:"millisecond",score:ej.computeLogNormalScore(a,n),displayValue:rj(tj.displayValue,{timeInMs:n})}:QU.NoBids}},qU.exports.UIStrings=tj;var aj={exports:{}}
1145
+ ;const nj=jF,ij=oi,{auditNotApplicable:oj,runWarning:sj}=PO.exports,{Audit:cj}=XF,lj={title:"First ad request time",failureTitle:"Reduce time to send the first ad request",description:"This metric measures the elapsed time from the start of page load until the first ad request is made. Delayed ad requests will decrease impressions and viewability, and have a negative impact on ad revenue. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-from-page-start).",displayValue:"{timeInMs, number, seconds} s"},uj=ij.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js",lj);aj.exports=class AdRequestFromPageStart extends cj{static get meta(){return{id:"ad-request-from-page-start",title:uj(lj.title),failureTitle:uj(lj.failureTitle),description:uj(lj.description),scoreDisplayMode:cj.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{
1146
+ p10:6500,median:1e4},provided:{p10:1900,median:3500}}}static async audit(e,t){const r={trace:e.traces[cj.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[cj.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await nj.request(r,t);if(!(n>0)){const e=oj.NoAds;return e.runWarnings=[sj.NoAds],e}return{numericValue:n,numericUnit:"millisecond",score:cj.computeLogNormalScore(a,n),displayValue:uj(lj.displayValue,{timeInMs:n})}}},aj.exports.UIStrings=lj;var dj={exports:{}};const mj=oi,{auditNotApplicable:pj}=PO.exports,{Audit:hj}=XF,{isAdIframe:gj}=mF,fj={title:"No ad found at the very top of the viewport",failureTitle:"Move the top ad further down the page",
1147
+ description:"Over 10% of ads are never viewed because users scroll past them before they become viewable. By moving ad slots away from the very top of the viewport, users are more likely to see ads before scrolling away. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport).",failureDisplayValue:"A scroll of {valueInPx, number} px would hide half of your topmost ad",columnSlot:"Top Slot ID"},yj=mj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js",fj),vj=[{key:"slot",itemType:"text",text:yj(fj.columnSlot)}];class AdTopOfViewport extends hj{static get meta(){return{id:"ad-top-of-viewport",title:yj(fj.title),failureTitle:yj(fj.failureTitle),description:yj(fj.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter(gj).filter((e=>e.clientRect.width*e.clientRect.height>1&&!e.isPositionFixed)).map((e=>({
1148
+ midpoint:e.clientRect.top+e.clientRect.height/2,id:e.id})));if(!r.length)return pj.NoVisibleSlots;const a=r.reduce(((e,t)=>e.midpoint<t.midpoint?e:t)),n=a.midpoint<t.innerHeight;if(!n)return pj.NoAdsViewport;const i=n&&a.midpoint<100?0:1;return{score:i,numericValue:a.midpoint,numericUnit:"unitless",displayValue:i?"":yj(fj.failureDisplayValue,{valueInPx:a.midpoint}),details:AdTopOfViewport.makeTableDetails(vj,i?[]:[{slot:a.id}])}}}dj.exports=AdTopOfViewport,dj.exports.UIStrings=fj;var bj={exports:{}};function isBoxInViewport$1(e,t){const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return n<o&&i<s&&n<r&&i<a&&0<o&&0<s}var wj={boxViewableArea:function boxViewableArea(e,t){if(!isBoxInViewport$1(e,t))return 0;const{innerWidth:r,innerHeight:a}=t,{left:n,top:i,right:o,bottom:s}=e;return(Math.min(o,r)-Math.max(n,0))*(Math.min(s,a)-Math.max(i,0))},isBoxInViewport:isBoxInViewport$1,overlaps:function overlaps$1(e,t){
1149
+ const r=!(e.right<t.left||t.right<e.left),a=!(e.bottom<t.top||t.bottom<e.top);return r&&a},toClientRect:function toClientRect$1([e,t,r,a]){return{left:e,top:t,width:r,height:a,right:e+r,bottom:t+a}}};const{auditNotApplicable:Sj}=PO.exports,{Audit:Tj}=XF,Ej=oi,{isBoxInViewport:xj}=wj,{isGptIframe:_j}=mF,Aj={title:"Few or no ads loaded outside viewport",failureTitle:"Avoid loading ads until they are nearly on-screen",description:"Too many ads loaded outside the viewport lowers viewability rates and impacts user experience. Consider loading ads below the fold lazily as the user scrolls down. Consider using GPT's [Lazy Loading API](https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad). [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport).",failureDisplayValue:"{hiddenAds, plural, =1 {1 ad} other {# ads}} out of view",columnSlot:"Slots Outside Viewport"
1150
+ },Rj=Ej.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js",Aj),kj=[{key:"slot",itemType:"text",text:Rj(Aj.columnSlot)}];class AdsInViewport extends Tj{static get meta(){return{id:"ads-in-viewport",title:Rj(Aj.title),failureTitle:Rj(Aj.failureTitle),description:Rj(Aj.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>_j(e)&&e.clientRect.height*e.clientRect.width>1));if(!r.length)return Sj.NoVisibleSlots;const a=r.filter((e=>!xj(e.clientRect,t))).map((e=>({slot:e.id}))).sort(((e,t)=>e.slot.localeCompare(t.slot)));return{numericValue:(r.length-a.length)/r.length,numericUnit:"unitless",score:a.length>3?0:1,displayValue:a.length?Rj(Aj.failureDisplayValue,{hiddenAds:a.length}):"",details:AdsInViewport.makeTableDetails(kj,a)}}}bj.exports=AdsInViewport,bj.exports.UIStrings=Aj;var Dj={exports:{}};var Cj={count:function count(e,t){let r=0
1151
+ ;for(const a of e)t(a)&&r++;return r},bucket:function bucket$1(e,t){const r=new Map;for(const a of e){const e=t(a);if(null!=e){const t=r.get(e)||[];t.push(a),r.set(e,t)}}return r},flatten:function flatten(e){const t=[];for(const r of e)t.push(...r);return t}};const Ij=Cj,Nj=oi,Lj=HT,Mj=Lo,{auditNotApplicable:Pj}=PO.exports,{Audit:Oj}=XF,{isAdTag:Fj,isStaticRequest:Uj}=mF,{URL:jj}=Gn,Bj={title:"Ad tag is loaded asynchronously",failureTitle:"Load ad tag asynchronously",description:"Loading the ad tag synchronously blocks content rendering until the tag is fetched and loaded. Consider using the `async` attribute to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags)."},$j=Nj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js",Bj);function isAsync(e){return"Low"==e.priority||Uj(e)}Dj.exports=class AsyncAdTags extends Oj{static get meta(){return{
1152
+ id:"async-ad-tags",title:$j(Bj.title),failureTitle:$j(Bj.failureTitle),description:$j(Bj.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[Oj.DEFAULT_PASS],a=await Mj.request(r,t),n=await Lj.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>Fj(new jj(e.url)))).filter((e=>e.frameId===n.frameId));if(!i.length)return Pj.NoTag;const o=Ij.count(i,isAsync)-i.length;return{score:Number(0===o),numericValue:o,numericUnit:"unitless"}}},Dj.exports.UIStrings=Bj;var qj={exports:{}};const zj=on.default,Vj=Ao,Wj=Yp,Gj=Xp;zj.warn("trace-of-tab","trace-of-tab is deprecated, use processed-trace / processed-navigation instead");var Hj=Vj(class TraceOfTab$1{static async compute_(e,t){const r=await Wj.request(e,t),a=await Gj.request(r,t);return{...r,...a}}},null);const Yj=oi,Kj=Lo,Jj=Hj,{auditNotApplicable:Xj}=PO.exports,{Audit:Zj}=XF,{computeAdRequestWaterfall:Qj}=MU,{getTimingsByRecord:eB}=NF,tB={title:"Ads not blocked by load events",
1153
+ failureTitle:"Avoid waiting on load events",description:"Waiting on load events increases ad latency. To speed up ads, eliminate the following load event handlers. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/blocking-load-events).",displayValue:"{timeInMs, number, seconds} s blocked",columnEvent:"Event Name",columnTime:"Event Time",columnScript:"Script",columnBlockedUrl:"Blocked URL",columnFunctionName:"Function"},rB=Yj.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js",tB),aB=[{key:"eventName",itemType:"text",text:rB(tB.columnEvent)},{key:"time",itemType:"ms",text:rB(tB.columnTime),granularity:1},{key:"url",itemType:"url",text:rB(tB.columnScript)},{key:"functionName",itemType:"text",text:rB(tB.columnFunctionName)}];function findOriginalCallFrame(e){const{record:t}=e;let r=t&&t.initiator&&t.initiator.stack;if(r){for(;r.parent;)r=r.parent;return r.callFrames[r.callFrames.length-1]}}
1154
+ function findTraceEventOfCallFrame(e,t){return t.find((t=>"FunctionCall"==t.name&&t.args.data&&t.args.data.functionName==e.functionName&&t.args.data.scriptId==e.scriptId&&t.args.data.url==e.url&&Math.abs(t.args.data.lineNumber==e.lineNumber)<2&&Math.abs(t.args.data.columnNumber==e.columnNumber)<2))}function findEventIntervals(e,t){let r={};const a=[];for(const n of t)n.name==`${e}EventStart`?r={start:n.ts,end:1/0,eventName:e}:n.name==`${e}EventEnd`&&(r.end=n.ts,a.push(r));return a}function quantifyBlockedTime(e,t,r){const a=t.find((t=>t.url==e.url)),n=t.find((t=>t.url==e.blockedUrl));if(!a||!n)return 0;const i=r.get(a),o=r.get(n);return i&&o?o.startTime-i.endTime:0}class BlockingLoadEvents extends Zj{static get meta(){return{id:"blocking-load-events",title:rB(tB.title),failureTitle:rB(tB.failureTitle),description:rB(tB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
1155
+ const r=e.traces[Zj.DEFAULT_PASS],a=e.devtoolsLogs[Zj.DEFAULT_PASS],n=await Kj.request(a,t),{timings:i,processEvents:o}=await Jj.request(r,t),s=await eB(r,a,t),c=(await Qj(r,a,t)).sort(((e,t)=>e.startTime-t.startTime));if(!c.length)return Xj.NoAdRelatedReq;const l=[...findEventIntervals("domContentLoaded",o),...findEventIntervals("load",o)],u=[],d=new Set;for(const e of c){const t=findOriginalCallFrame(e);if(!t)continue;const r=JSON.stringify(t);if(d.has(r))continue;d.add(r);const a=findTraceEventOfCallFrame(t,o);if(!a)continue;const c=l.find((e=>e.start<=a.ts&&a.ts<=e.end));if(c){const r=Object.assign({eventName:c.eventName,blockedUrl:e.url,time:i[c.eventName],blockedTime:1/0},t);r.blockedTime=quantifyBlockedTime(r,n,s),u.push(r)}}const m=u.length>0;let p=0;return m&&(p=Math.min(...u.map((e=>e.blockedTime)))),{numericValue:u.length,numericUnit:"unitless",score:m?0:1,displayValue:m&&p?rB(tB.displayValue,{timeInMs:p}):"",details:BlockingLoadEvents.makeTableDetails(aB,u)}}}
1156
+ qj.exports=BlockingLoadEvents,qj.exports.UIStrings=tB;var nB={exports:{}};const iB=oi,{auditNotApplicable:oB}=PO.exports,{Audit:sB}=XF,{computeAdRequestWaterfall:cB}=MU,{isAdScript:lB,toURL:uB}=mF,dB={title:"No bottleneck requests found",failureTitle:"Avoid bottleneck requests",description:"Speed up, load earlier, parallelize, or eliminate the following requests and their dependencies in order to speed up ad loading. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/bottleneck-requests).",displayValue:"{blockedTime, number, seconds} s spent blocked on requests",columnUrl:"Blocking Request",columnInitiatorUrl:"Initiator Request",columnStartTime:"Start",columnSelfTime:"Exclusive Time",columnDuration:"Total Time"},mB=iB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js",dB),pB=[{key:"url",itemType:"url",text:mB(dB.columnUrl)},{key:"selfTime",itemType:"ms",text:mB(dB.columnSelfTime),granularity:1},{
1157
+ key:"duration",itemType:"ms",text:mB(dB.columnDuration),granularity:1}];class BottleneckRequests extends sB{static get meta(){return{id:"bottleneck-requests",title:mB(dB.title),failureTitle:mB(dB.failureTitle),description:mB(dB.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.traces[sB.DEFAULT_PASS],a=e.devtoolsLogs[sB.DEFAULT_PASS],n=(await cB(r,a,t)).filter((e=>e.startTime>0));if(!n.length)return oB.NoAdRelatedReq;const cost=e=>3*e.selfTime+e.duration,i=n.filter((e=>!lB(uB(e.url))&&(e.selfTime>250||e.duration>1e3))).sort(((e,t)=>cost(t)-cost(e))).slice(0,5),o=i.reduce(((e,t)=>e+t.selfTime),0)/1e3,s=1e3*o>1e3;for(const e of i)delete e.record;return{numericValue:i.length,numericUnit:"unitless",score:s?0:1,displayValue:s?mB(dB.displayValue,{blockedTime:o}):"",details:BottleneckRequests.makeTableDetails(pB,i)}}}nB.exports=BottleneckRequests,nB.exports.UIStrings=dB;var hB={exports:{}}
1158
+ ;const gB=oi,fB=HT,yB=Lo,vB=Ki,{auditNotApplicable:bB}=PO.exports,{Audit:wB}=XF,{containsAnySubstring:SB}=mF,{URL:TB}=Gn,EB={title:"No duplicate tags found",failureTitle:"Load tags only once",description:"Loading a tag more than once in the same page is redundant and adds overhead without benefit. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags).",failureDisplayValue:"{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}",columnScript:"Script",columnNumReqs:"Duplicate Requests",columnFrameId:"Frame ID"},xB=gB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js",EB),_B=["googletagservices.com/tag/js/gpt.js","securepubads.g.doubleclick.net/tag/js/gpt.js","pagead2.googlesyndication.com/pagead/js/adsbygoogle.js","pagead2.googlesyndication.com/pagead/js/show_ads.js","cdn.ampproject.org/v0/amp-ad-0.1.js"],AB=[{key:"script",itemType:"url",text:xB(EB.columnScript)},{key:"numReqs",
1159
+ itemType:"text",text:xB(EB.columnNumReqs)}];class DuplicateTags extends wB{static get meta(){return{id:"duplicate-tags",title:xB(EB.title),failureTitle:xB(EB.failureTitle),description:xB(EB.description),requiredArtifacts:["devtoolsLogs","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[wB.DEFAULT_PASS],a=await yB.request(r,t),n=await fB.request({URL:e.URL,devtoolsLog:r},t),i=a.filter((e=>e.frameId===n.frameId)).filter((e=>SB(e.url,_B))).filter((e=>e.resourceType===vB.TYPES.Script));if(!i.length)return bB.NoTags;const o=new Map;for(const e of i){const t=new TB(e.url).pathname,r=o.get(t)||0;o.set(t,r+1)}const s=[];for(const[e,t]of o)t>1&&s.push({script:e,numReqs:t});return{numericValue:s.length,numericUnit:"unitless",score:s.length?0:1,details:DuplicateTags.makeTableDetails(AB,s),displayValue:s.length?xB(EB.failureDisplayValue,{duplicateTags:s.length}):""}}}hB.exports=DuplicateTags,hB.exports.UIStrings=EB;var RB={exports:{}}
1160
+ ;const kB=TF,DB=Ew,CB=Ao,{getPageStartTime:IB,getImpressionStartTime:NB}=NF,{isImpressionPing:LB}=mF;class LanternAdRenderTime extends kB{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:kB.findNetworkTiming(r,(e=>!!e.url&&LB(new URL(e.url)))).startTime,nodeTimings:r}}}LanternAdRenderTime=CB(LanternAdRenderTime);class AdRenderTime extends DB{static async computeSimulatedMetric(e,t){return LanternAdRenderTime.request(e,t)}static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=IB(r),n=1e3*(NB(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const MB=AdRenderTime=CB(AdRenderTime),PB=oi,{auditNotApplicable:OB,runWarning:FB}=PO.exports,{Audit:UB}=XF,jB={title:"Latency of first ad render",failureTitle:"Reduce time to render first ad",
1161
+ description:"This metric measures the time for the first ad iframe to render from page navigation. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/first-ad-render).",displayValue:"{timeInMs, number, seconds} s"},BB=PB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js",jB);RB.exports=class FirstAdRender extends UB{static get meta(){return{id:"first-ad-render",title:BB(jB.title),failureTitle:BB(jB.failureTitle),description:BB(jB.description),scoreDisplayMode:UB.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:12900,median:22e3},provided:{p10:2750,median:3700}}}static async audit(e,t){const r=e.traces[UB.DEFAULT_PASS],a={devtoolsLog:e.devtoolsLogs[UB.DEFAULT_PASS],trace:r,settings:t.settings},{timing:n}=await MB.request(a,t);if(!(n>0)){const e=OB.NoAdRendered;return e.runWarnings=[FB.NoAdRendered],e}
1162
+ const i=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"];return{numericValue:n,numericUnit:"millisecond",score:UB.computeLogNormalScore(i,n),displayValue:BB(jB.displayValue,{timeInMs:n})}}},RB.exports.UIStrings=jB;var $B={exports:{}};const qB=oi,zB=Lo,{auditNotApplicable:VB}=PO.exports,{Audit:WB}=XF,{isAdRequest:GB}=mF,{URL:HB}=Gn,YB={title:"Ad slots effectively use horizontal space",failureTitle:"Increase the width of ad slots",description:"Ad slots that utilize most of the page width generally experience increased click-through rate over smaller ad sizes. We recommend leaving no more than 25% of the viewport width unutilized on mobile devices.",failureDisplayValue:"{percentUnused, number, percent} of viewport width is underutilized"},KB=qB.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js",YB);$B.exports=class FullWidthSlots extends WB{static get meta(){return{id:"full-width-slots",title:KB(YB.title),
1163
+ failureTitle:KB(YB.failureTitle),description:KB(YB.description),requiredArtifacts:["ViewportDimensions","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[WB.DEFAULT_PASS],a=await zB.request(r,t),n=e.ViewportDimensions.innerWidth,i=a.filter(GB).map((e=>new HB(e.url)));if(!i.length)return VB.NoAds;const o=i.map((e=>e.searchParams.get("prev_iu_szs")||e.searchParams.get("sz"))).join("|").split(/[|,]/).map((e=>parseInt(e.split("x")[0]))).filter((e=>e<=n&&e>1));if(!o.length)return VB.NoValidAdWidths;const s=1-Math.max(...o)/n,c=s>.25?0:1;return{score:c,numericValue:s,numericUnit:"unitless",displayValue:c?"":KB(YB.failureDisplayValue,{percentUnused:s})}}},$B.exports.UIStrings=YB;var JB={exports:{}};const XB=Lo,{assert:ZB}=SU,{auditNotApplicable:QB}=PO.exports,{Audit:e$}=XF,{getCriticalGraph:t$}=MU,{getTimingsByRecord:r$}=NF,{isGptImplTag:a$,isBidRequest:n$,getHeaderBidder:i$}=mF,o$={title:"GPT and bids loaded in parallel",failureTitle:"Load GPT and bids in parallel",
1164
+ description:"To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`. [Learn More](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-bids-parallel).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},s$=[{key:"bidder",itemType:"text",text:o$.columnBidder},{key:"url",itemType:"url",text:o$.columnUrl},{key:"startTime",itemType:"ms",text:o$.columnStartTime},{key:"duration",itemType:"ms",text:o$.columnDuration}];class GptBidsInParallel extends e${static get meta(){return{id:"gpt-bids-parallel",title:o$.title,failureTitle:o$.failureTitle,description:o$.description,requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){const r=e.devtoolsLogs[e$.DEFAULT_PASS],a=e.traces[e$.DEFAULT_PASS],n=await XB.request(r,t),i=n.find((e=>a$(e.url)));if(!i)return QB.NoGpt
1165
+ ;const o=n.filter(n$).filter((e=>e.frameId==i.frameId));if(!o.length)return QB.NoBids;const s=await r$(a,r,t),c=[],l=new Set;for(const e of o)if(t$(n,a.traceEvents,e).has(i)){const{startTime:t,endTime:r}=s.get(e)||e,a=ZB(i$(e.url));if(l.has(a))continue;l.add(a),c.push({bidder:a,url:e.url,startTime:t,duration:r-t})}const u=c.length>0;return{numericValue:c.length,numericUnit:"unitless",score:u?0:1,details:u?GptBidsInParallel.makeTableDetails(s$,c):void 0}}}JB.exports=GptBidsInParallel,JB.exports.UIStrings=o$;var c$={exports:{}};const l$=oi,u$=Lo,{auditNotApplicable:d$}=PO.exports,{Audit:m$}=XF,{isGptTag:p$}=mF,{URL:h$}=Gn,g$={title:"GPT tag is loaded from an official source",failureTitle:"Load GPT from an official source",description:"Load GPT from 'securepubads.g.doubleclick.net' for standard integrations or from 'pagead2.googlesyndication.com' for limited ads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-official-source)."
1166
+ },f$=l$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source.js",g$);c$.exports=class LoadsGptFromOfficalSource extends m${static get meta(){return{id:"loads-gpt-from-official-source",title:f$(g$.title),failureTitle:f$(g$.failureTitle),description:f$(g$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[m$.DEFAULT_PASS],a=(await u$.request(r,t)).map((e=>new h$(e.url))).find(p$);if(!a)return d$.NoGpt;const n=["securepubads.g.doubleclick.net","pagead2.googlesyndication.com"].includes(a.host);return{score:Number(n),numericValue:Number(!n),numericUnit:"unitless"}}},c$.exports.UIStrings=g$;var y$={exports:{}};const v$=oi,b$=Lo,{auditNotApplicable:w$}=PO.exports,{Audit:S$}=XF,{isAdTag:T$}=mF,{URL:E$}=Gn,x$={title:"Ad tag is loaded over HTTPS",failureTitle:"Load ad tag over HTTPS",
1167
+ description:'For privacy and security, always load GPT/AdSense over HTTPS. Insecure pages should explicitly request the ad script securely. GPT Example: `<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js">` AdSense Example: `<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">`. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https).'},_$=v$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js",x$);y$.exports=class LoadsAdTagOverHttps extends S${static get meta(){return{id:"loads-ad-tag-over-https",title:_$(x$.title),failureTitle:_$(x$.failureTitle),description:_$(x$.description),requiredArtifacts:["devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[S$.DEFAULT_PASS],a=await b$.request(r,t);if(!a.find((e=>200==e.statusCode)))return w$.NoRecords;const n=a.filter((e=>T$(new E$(e.url)))),i=n.filter((e=>e.isSecure)),o={
1168
+ type:"debugdata",numAdTagHttpReqs:n.length-i.length,numAdTagHttpsReqs:i.length};if(!n.length){const e=w$.NoTag;return e.details=o,e}return{numericValue:o.numAdTagHttpReqs,score:o.numAdTagHttpReqs?0:1,details:o}}},y$.exports.UIStrings=x$;var A$={exports:{}};const R$=Cj,k$=oi,D$=eb,{auditNotApplicable:C$}=PO.exports,{Audit:I$}=XF,{computeAdRequestWaterfall:N$}=MU,{getScriptEvaluationTimes:L$}=NF,M$={title:"Ad scripts are loaded statically",failureTitle:"Load ad scripts statically",description:"Load the following scripts directly with `<script async src=...>` instead of injecting scripts with JavaScript. Doing so allows the browser to preload scripts sooner. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags).",failureDisplayValue:"Load {tags, plural, =1 {1 script} other {# scripts}} statically",columnUrl:"Script",columnLoadTime:"Load Time"
1169
+ },P$=k$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js",M$),O$=[{key:"url",itemType:"url",text:P$(M$.columnUrl)},{key:"loadTime",itemType:"ms",granularity:1,text:P$(M$.columnLoadTime)}],F$=[/amazon-adsystem\.com\/aax2\/apstag.js/,/js-sec\.indexww\.com\/ht\/p\/.*\.js/,/pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,/static\.criteo\.net\/js\/.*\/publishertag\.js/,/www\.googletagservices\.com\/tag\/js\/gpt\.js/,/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/,/cdn\.ampproject\.org\/v0\/amp-ad-\d+\.\d+\.js/];function initiatedByInlineScript(e){if("script"!==e.initiator.type)return!1;const t=D$.getNetworkInitiators(e);return 1===t.length&&t[0]===e.documentURL}class StaticAdTags extends I${static get meta(){return{id:"script-injected-tags",title:P$(M$.title),failureTitle:P$(M$.failureTitle),description:P$(M$.description),requiredArtifacts:["devtoolsLogs","traces"]}}static async audit(e,t){
1170
+ const r=await async function findStaticallyLoadableTags(e,t){const r=e.devtoolsLogs[I$.DEFAULT_PASS],a=e.traces[I$.DEFAULT_PASS],n=[],i=await N$(a,r,t);for(const{record:e}of i)e&&"Script"===e.resourceType&&(initiatedByInlineScript(e)||F$.find((t=>e.url.match(t))))&&n.push(e);return n}(e,t);if(!r.length)return C$.NoTag;const a=new Set,n=[],i=e.devtoolsLogs[I$.DEFAULT_PASS],o=e.traces[I$.DEFAULT_PASS],s=await L$(o,i,t);for(const e of r){if(a.has(e.url))continue;a.add(e.url);const t=r.filter((t=>t.url===e.url));if(0===R$.count(t,(e=>"parser"===e.initiator.type&&!e.isLinkPreload))){const t=s.get(e.url)||0;if(t<400)continue;n.push({url:e.url,loadTime:t})}}n.sort(((e,t)=>e.loadTime-t.loadTime));const c=n.length>0;return{displayValue:c?P$(M$.failureDisplayValue,{tags:n.length}):"",score:Number(!c),numericValue:n.length,numericUnit:"unitless",details:StaticAdTags.makeTableDetails(O$,n)}}}A$.exports=StaticAdTags,A$.exports.UIStrings=M$;var U$={exports:{}}
1171
+ ;const j$=jF,B$=oi,$$=HT,q$=Lo,{auditNotApplicable:z$}=PO.exports,{Audit:V$}=XF,{bucket:W$}=Cj,{getTimingsByRecord:G$}=NF,{isCacheable:H$}=sF,{isGoogleAds:Y$,getHeaderBidder:K$}=mF,{URL:J$}=Gn,X$={title:"Header bidding is parallelized",failureTitle:"Parallelize bid requests",description:"Send header bidding requests simultaneously, rather than serially, to retrieve bids more quickly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding).",columnBidder:"Bidder",columnUrl:"URL",columnStartTime:"Start",columnDuration:"Duration"},Z$=B$.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js",X$),Q$=[{key:"bidder",itemType:"text",text:Z$(X$.columnBidder)},{key:"url",itemType:"url",text:Z$(X$.columnUrl)},{key:"startTime",itemType:"ms",text:Z$(X$.columnStartTime)},{key:"duration",itemType:"ms",text:Z$(X$.columnDuration)}],tq="ad",rq="bid",aq="unknown";function checkRecordType(e){
1172
+ return Y$(new J$(e.url))?tq:K$(e.url)?rq:aq}function isPossibleBid(e){return(null==e.resourceSize||e.resourceSize>0)&&"Image"!=e.resourceType&&e.endTime-e.startTime>=.05&&!H$(e)}function clearQueryString(e){const t=new J$(e);return t.search="",t.toString()}class SerialHeaderBidding extends V${static get meta(){return{id:"serial-header-bidding",title:Z$(X$.title),failureTitle:Z$(X$.failureTitle),description:Z$(X$.description),requiredArtifacts:["devtoolsLogs","traces","URL"]}}static async audit(e,t){const r=e.devtoolsLogs[V$.DEFAULT_PASS],a=e.traces[V$.DEFAULT_PASS],n=await q$.request(r,t);if(!n.length)return z$.NoRecords;const i=await $$.request({URL:e.URL,devtoolsLog:r},t),o=n.filter(isPossibleBid).filter((e=>e.frameId==i.frameId)),s=W$(o,checkRecordType);if(!s.has(rq))return z$.NoBids;const c={trace:a,devtoolsLog:r,settings:t.settings},{timing:l}=await j$.request(c,t),u=await G$(a,r,t),d=function constructRecords(e,t,r){const a=[];for(const n of e){const e=r.get(n)
1173
+ ;e&&a.push(Object.assign({},e,{url:n.url,type:t}))}return a}(s.get(rq)||[],rq,u);let m,p=[];for(const e of d)l>0&&e.endTime>l||(e.bidder=K$(e.url),e.url=clearQueryString(e.url),m&&e.startTime>=m.endTime&&(p.push(m),p.push(e)),(!m||e.endTime<m.endTime||e.startTime>=m.endTime)&&(m=e));p=Array.from(new Set(p));const h=p.length>1;return{numericValue:Number(h),numericUnit:"unitless",score:h?0:1,details:h?SerialHeaderBidding.makeTableDetails(Q$,p):void 0}}}U$.exports=SerialHeaderBidding,U$.exports.UIStrings=X$;var nq={exports:{}};const iq=TF,oq=Ew,sq=Ao,{getPageStartTime:cq,getTagEndTime:lq}=NF,{isImplTag:uq}=mF,{URL:dq}=Gn;class LanternTagLoadTime extends iq{static getEstimateFromSimulation(e,t){const{nodeTimings:r}=e;return{timeInMs:iq.findNetworkTiming(r,(e=>!!e.url&&uq(new dq(e.url)))).endTime,nodeTimings:r}}}LanternTagLoadTime=sq(LanternTagLoadTime);class TagLoadTime$1 extends oq{static async computeSimulatedMetric(e,t){return LanternTagLoadTime.request(e,t)}
1174
+ static async computeObservedMetric(e,t){const{networkRecords:r}=e,a=cq(r),n=1e3*(lq(r)-a);return Promise.resolve({timing:n})}static async request(e,t){throw Error("Not implemented -- class not decorated")}}const mq=TagLoadTime$1=sq(TagLoadTime$1),pq=oi,{auditNotApplicable:hq,runWarning:gq}=PO.exports,{Audit:fq}=XF,yq={title:"Tag load time",failureTitle:"Reduce tag load time",description:"This metric measures the time for the ad tag's implementation script (pubads_impl.js for GPT; adsbygoogle.js for AdSense) to load after the page loads. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/tag-load-time).",displayValue:"{timeInMs, number, seconds} s"},vq=pq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js",yq);nq.exports=class TagLoadTime extends fq{static get meta(){return{id:"tag-load-time",title:vq(yq.title),failureTitle:vq(yq.failureTitle),description:vq(yq.description),
1175
+ scoreDisplayMode:fq.SCORING_MODES.NUMERIC,requiredArtifacts:["devtoolsLogs","traces"]}}static get defaultOptions(){return{simulate:{p10:4350,median:8e3},provided:{p10:1200,median:2e3}}}static async audit(e,t){const r={trace:e.traces[fq.DEFAULT_PASS],devtoolsLog:e.devtoolsLogs[fq.DEFAULT_PASS],settings:t.settings},a=t.options["provided"==t.settings.throttlingMethod?"provided":"simulate"],{timing:n}=await mq.request(r,t);if(!(n>0)){const e=hq.NoTag;return e.runWarnings=[gq.NoTag],e}return{numericValue:n,numericUnit:"millisecond",score:fq.computeLogNormalScore(a,n),displayValue:vq(yq.displayValue,{timeInMs:n})}}},nq.exports.UIStrings=yq;var bq={exports:{}};const wq=oi,{auditNotApplicable:Sq,auditError:Tq}=PO.exports,{Audit:Eq}=XF,{isAdIframe:xq}=mF,_q={title:"Ads to page-height ratio is within recommended range",failureTitle:"Reduce ads to page-height ratio",
1176
+ description:"The ads to page-height ratio can impact user experience and ultimately user retention. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density).",displayValue:"{adDensity, number, percent} ads to page-height ratio"},Aq=wq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js",_q);bq.exports=class ViewportAdDensity extends Eq{static get meta(){return{id:"viewport-ad-density",title:Aq(_q.title),failureTitle:Aq(_q.failureTitle),description:Aq(_q.description),requiredArtifacts:["ViewportDimensions","IFrameElements"]}}static audit(e){const t=e.ViewportDimensions,r=e.IFrameElements.filter((e=>xq(e)&&e.clientRect.width*e.clientRect.height>1));if(!r.length)return Sq.NoVisibleSlots;if(t.innerHeight<=0)throw new Error(Tq.ViewportAreaZero);const a=function computeAdLength(e,t){
1177
+ const r=new Set([...e.map((e=>e.clientRect.left)),...e.map((e=>e.clientRect.right))].map((e=>Math.min(Math.max(1,e),t.innerWidth-1))));e=e.sort(((e,t)=>e.clientRect.top!==t.clientRect.top?e.clientRect.top-t.clientRect.top:e.clientRect.bottom-t.clientRect.bottom));let a=0;for(const t of r){let r=0,n=0;for(const a of e){if(t<a.clientRect.left||t>a.clientRect.right)continue;if(a.isPositionFixed){r+=a.clientRect.height;continue}const e=a.clientRect.bottom-Math.max(n,a.clientRect.top);e>0&&(r+=e),n=Math.max(n,a.clientRect.bottom)}a=Math.max(a,r)}return a}(r,t),n=Math.max(...r.map((e=>e.clientRect.top+e.clientRect.height/2)))+t.innerHeight,i=Math.min(1,a/n);return{score:i>.3?0:1,numericValue:i,numericUnit:"unitless",displayValue:Aq(_q.displayValue,{adDensity:i})}}},bq.exports.UIStrings=_q;var Rq={exports:{}};const kq=oi,{auditNotApplicable:Dq}=PO.exports,{Audit:Cq}=XF,{getScriptUrl:Iq}=NF,{isAdIframe:Nq,isAdRelated:Lq,isImplTag:Mq}=mF,{overlaps:Pq,toClientRect:Oq}=wj,Fq={
1178
+ title:"Cumulative ad shift",failureTitle:"Reduce ad-related layout shift",description:"Measures layout shifts that were caused by ads or happened near ads. Reducing cumulative ad-related layout shift will improve user experience. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/cumulative-ad-shift)."},Uq=kq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift.js",Fq);Rq.exports=class CumulativeAdShift extends Cq{static get meta(){return{id:"cumulative-ad-shift",title:Uq(Fq.title),failureTitle:Uq(Fq.failureTitle),description:Uq(Fq.description),scoreDisplayMode:Cq.SCORING_MODES.NUMERIC,requiredArtifacts:["traces","IFrameElements"]}}static get defaultOptions(){return{p10:.05,median:.25}}static isAdExpansion(e,t){if(!e.args||!e.args.data)return!1;for(const r of e.args.data.impacted_nodes||[]){const e=Oq(r.old_rect||[]),a=Oq(r.new_rect||[]);if(!(e.top>a.top||e.height!==a.height))for(const r of t){
1179
+ const t=r.clientRect;if((e.top>=t.top||a.top>=t.bottom)&&Pq(e,t))return!0}}return!1}static isAttributableToTask(e,t){if(!e.args||!e.args.data)return!1;return!!t.find((t=>t.ts<e.ts&&e.ts-t.ts<5e4))}static compute(e,t,r,a){let n=0,i=0,o=0,s=0,c=0,l=0;for(const u of e)u.args&&u.args.data&&u.args.data.is_main_frame&&(n+=u.args.data.score,i++,(this.isAdExpansion(u,r)||this.isAttributableToTask(u,t))&&(o+=u.args.data.score,s++,u.ts<a&&(c+=u.args.data.score,l++)));return{cumulativeShift:n,numShifts:i,cumulativeAdShift:o,numAdShifts:s,cumulativePreImplTagAdShift:c,numPreImplTagAdShifts:l}}static getLayoutShiftEventsByWindow(e){let t=0,r=[],a=0,n=[];for(const i of e){if("LayoutShift"!==i.name||!i.args||!i.args.data)continue;if(n.length){const e=n[0],o=n[n.length-1];(o.ts-e.ts>5e6||i.ts-o.ts>1e6)&&(a>t&&(r=n,t=a),n=[],a=0)}n.push(i);const e=i.args.data;a+=e.weighted_score_delta||e.score||0}return r.length||(r=n),r}static async audit(e,t){
1180
+ const r=e.traces[Cq.DEFAULT_PASS],a=this.getLayoutShiftEventsByWindow(r.traceEvents);if(!a.length)return Dq.NoLayoutShifts;const n=r.traceEvents.filter((e=>Lq(Iq(e)||""))),i=n.find((e=>Mq(Iq(e)||"")))||{ts:1/0},o=e.IFrameElements.filter(Nq),s=this.compute(a,n,o,i.ts),c=s.cumulativeAdShift;return o.length||c?{numericValue:c,numericUnit:"unitless",score:Cq.computeLogNormalScore({p10:t.options.p10,median:t.options.median},c),displayValue:c.toLocaleString(t.settings.locale),details:s}:Dq.NoAdRendered}},Rq.exports.UIStrings=Fq;var jq={exports:{}};const Bq=oi,$q=Lo,{auditNotApplicable:qq}=PO.exports,{Audit:zq}=XF,{isGpt:Vq,isGptImplTag:Wq}=mF,Gq={title:"Deprecated GPT API Usage",failureTitle:"Avoid deprecated GPT APIs",description:"Deprecated GPT API methods should be avoided to ensure your page is tagged correctly. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/deprecated-gpt-api-usage).",
1181
+ displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},Hq=Bq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/deprecated-api-usage.js",Gq);jq.exports=class DeprecatedApiUsage extends zq{static get meta(){return{id:"deprecated-gpt-api-usage",title:Hq(Gq.title),failureTitle:Hq(Gq.failureTitle),description:Hq(Gq.description),scoreDisplayMode:"informative",requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[zq.DEFAULT_PASS];if(!(await $q.request(r,t)).find((e=>Wq(e.url))))return qq.NoGpt;const a=e.ConsoleMessages.filter((e=>"warning"===e.level||"error"===e.level)).filter((e=>e.url&&Vq(e.url))).filter((e=>e.text.toLowerCase().includes("deprecated")||e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:Hq(Bq.UIStrings.columnURL)},{
1182
+ key:"description",itemType:"code",text:Hq(Bq.UIStrings.columnDescription)}],i=zq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:Hq(Gq.displayValue,{numErrors:o})}}},jq.exports.UIStrings=Gq;var Yq={exports:{}};const Kq=oi,Jq=Lo,{auditNotApplicable:Xq}=PO.exports,{Audit:Zq}=XF,{isGpt:Qq,isGptImplTag:ez}=mF,tz={title:"GPT Errors",failureTitle:"Fix GPT errors",description:"Fix GPT errors to ensure your page is tagged as intended. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/gpt-errors-overall).",displayValue:"{numErrors, plural, =1 {1 error} other {# errors}} found"},rz=Kq.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/gpt-errors-overall.js",tz);Yq.exports=class GptErrorsOverall extends Zq{static get meta(){return{id:"gpt-errors-overall",title:rz(tz.title),failureTitle:rz(tz.failureTitle),description:rz(tz.description),scoreDisplayMode:"informative",
1183
+ requiredArtifacts:["ConsoleMessages","devtoolsLogs"]}}static async audit(e,t){const r=e.devtoolsLogs[Zq.DEFAULT_PASS];if(!(await Jq.request(r,t)).find((e=>ez(e.url))))return Xq.NoGpt;const a=e.ConsoleMessages.filter((e=>"error"===e.level||"warning"===e.level)).filter((e=>e.url&&Qq(e.url))).filter((e=>!e.text.toLowerCase().includes("deprecated")&&!e.text.toLowerCase().includes("discouraged"))).map((e=>({source:e.source,description:e.text,url:e.url,timestamp:e.timestamp}))).sort(((e,t)=>(e.timestamp||0)-(t.timestamp||0))),n=[{key:"url",itemType:"url",text:rz(Kq.UIStrings.columnURL)},{key:"description",itemType:"code",text:rz(Kq.UIStrings.columnDescription)}],i=Zq.makeTableDetails(n,a),o=a.length;return{score:Number(0===o),details:i,displayValue:rz(tz.displayValue,{numErrors:o})}}},Yq.exports.UIStrings=tz;var az={exports:{}};const nz=oi,iz=JF,oz=Lo,{auditNotApplicable:sz}=PO.exports,{Audit:cz}=XF,{getAttributableUrl:lz}=BF,{isAdRelated:uz,getNameOrTld:dz}=mF,mz={
1184
+ title:"Total ad JS blocking time",failureTitle:"Reduce ad JS blocking time",description:"Ad-related scripts are blocking the main thread. [Learn more](https://developers.google.com/publisher-ads-audits/reference/audits/total-ad-blocking-time).",failureDisplayValue:"{timeInMs, number, seconds} s blocked",columnName:"Name",columnBlockingTime:"Blocking Time"},pz=nz.createMessageInstanceIdFn("node_modules/lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time.js",mz),hz=[{key:"name",itemType:"text",text:pz(mz.columnName)},{key:"blockingTime",itemType:"ms",text:pz(mz.columnBlockingTime),granularity:1}];class TotalAdBlockingTime extends cz{static get meta(){return{id:"total-ad-blocking-time",title:pz(mz.title),failureTitle:pz(mz.failureTitle),description:pz(mz.description),requiredArtifacts:["traces","devtoolsLogs"]}}static get defaultOptions(){return{simulate:{p10:290,median:600},provided:{p10:150,median:350}}}static async audit(e,t){
1185
+ const r=e.traces[cz.DEFAULT_PASS],a=e.devtoolsLogs[cz.DEFAULT_PASS];if(!(await oz.request(a,t)).find((e=>uz(e.url))))return sz.NoAdRelatedReq;const n={trace:r,devtoolsLog:a,settings:t.settings};let i=[];try{i=await iz.request(n,t)}catch(e){return sz.InvalidTiming}let o=0;const s=new Map;for(const e of i){const t=lz(e);if(!t||!uz(t))continue;if(e.parent)continue;const r=e.duration-50;o+=r;const a=dz(t),n=s.get(a)||0;s.set(a,n+r)}const c=[];for(const[e,t]of s.entries())c.push({name:e,blockingTime:t});c.sort(((e,t)=>t.blockingTime-e.blockingTime));const l=t.options[t.settings.throttlingMethod]||t.options.provided;return{score:cz.computeLogNormalScore(l,o),numericValue:o,numericUnit:"millisecond",displayValue:pz(mz.failureDisplayValue,{timeInMs:o}),details:TotalAdBlockingTime.makeTableDetails(hz,c)}}}az.exports=TotalAdBlockingTime,az.exports.UIStrings=mz;const gz=bn,fz=la,yz=mn,vz=Tu,bz=xu,wz=pu,Sz=oi,Tz=Su;function isBundledEnvironment(){
1186
+ if(globalThis.isDevtools||globalThis.isLightrider)return!0;try{return require.resolve("lighthouse-logger"),!1}catch(e){return!0}}const mergeOptionsOfItems=function(e){const t=[];for(const r of e){const e=r.path&&t.find((e=>e.path===r.path));e?e.options=Object.assign({},e.options,r.options):t.push(r)}return t};const Ez=function _mergeConfigFragment(e,t,r=!1){if(null==e)return t;if(void 0===t)return e;if(Array.isArray(t)){if(r)return t;if(!Array.isArray(e))throw new TypeError("Expected array but got "+typeof e);const a=e.slice();return t.forEach((e=>{a.some((t=>fz(t,e)))||a.push(e)})),a}if("object"==typeof t){if("object"!=typeof e)throw new TypeError("Expected object but got "+typeof e);if(Array.isArray(e))throw new TypeError("Expected object but got Array");return Object.keys(t).forEach((a=>{const n=r||"settings"===a&&"object"==typeof e[a];e[a]=_mergeConfigFragment(e[a],t[a],n)})),e}return t}
1187
+ ;const xz=new Map([["../gather/gatherers/accessibility",ku],["../gather/gatherers/anchor-elements",Lu],["../gather/gatherers/cache-contents",Pu],["../gather/gatherers/console-messages",Fu],["../gather/gatherers/css-usage",$u],["../gather/gatherers/devtools-log-compat",Vu],["../gather/gatherers/devtools-log",Ws],["../gather/gatherers/dobetterweb/doctype",Gu],["../gather/gatherers/dobetterweb/domstats",Ku],["../gather/gatherers/dobetterweb/optimized-images",nd],["../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste",sd],["../gather/gatherers/dobetterweb/response-compression",gm],["../gather/gatherers/dobetterweb/tags-blocking-first-paint",bm],["../gather/gatherers/full-page-screenshot",_m],["../gather/gatherers/global-listeners",Rm],["../gather/gatherers/iframe-elements",Cm],["../gather/gatherers/image-elements",Fm],["../gather/gatherers/inputs",Bm],["../gather/gatherers/inspector-issues",Vm],["../gather/gatherers/installability-errors",$s],["../gather/gatherers/js-usage",Gm],["../gather/gatherers/link-elements",ip],["../gather/gatherers/main-document-content",dp],["../gather/gatherers/meta-elements",hp],["../gather/gatherers/network-user-agent",Ys],["../gather/gatherers/script-elements",Tp],["../gather/gatherers/seo/embedded-content",_p],["../gather/gatherers/seo/font-size",Im.exports],["../gather/gatherers/seo/robots-txt",Rp],["../gather/gatherers/seo/tap-targets",Lp],["../gather/gatherers/service-worker",Op],["../gather/gatherers/source-maps",jp],["../gather/gatherers/stacks",Xs],["../gather/gatherers/trace-compat",qp],["../gather/gatherers/trace-elements",hh],["../gather/gatherers/trace",oo],["../gather/gatherers/viewport-dimensions",fh],["../gather/gatherers/web-app-manifest",Us],["../audits/accessibility/accesskeys",yh.exports],["../audits/accessibility/aria-allowed-attr",_h.exports],["../audits/accessibility/aria-command-name",Dh.exports],["../audits/accessibility/aria-hidden-body",Lh.exports],["../audits/accessibility/aria-hidden-focus",Fh.exports],["../audits/accessibility/aria-input-field-name",$h.exports],["../audits/accessibility/aria-meter-name",Wh.exports],["../audits/accessibility/aria-progressbar-name",Kh.exports],["../audits/accessibility/aria-required-attr",Qh.exports],["../audits/accessibility/aria-required-children",ag.exports],["../audits/accessibility/aria-required-parent",sg.exports],["../audits/accessibility/aria-roles",dg.exports],["../audits/accessibility/aria-toggle-field-name",gg.exports],["../audits/accessibility/aria-tooltip-name",bg.exports],["../audits/accessibility/aria-treeitem-name",Eg.exports],["../audits/accessibility/aria-valid-attr-value",Rg.exports],["../audits/accessibility/aria-valid-attr",Ig.exports],["../audits/accessibility/button-name",Pg.exports],["../audits/accessibility/bypass",jg.exports],["../audits/accessibility/color-contrast",zg.exports],["../audits/accessibility/definition-list",Hg.exports],["../audits/accessibility/dlitem",Xg.exports],["../audits/accessibility/document-title",tf.exports],["../audits/accessibility/duplicate-id-active",of.exports],["../audits/accessibility/duplicate-id-aria",uf.exports],["../audits/accessibility/form-field-multiple-labels",hf.exports],["../audits/accessibility/frame-title",vf.exports],["../audits/accessibility/heading-order",Tf.exports],["../audits/accessibility/html-has-lang",Af.exports],["../audits/accessibility/html-lang-valid",Cf.exports],["../audits/accessibility/image-alt",Mf.exports],["../audits/accessibility/input-image-alt",Uf.exports],["../audits/accessibility/label",qf.exports],["../audits/accessibility/link-name",Gf.exports],["../audits/accessibility/list",Jf.exports],["../audits/accessibility/listitem",ey.exports],["../audits/accessibility/manual/custom-controls-labels",sy],["../audits/accessibility/manual/custom-controls-roles",ly],["../audits/accessibility/manual/focus-traps",dy],["../audits/accessibility/manual/focusable-controls",py],["../audits/accessibility/manual/interactive-element-affordance",gy],["../audits/accessibility/manual/logical-tab-order",yy],["../audits/accessibility/manual/managed-focus",by],["../audits/accessibility/manual/offscreen-content-hidden",Sy],["../audits/accessibility/manual/use-landmarks",Ey],["../audits/accessibility/manual/visual-order-follows-dom",_y],["../audits/accessibility/meta-refresh",Ay.exports],["../audits/accessibility/meta-viewport",Cy.exports],["../audits/accessibility/object-alt",My.exports],["../audits/accessibility/tabindex",Uy.exports],["../audits/accessibility/td-headers-attr",qy.exports],["../audits/accessibility/th-has-data-cells",Gy.exports],["../audits/accessibility/valid-lang",Jy.exports],["../audits/accessibility/video-caption",ev.exports],["../audits/apple-touch-icon",nv.exports],["../audits/autocomplete",cv.exports],["../audits/bootup-time",yv.exports],["../audits/byte-efficiency/duplicated-javascript",Bv.exports],["../audits/byte-efficiency/efficient-animated-content",Jb.exports],["../audits/byte-efficiency/legacy-javascript",rw.exports],["../audits/byte-efficiency/modern-image-formats",mw.exports],["../audits/byte-efficiency/offscreen-images",vw.exports],["../audits/byte-efficiency/render-blocking-resources",zw.exports],["../audits/byte-efficiency/total-byte-weight",dS.exports],["../audits/byte-efficiency/unminified-css",vS.exports],["../audits/byte-efficiency/unminified-javascript",kS.exports],["../audits/byte-efficiency/unused-css-rules",PS.exports],["../audits/byte-efficiency/unused-javascript",$S.exports],["../audits/byte-efficiency/uses-long-cache-ttl",QS.exports],["../audits/byte-efficiency/uses-optimized-images",lT.exports],["../audits/byte-efficiency/uses-responsive-images-snapshot",gT.exports],["../audits/byte-efficiency/uses-responsive-images",fT.exports],["../audits/byte-efficiency/uses-text-compression",LT.exports],["../audits/content-width",jT.exports],["../audits/critical-request-chains",zT.exports],["../audits/csp-xss",aE.exports],["../audits/deprecations",tx.exports],["../audits/diagnostics",mx],["../audits/dobetterweb/charset",px.exports],["../audits/dobetterweb/doctype",Sx.exports],["../audits/dobetterweb/dom-size",_x.exports],["../audits/dobetterweb/geolocation-on-start",Cx.exports],["../audits/dobetterweb/inspector-issues",Ux.exports],["../audits/dobetterweb/js-libraries",qx.exports],["../audits/dobetterweb/no-document-write",Hx.exports],["../audits/dobetterweb/no-vulnerable-libraries",Zx.exports],["../audits/dobetterweb/notification-on-start",l_.exports],["../audits/dobetterweb/password-inputs-can-be-pasted-into",h_.exports],["../audits/dobetterweb/uses-http2",b_.exports],["../audits/dobetterweb/uses-passive-event-listeners",M_.exports],["../audits/errors-in-console",j_.exports],["../audits/final-screenshot",Z_],["../audits/font-display",Q_.exports],["../audits/full-page-screenshot",dA],["../audits/image-aspect-ratio",mA.exports],["../audits/image-size-responsive",vA.exports],["../audits/installable-manifest",xA.exports],["../audits/is-on-https",MA.exports],["../audits/largest-contentful-paint-element",qA.exports],["../audits/layout-shift-elements",HA.exports],["../audits/lcp-lazy-loaded",ZA.exports],["../audits/long-tasks",aR.exports],["../audits/main-thread-tasks",yR],["../audits/mainthread-work-breakdown",vR.exports],["../audits/manual/pwa-cross-browser",_R.exports],["../audits/manual/pwa-each-page-has-url",DR.exports],["../audits/manual/pwa-page-transitions",LR.exports],["../audits/maskable-icon",FR.exports],["../audits/metrics",MD],["../audits/metrics/cumulative-layout-shift",PD.exports],["../audits/metrics/experimental-interaction-to-next-paint",$D.exports],["../audits/metrics/first-contentful-paint-3g",JD],["../audits/metrics/first-contentful-paint",XD.exports],["../audits/metrics/first-meaningful-paint",aC.exports],["../audits/metrics/interactive",lC.exports],["../audits/metrics/largest-contentful-paint",gC.exports],["../audits/metrics/max-potential-fid",TC.exports],["../audits/metrics/speed-index",kC.exports],["../audits/metrics/total-blocking-time",MC.exports],["../audits/network-requests",VC],["../audits/network-rtt",WC.exports],["../audits/network-server-latency",ZC.exports],["../audits/no-unload-listeners",iI.exports],["../audits/non-composited-animations",dI.exports],["../audits/oopif-iframe-test-audit",{
1188
1188
  meta:{id:"oopif-iframe-test-audit",title:"IFrame Elements",failureTitle:"IFrame Elements",description:"Audit to force the inclusion of IFrameElements artifact",requiredArtifacts:["IFrameElements"]},audit:()=>({score:1})
1189
- }],["../audits/performance-budget",fI.exports],["../audits/predictive-perf",jI],["../audits/preload-fonts",BI.exports],["../audits/preload-lcp-image",YI.exports],["../audits/redirects",nN.exports],["../audits/resource-summary",hN.exports],["../audits/screenshot-thumbnails",RN],["../audits/script-treemap-data",NN],["../audits/seo/canonical",LN.exports],["../audits/seo/crawlable-anchors",jN.exports],["../audits/seo/font-size",zN.exports],["../audits/seo/hreflang",eL.exports],["../audits/seo/http-status-code",cL.exports],["../audits/seo/is-crawlable",hL.exports],["../audits/seo/link-text",EL.exports],["../audits/seo/manual/structured-data",DL.exports],["../audits/seo/meta-description",LL.exports],["../audits/seo/plugins",FL.exports],["../audits/seo/robots-txt",HL.exports],["../audits/seo/tap-targets",iM.exports],["../audits/server-response-time",wM.exports],["../audits/service-worker",kM.exports],["../audits/splash-screen",LM.exports],["../audits/themed-omnibox",BM.exports],["../audits/third-party-facades",GM.exports],["../audits/third-party-summary",HM.exports],["../audits/timing-budget",pP.exports],["../audits/unsized-images",SP.exports],["../audits/user-timings",RP.exports],["../audits/uses-rel-preconnect",OP.exports],["../audits/uses-rel-preload",JP.exports],["../audits/valid-source-maps",cO.exports],["../audits/viewport",hO.exports],["../audits/work-during-interaction",bO.exports],["lighthouse-plugin-publisher-ads",LO.exports],["lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks",$O.exports],["lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources",cU.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-critical-path",bU.exports],["lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start",$U.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start",rj.exports],["lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport",uj.exports],["lighthouse-plugin-publisher-ads/audits/ads-in-viewport",vj.exports],["lighthouse-plugin-publisher-ads/audits/async-ad-tags",kj.exports],["lighthouse-plugin-publisher-ads/audits/blocking-load-events",$j.exports],["lighthouse-plugin-publisher-ads/audits/bottleneck-requests",aB.exports],["lighthouse-plugin-publisher-ads/audits/duplicate-tags",pB.exports],["lighthouse-plugin-publisher-ads/audits/first-ad-render",AB.exports],["lighthouse-plugin-publisher-ads/audits/full-width-slots",BB.exports],["lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel",KB.exports],["lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source",s$.exports],["lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https",f$.exports],["lighthouse-plugin-publisher-ads/audits/script-injected-tags",_$.exports],["lighthouse-plugin-publisher-ads/audits/serial-header-bidding",F$.exports],["lighthouse-plugin-publisher-ads/audits/tag-load-time",aq.exports],["lighthouse-plugin-publisher-ads/audits/viewport-ad-density",vq.exports],["lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift",Aq.exports],["lighthouse-plugin-publisher-ads/audits/deprecated-api-usage",Uq.exports],["lighthouse-plugin-publisher-ads/audits/gpt-errors-overall",Hq.exports],["lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time",rz.exports]])
1190
- ;function requireWrapper(e){return Ez.get(e)||function commonjsRequire(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}(e)}function resolveModulePath(e,t,r){try{return require.resolve(e)}catch(e){}try{return require.resolve(e,{paths:[process.cwd()]})}catch(e){}const a=hz.resolve(process.cwd(),e);try{return require.resolve(a)}catch(e){}const n="Unable to locate "+(r?`${r}: `:"")+`\`${e}\`.\n Tried to require() from these locations:\n lighthouse-core/config\n ${a}`;if(!t)throw new Error(n);const i=hz.resolve(t,e);try{return require.resolve(i)}catch(e){}try{return require.resolve(e,{paths:[t]})}catch(e){}throw new Error(n+`\n ${i}`)}function shallowClone(e){return"object"==typeof e?Object.assign(Object.create(Object.getPrototypeOf(e)),e):e}function deepClone$2(e){return JSON.parse(JSON.stringify(e))}
1191
- var xz={deepClone:deepClone$2,deepCloneConfigJson:function deepCloneConfigJson$2(e){const t=deepClone$2(e);if(Array.isArray(t.passes)&&Array.isArray(e.passes))for(let r=0;r<t.passes.length;r++){t.passes[r].gatherers=(e.passes[r].gatherers||[]).map((e=>shallowClone(e)))}return Array.isArray(e.audits)&&(t.audits=e.audits.map((e=>shallowClone(e)))),Array.isArray(e.artifacts)&&(t.artifacts=e.artifacts.map((e=>({...e,gatherer:shallowClone(e.gatherer)})))),t},mergeConfigFragment:Tz,mergeConfigFragmentArrayByKey:function mergeConfigFragmentArrayByKey$1(e,t,r){const a=new Map,n=e||[];for(let e=0;e<n.length;e++){const t=n[e];a.set(r(t),{index:e,item:t})}for(const e of t||[]){const t=a.get(r(e));if(t){const r=t.item,a="object"==typeof e&&"object"==typeof r?Tz(r,e,!0):e;n[t.index]=a}else n.push(e)}return n},mergeOptionsOfItems,mergePlugins:function mergePlugins$2(e,t,r){const a=e.plugins||[],n=new Set([...a,...r?.plugins||[]]);for(const r of n){Sz.assertValidPluginName(e,r)
1192
- ;const a=requireWrapper(isBundledEnvironment()?r:resolveModulePath(r,t,"plugin")),n=vz.parsePlugin(a,r);e=Tz(e,n)}return e},resolveAuditsToDefns:function resolveAuditsToDefns$2(e,t){if(!e)return null;const r=bz.getAuditList(),a=e.map((e=>{const a=function expandAuditShorthand(e){if("string"==typeof e)return{path:e,options:{}};if("implementation"in e&&"function"==typeof e.implementation.audit)return e;if("path"in e&&"string"==typeof e.path)return e;if("audit"in e&&"function"==typeof e.audit)return{implementation:e,options:{}};throw new Error("Invalid Audit type "+JSON.stringify(e))}(e);let n;return n="implementation"in a?a.implementation:function requireAudit(e,t,r){const a=`${e}.js`;let n=`../audits/${e}`;if(!t.find((e=>e===a)))if(isBundledEnvironment())n=e;else{const t=resolveModulePath(e,r,"audit");n=hz.relative("lighthouse-core/config",t)}return requireWrapper(n)}(a.path,r,t),{implementation:n,path:a.path,options:a.options||{}}})),n=mergeOptionsOfItems(a)
1193
- ;return n.forEach((e=>Sz.assertValidAudit(e))),n},resolveGathererToDefn:function resolveGathererToDefn$2(e,t,r){const a=function expandGathererShorthand(e){if("string"==typeof e)return{path:e};if("implementation"in e||"instance"in e)return e;if("path"in e){if("string"!=typeof e.path)throw new Error("Invalid Gatherer type "+JSON.stringify(e));return e}if("function"==typeof e)return{implementation:e};if(e&&"function"==typeof e.beforePass)return{instance:e};throw new Error("Invalid Gatherer type "+JSON.stringify(e))}(e);if(a.instance)return{instance:a.instance,implementation:a.implementation,path:a.path};if(a.implementation){return{instance:new(0,a.implementation),implementation:a.implementation,path:a.path}}if(a.path){return function requireGatherer(e,t,r){const a=t.find((t=>t===`${e}.js`));let n=`../gather/gatherers/${e}`;a||(n=resolveModulePath(e,r,"gatherer"));const i=requireWrapper(n);return{instance:new i,implementation:i,path:e}}(a.path,t,r)}
1194
- throw new Error("Invalid expanded Gatherer: "+JSON.stringify(a))},resolveModulePath,resolveSettings:function resolveSettings$2(e={},t){const r=wz.lookupLocale(t?.locale||e.locale),{defaultSettings:a}=fz,n=Tz(deepClone$2(a),e,!0),i=Tz(n,function cleanFlagsForSettings(e={}){const t={};for(const r of Object.keys(e))r in fz.defaultSettings&&(t[r]=e[r]);return t}(t),!0);return i.budgets&&(i.budgets=yz.initializeBudget(i.budgets)),i.locale=r,!0===i.emulatedUserAgent&&(i.emulatedUserAgent=fz.userAgents[i.formFactor]),Sz.assertValidSettings(i),i}};const _z=gu.exports,Az=mn,Rz=Vn,kz=Su,Dz=on.default,Cz=bn,Iz=pu,{mergePlugins:Nz,mergeConfigFragment:Lz,resolveSettings:Mz,resolveAuditsToDefns:Pz,resolveGathererToDefn:Oz,deepClone:Fz,deepCloneConfigJson:Uz}=xz,jz=Object.keys({fetchTime:"",LighthouseRunWarnings:"",HostFormFactor:"",HostUserAgent:"",NetworkUserAgent:"",BenchmarkIndex:"",WebAppManifest:"",GatherContext:"",InstallabilityErrors:"",Stacks:"",traces:"",devtoolsLogs:"",settings:"",URL:"",
1195
- Timing:"",PageLoadError:""});class Config$1{constructor(e,t){const r={msg:"Create config",id:"lh:init:config"};Dz.time(r,"verbose");let a=t?.configPath;if(e||(e=_z,a=Cz.resolve("lighthouse-core/config","./default-config.js")),a&&!Cz.isAbsolute(a))throw new Error("configPath must be an absolute path.");if((e=Uz(e)).extends){if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");e=Config$1.extendConfigJSON(Uz(_z),e)}const n=a?Cz.dirname(a):void 0;e=Nz(e,n,t),t&&function assertValidFlags(e){if("devtools"===e.channel&&e.internalDisableDeviceScreenEmulation&&(e.formFactor=e.emulatedFormFactor,e.emulatedFormFactor=e.internalDisableDeviceScreenEmulation=void 0),e.emulatedFormFactor||e.internalDisableDeviceScreenEmulation)throw new Error("Invalid emulation flag. Emulation configuration changed in LH 7.0. See https://github.com/GoogleChrome/lighthouse/blob/master/docs/emulation.md")}(t)
1196
- ;const i=Mz(e.settings||{},t),o=Config$1.augmentPassesWithDefaults(e.passes);Config$1.adjustDefaultPassForThrottling(i,o);const s=Config$1.requireGatherers(o,n);this.settings=i,this.passes=s,this.audits=Config$1.requireAudits(e.audits,n),this.categories=e.categories||null,this.groups=e.groups||null,Config$1.filterConfigIfNeeded(this),function assertValidPasses(e,t){if(!Array.isArray(e))return;const r=Config$1.getGatherersRequestedByAudits(t),a=new Set(jz);e.forEach(((e,t)=>{0===t&&"fatal"!==e.loadFailureMode&&(Dz.warn(`"${e.passName}" is the first pass but was marked as non-fatal. The first pass will always be treated as loadFailureMode=fatal.`),e.loadFailureMode="fatal"),e.gatherers.forEach((e=>{const t=e.instance;if(a.add(t.name),!r.has(t.name)){const e=`${t.name} gatherer requested, however no audit requires it.`;Dz.warn("config",e)}}))}));for(const e of t||[]){const t=e.implementation.meta
1197
- ;for(const e of t.requiredArtifacts)if(!a.has(e))throw new Error(`${e} gatherer, required by audit ${t.id}, was not found in config.`)}const n=new Set;e.forEach((e=>{const t=e.passName;if(n.has(t))throw new Error(`Passes must have unique names (repeated passName: ${t}.`);n.add(t)}))}(this.passes,this.audits),kz.assertValidCategories(this.categories,this.audits,this.groups),Dz.timeEnd(r)}getPrintString(){const e=Fz(this);if(e.passes)for(const t of e.passes)for(const e of t.gatherers)e.implementation=void 0,e.instance=void 0;if(e.audits)for(const t of e.audits)t.implementation=void 0,0===Object.keys(t.options).length&&(t.options=void 0);return Rz.replaceIcuMessages(e,e.settings.locale),JSON.stringify(e,null,2)}static extendConfigJSON(e,t){if(t.passes&&e.passes){for(const r of t.passes){const t=r.passName||Az.defaultPassConfig.passName,a=e.passes.find((e=>e.passName===t));a?Lz(a,r):e.passes.push(r)}delete t.passes}return Lz(e,t)}static augmentPassesWithDefaults(e){if(!e)return null
1198
- ;const{defaultPassConfig:t}=Az;return e.map((e=>Lz(Fz(t),e)))}static adjustDefaultPassForThrottling(e,t){if(!t||"devtools"!==e.throttlingMethod&&"provided"!==e.throttlingMethod)return;const r=t.find((e=>"defaultPass"===e.passName));if(!r)return;const a=Az.nonSimulatedPassConfigOverrides;r.pauseAfterFcpMs=Math.max(a.pauseAfterFcpMs,r.pauseAfterFcpMs),r.pauseAfterLoadMs=Math.max(a.pauseAfterLoadMs,r.pauseAfterLoadMs),r.cpuQuietThresholdMs=Math.max(a.cpuQuietThresholdMs,r.cpuQuietThresholdMs),r.networkQuietThresholdMs=Math.max(a.networkQuietThresholdMs,r.networkQuietThresholdMs)}static filterConfigIfNeeded(e){const t=e.settings;if(!t.onlyCategories&&!t.onlyAudits&&!t.skipAudits)return;const{categories:r,requestedAuditNames:a}=Config$1.filterCategoriesAndAudits(e.categories,t),n=e.audits&&e.audits.filter((e=>a.has(e.implementation.meta.id))),i=Config$1.getGatherersRequestedByAudits(n),o=Config$1.generatePassesNeededByGatherers(e.passes,i);e.categories=r,e.audits=n,e.passes=o}
1199
- static filterCategoriesAndAudits(e,t){if(!e)return{categories:null,requestedAuditNames:new Set};if(t.onlyAudits&&t.skipAudits)throw new Error("Cannot set both skipAudits and onlyAudits");const r={},a=!!t.onlyCategories,n=!!t.onlyAudits,i=t.onlyCategories||[],o=t.onlyAudits||[],s=t.skipAudits||[];i.forEach((t=>{e[t]||Dz.warn("config",`unrecognized category in 'onlyCategories': ${t}`)}));const c=new Set(o.concat(s));for(const t of c){const r=Object.keys(e).find((r=>!!e[r].auditRefs.find((e=>e.id===t))));if(r)o.includes(t)&&i.includes(r)&&Dz.warn("config",`${t} in 'onlyAudits' is already included by ${r} in 'onlyCategories'`);else{const e=s.includes(t)?"skipAudits":"onlyAudits";Dz.warn("config",`unrecognized audit in '${e}': ${t}`)}}const l=new Set(o);s.forEach((e=>l.delete(e))),Object.keys(e).forEach((t=>{const c=Fz(e[t]);if(a&&n)i.includes(t)||(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));else if(a){if(!i.includes(t))return
1200
- }else n&&(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));c.auditRefs=c.auditRefs.filter((e=>!s.includes(e.id))),c.auditRefs.length&&(r[t]=c,c.auditRefs.forEach((e=>l.add(e.id))))}));return t.skipAudits&&t.skipAudits.includes("full-page-screenshot")||!t.onlyCategories&&!t.skipAudits||l.add("full-page-screenshot"),{categories:r,requestedAuditNames:l}}static getGatherersRequestedByAudits(e){if(!e)return new Set;const t=new Set;for(const r of e){const{requiredArtifacts:e,__internalOptionalArtifacts:a}=r.implementation.meta;e.forEach((e=>t.add(e))),a&&a.forEach((e=>t.add(e)))}return t}static generatePassesNeededByGatherers(e,t){if(!e)return null;const r=t.has("traces");return e.map((e=>{if(e.gatherers=e.gatherers.filter((e=>{const r=e.instance;return t.has(r.name)})),e.recordTrace&&!r){const t=e.passName||"unknown pass";Dz.warn("config",`Trace not requested by an audit, dropping trace in ${t}`),e.recordTrace=!1}return e
1201
- })).filter((e=>!!e.recordTrace||("defaultPass"===e.passName||e.gatherers.length>0)))}static requireAudits(e,t){const r={msg:"Requiring audits",id:"lh:config:requireAudits"};Dz.time(r,"verbose");const a=Pz(e,t);return Dz.timeEnd(r),a}static requireGatherers(e,t){if(!e)return null;const r={msg:"Requiring gatherers",id:"lh:config:requireGatherers"};Dz.time(r,"verbose");const a=Iz.getGathererList(),n=e.map((e=>{const r=e.gatherers.map((e=>Oz(e,a,t))),n=Array.from(new Map(r.map((e=>[e.instance.name,e]))).values());return n.forEach((e=>function assertValidGatherer(e,t){if(t=t||e.name||"gatherer","function"!=typeof e.beforePass)throw new Error(`${t} has no beforePass() method.`);if("function"!=typeof e.pass)throw new Error(`${t} has no pass() method.`);if("function"!=typeof e.afterPass)throw new Error(`${t} has no afterPass() method.`)}(e.instance,e.path))),Object.assign(e,{gatherers:n})}));return Dz.timeEnd(r),n}}var Bz=Config$1;var $z=class Gatherer{get name(){return this.constructor.name}
1202
- beforePass(e){}pass(e){}afterPass(e,t){}};const qz=pu,zz=on.default,Vz=hu,Wz=Bz,Gz=ji;async function lighthouse(e,t={},r,a){t.logLevel=t.logLevel||"error",zz.setLevel(t.logLevel);const n={config:generateConfig(r,t),computedCache:new Map},i=a||new Vz(t.port,t.hostname),o=await qz.gather((()=>{const t=Gz.normalizeUrl(e);return qz._gatherArtifactsFromBrowser(t,n,i)}),n);return qz.audit(o,n)}function generateConfig(e,t){return new Wz(e,t)}lighthouse.generateConfig=generateConfig,lighthouse.getAuditList=qz.getAuditList,lighthouse.traceCategories=To.traceCategories,lighthouse.Audit=kc,lighthouse.Gatherer=$z,lighthouse.NetworkRecords=Lo;var Hz=lighthouse;const Yz=vi.exports,Kz=Symbol("monkeypatch");class ProtocolSession$1{constructor(e){this._session=e,this._targetInfo=void 0,this._nextProtocolTimeout=void 0,this._callbackMap=new WeakMap;const t=e.emit;t[Kz]||(e.emit=(r,...a)=>{const n=this._targetInfo&&"iframe"===this._targetInfo.type?this._targetInfo.targetId:void 0;return t.call(e,"*",{
1203
- method:r,params:a[0],sessionId:n}),t.call(e,r,...a)},e.emit[Kz]=!0)}setTargetInfo(e){this._targetInfo=e}hasNextProtocolTimeout(){return void 0!==this._nextProtocolTimeout}getNextProtocolTimeout(){return this._nextProtocolTimeout||3e4}setNextProtocolTimeout(e){this._nextProtocolTimeout=e}on(e,t){this._session.on(e,t)}once(e,t){this._session.once(e,t)}addSessionAttachedListener(e){const listener=t=>e(new ProtocolSession$1(t));this._callbackMap.set(e,listener),this._getConnection().on("sessionattached",listener)}removeSessionAttachedListener(e){const t=this._callbackMap.get(e);t&&this._getConnection().off("sessionattached",t)}addProtocolMessageListener(e){this._session.on("*",e)}removeProtocolMessageListener(e){this._session.off("*",e)}off(e,t){this._session.off(e,t)}sendCommand(e,...t){const r=this.getNextProtocolTimeout();let a;this._nextProtocolTimeout=void 0;const n=new Promise(((t,n)=>{r!==1/0&&(a=setTimeout(n,r,new Yz(Yz.errors.PROTOCOL_TIMEOUT,{protocolMethod:e})))
1204
- })),i=this._session.send(e,...t);return Promise.race([i,n]).finally((()=>{a&&clearTimeout(a)}))}async dispose(){this._session.removeAllListeners(),await this._session.detach()}_getConnection(){const e=this._session.connection();if(!e)throw new Error("Connection has been closed.");return e}}var Jz=ProtocolSession$1;const Xz=on.default,Zz=Jz,Qz=yi,eV=gi,throwNotConnectedFn=()=>{throw new Error("Session not connected")},tV={setTargetInfo:throwNotConnectedFn,hasNextProtocolTimeout:throwNotConnectedFn,getNextProtocolTimeout:throwNotConnectedFn,setNextProtocolTimeout:throwNotConnectedFn,on:throwNotConnectedFn,once:throwNotConnectedFn,off:throwNotConnectedFn,addProtocolMessageListener:throwNotConnectedFn,removeProtocolMessageListener:throwNotConnectedFn,addSessionAttachedListener:throwNotConnectedFn,removeSessionAttachedListener:throwNotConnectedFn,sendCommand:throwNotConnectedFn,dispose:throwNotConnectedFn};var rV=class Driver$3{constructor(e){this._page=e,this._session=void 0,
1205
- this._executionContext=void 0,this._fetcher=void 0,this.defaultSession=tV}get executionContext(){return this._executionContext?this._executionContext:throwNotConnectedFn()}get fetcher(){return this._fetcher?this._fetcher:throwNotConnectedFn()}async url(){return this._page.url()}async connect(){if(this._session)return;const e={msg:"Connecting to browser",id:"lh:driver:connect"};Xz.time(e);const t=await this._page.target().createCDPSession();this._session=this.defaultSession=new Zz(t),this._executionContext=new Qz(this._session),this._fetcher=new eV(this._session,this._executionContext),Xz.timeEnd(e)}async disconnect(){this._session&&await this._session.dispose()}};const aV=on.default;function createDependencyError(e,t){return new Error(`Dependency "${e.id}" failed with exception: ${t.message}`)}const nV={startInstrumentation:void 0,startSensitiveInstrumentation:"startInstrumentation",stopSensitiveInstrumentation:"startSensitiveInstrumentation",
1206
- stopInstrumentation:"stopSensitiveInstrumentation",getArtifact:"stopInstrumentation"};async function collectArtifactDependencies(e,t){if(!e.dependencies)return{};const r=Object.entries(e.dependencies).map((async([e,r])=>{const a=t[r.id];if(void 0===a)throw new Error(`"${r.id}" did not run`);if(a instanceof Error)throw createDependencyError(r,a);const n=Promise.resolve().then((()=>a)).catch((e=>Promise.reject(createDependencyError(r,e))));return[e,await n]}));return Object.fromEntries(await Promise.all(r))}var iV={getEmptyArtifactState:function getEmptyArtifactState$3(){return{startInstrumentation:{},startSensitiveInstrumentation:{},stopSensitiveInstrumentation:{},stopInstrumentation:{},getArtifact:{}}},awaitArtifacts:async function awaitArtifacts$3(e){const t={};for(const[r,a]of Object.entries(e.getArtifact)){const e=await a.catch((e=>e));void 0!==e&&(t[r]=e)}return t},collectPhaseArtifacts:async function collectPhaseArtifacts$3(e){
1207
- const{driver:t,artifactDefinitions:r,artifactState:a,baseArtifacts:n,phase:i,gatherMode:o,computedCache:s,settings:c,url:l}=e,u=nV[i],d=u&&a[u]||{};for(const e of r){aV["getArtifact"===i?"log":"verbose"](`artifacts:${i}`,e.id);const r=e.gatherer.instance,u=(d[e.id]||Promise.resolve()).then((async()=>{const u="getArtifact"===i?await collectArtifactDependencies(e,a.getArtifact):{};return r[i]({url:l,gatherMode:o,driver:t,baseArtifacts:n,dependencies:u,computedCache:s,settings:c})}));await u.catch((()=>{})),a[i][e.id]=u}},collectArtifactDependencies};const oV=gu.exports,sV=yu,{deepClone:cV}=xz,lV={performance:[{id:"uses-responsive-images-snapshot",weight:0},{id:"experimental-interaction-to-next-paint",weight:0,group:"metrics",acronym:"INP",relevantAudits:sV.inpRelevantAudits},{id:"work-during-interaction",weight:0}]};const uV={DevtoolsLog:"",Trace:"",Accessibility:"",AnchorElements:"",CacheContents:"",ConsoleMessages:"",CSSUsage:"",Doctype:"",DOMStats:"",EmbeddedContent:"",FontSize:"",
1208
- Inputs:"",FullPageScreenshot:"",GlobalListeners:"",IFrameElements:"",ImageElements:"",InstallabilityErrors:"",InspectorIssues:"",JsUsage:"",LinkElements:"",MainDocumentContent:"",MetaElements:"",NetworkUserAgent:"",OptimizedImages:"",PasswordInputsWithPreventedPaste:"",ResponseCompression:"",RobotsTxt:"",ServiceWorker:"",ScriptElements:"",SourceMaps:"",Stacks:"",TagsBlockingFirstPaint:"",TapTargets:"",TraceElements:"",ViewportDimensions:"",WebAppManifest:"",devtoolsLogs:"",traces:""};for(const e of Object.keys(uV))uV[e]=e;var dV={artifacts:[{id:uV.DevtoolsLog,gatherer:"devtools-log"},{id:uV.Trace,gatherer:"trace"},{id:uV.Accessibility,gatherer:"accessibility"},{id:uV.AnchorElements,gatherer:"anchor-elements"},{id:uV.CacheContents,gatherer:"cache-contents"},{id:uV.ConsoleMessages,gatherer:"console-messages"},{id:uV.CSSUsage,gatherer:"css-usage"},{id:uV.Doctype,gatherer:"dobetterweb/doctype"},{id:uV.DOMStats,gatherer:"dobetterweb/domstats"},{id:uV.EmbeddedContent,
1209
- gatherer:"seo/embedded-content"},{id:uV.FontSize,gatherer:"seo/font-size"},{id:uV.Inputs,gatherer:"inputs"},{id:uV.GlobalListeners,gatherer:"global-listeners"},{id:uV.IFrameElements,gatherer:"iframe-elements"},{id:uV.ImageElements,gatherer:"image-elements"},{id:uV.InstallabilityErrors,gatherer:"installability-errors"},{id:uV.InspectorIssues,gatherer:"inspector-issues"},{id:uV.JsUsage,gatherer:"js-usage"},{id:uV.LinkElements,gatherer:"link-elements"},{id:uV.MainDocumentContent,gatherer:"main-document-content"},{id:uV.MetaElements,gatherer:"meta-elements"},{id:uV.NetworkUserAgent,gatherer:"network-user-agent"},{id:uV.OptimizedImages,gatherer:"dobetterweb/optimized-images"},{id:uV.PasswordInputsWithPreventedPaste,gatherer:"dobetterweb/password-inputs-with-prevented-paste"},{id:uV.ResponseCompression,gatherer:"dobetterweb/response-compression"},{id:uV.RobotsTxt,gatherer:"seo/robots-txt"},{id:uV.ServiceWorker,gatherer:"service-worker"},{id:uV.ScriptElements,gatherer:"script-elements"},{
1210
- id:uV.SourceMaps,gatherer:"source-maps"},{id:uV.Stacks,gatherer:"stacks"},{id:uV.TagsBlockingFirstPaint,gatherer:"dobetterweb/tags-blocking-first-paint"},{id:uV.TapTargets,gatherer:"seo/tap-targets"},{id:uV.TraceElements,gatherer:"trace-elements"},{id:uV.ViewportDimensions,gatherer:"viewport-dimensions"},{id:uV.WebAppManifest,gatherer:"web-app-manifest"},{id:uV.devtoolsLogs,gatherer:"devtools-log-compat"},{id:uV.traces,gatherer:"trace-compat"},{id:uV.FullPageScreenshot,gatherer:"full-page-screenshot"}],navigations:[{id:"default",pauseAfterFcpMs:1e3,pauseAfterLoadMs:1e3,networkQuietThresholdMs:1e3,cpuQuietThresholdMs:1e3,
1211
- artifacts:[uV.DevtoolsLog,uV.Trace,uV.Accessibility,uV.AnchorElements,uV.CacheContents,uV.ConsoleMessages,uV.CSSUsage,uV.Doctype,uV.DOMStats,uV.EmbeddedContent,uV.FontSize,uV.Inputs,uV.GlobalListeners,uV.IFrameElements,uV.ImageElements,uV.InstallabilityErrors,uV.InspectorIssues,uV.JsUsage,uV.LinkElements,uV.MainDocumentContent,uV.MetaElements,uV.NetworkUserAgent,uV.OptimizedImages,uV.PasswordInputsWithPreventedPaste,uV.ResponseCompression,uV.RobotsTxt,uV.ServiceWorker,uV.ScriptElements,uV.SourceMaps,uV.Stacks,uV.TagsBlockingFirstPaint,uV.TapTargets,uV.TraceElements,uV.ViewportDimensions,uV.WebAppManifest,uV.devtoolsLogs,uV.traces,uV.FullPageScreenshot]}],settings:oV.settings,audits:[...(oV.audits||[]).map((e=>"string"==typeof e?{path:e}:e)),"byte-efficiency/uses-responsive-images-snapshot","metrics/experimental-interaction-to-next-paint","work-during-interaction"],categories:function mergeCategories(){if(!oV.categories)return{};const e=cV(oV.categories)
1212
- ;for(const t of Object.keys(lV))e[t]&&e[t].auditRefs.push(...lV[t]);return e}(),groups:oV.groups};const mV=on.default,pV=kc,hV=Object.keys({fetchTime:"",LighthouseRunWarnings:"",BenchmarkIndex:"",settings:"",Timing:"",URL:"",PageLoadError:"",HostFormFactor:"",HostUserAgent:"",GatherContext:""}),gV=["full-page-screenshot"],fV=["HostUserAgent","HostFormFactor","Stacks","GatherContext"];function getAuditIdsInCategories(e,t){if(!e)return new Set;const r=(t=t||Object.keys(e)).map((t=>e[t])).flatMap((e=>e?.auditRefs||[]));return new Set(r.map((e=>e.id)))}function filterArtifactsByAvailableAudits(e,t){if(!e)return null;if(!t)return e;const r=new Map(e.map((e=>[e.id,e]))),a=new Set([...fV,...t.flatMap((e=>e.implementation.meta.requiredArtifacts))]);let n=0;for(;n!==a.size;){n=a.size;for(const e of a){const t=r.get(e);if(t&&t.dependencies)for(const e of Object.values(t.dependencies))a.add(e.id)}}return e.filter((e=>a.has(e.id)))}function filterArtifactsByGatherMode(e,t){
1213
- return e?e.filter((e=>e.gatherer.instance.meta.supportedModes.includes(t))):null}function filterNavigationsByAvailableArtifacts(e,t){if(!e)return e;const r=new Set(t.map((e=>e.id)).concat(hV));return e.map((e=>({...e,artifacts:e.artifacts.filter((e=>r.has(e.id)))}))).filter((e=>e.artifacts.length))}function filterAuditsByAvailableArtifacts(e,t){if(!e)return null;const r=new Set(t.map((e=>e.id)).concat(hV));return e.filter((e=>e.implementation.meta.requiredArtifacts.every((e=>r.has(e)))))}function filterAuditsByGatherMode(e,t){return e?e.filter((e=>{const r=e.implementation.meta;return!r.supportedModes||r.supportedModes.includes(t)})):null}function filterCategoriesByGatherMode(e,t){if(!e)return null;const r=Object.entries(e).filter((([e,r])=>!r.supportedModes||r.supportedModes.includes(t)));return Object.fromEntries(r)}function filterCategoriesByExplicitFilters(e,t){if(!e||!t)return e;const r=Object.entries(e).filter((([e])=>t.includes(e)));return Object.fromEntries(r)}
1214
- function filterCategoriesByAvailableAudits(e,t){if(!e)return e;const r=new Map(t.map((e=>[e.implementation.meta.id,e.implementation.meta]))),a=Object.entries(e).map((([e,t])=>{const a={...t,auditRefs:t.auditRefs.filter((e=>r.has(e.id)))},n=a.auditRefs.length<t.auditRefs.length,i=a.auditRefs.every((e=>{const t=r.get(e.id);return!!t&&t.scoreDisplayMode===pV.SCORING_MODES.MANUAL}));return n&&i&&(a.auditRefs=[]),[e,a]})).filter((e=>"object"==typeof e[1]&&e[1].auditRefs.length));return Object.fromEntries(a)}var yV={filterConfigByGatherMode:function filterConfigByGatherMode$1(e,t){const r=filterArtifactsByGatherMode(e.artifacts,t),a=filterAuditsByAvailableArtifacts(filterAuditsByGatherMode(e.audits,t),r||[]),n=filterCategoriesByAvailableAudits(filterCategoriesByGatherMode(e.categories,t),a||[]);return{...e,artifacts:r,audits:a,categories:n}},filterConfigByExplicitFilters:function filterConfigByExplicitFilters$1(e,t){const{onlyAudits:r,onlyCategories:a,skipAudits:n}=t
1215
- ;!function warnOnUnknownOnlyCategories(e,t){if(t)for(const r of t)e?.[r]||mV.warn("config",`unrecognized category in 'onlyCategories': ${r}`)}(e.categories,a);let i=getAuditIdsInCategories(e.categories,void 0);a?i=getAuditIdsInCategories(e.categories,a):r&&(i=new Set);const o=new Set([...i,...r||[],...gV].filter((e=>!n||!n.includes(e)))),s=o.size&&e.audits?e.audits.filter((e=>o.has(e.implementation.meta.id))):e.audits,c=filterCategoriesByExplicitFilters(filterCategoriesByAvailableAudits(e.categories,s||[]),a),l=filterArtifactsByAvailableAudits(e.artifacts,s),u=filterNavigationsByAvailableArtifacts(e.navigations,l||[]);return{...e,artifacts:l,navigations:u,audits:s,categories:c}},filterArtifactsByGatherMode,filterArtifactsByAvailableAudits,filterNavigationsByAvailableArtifacts,filterAuditsByAvailableArtifacts,filterAuditsByGatherMode,filterCategoriesByAvailableAudits,filterCategoriesByExplicitFilters,filterCategoriesByGatherMode}
1216
- ;const vV=bn,bV=on.default,wV=pu,SV=dV,{defaultNavigationConfig:TV,nonSimulatedPassConfigOverrides:EV}=mn,{isFRGathererDefn:xV,throwInvalidDependencyOrder:_V,isValidArtifactDependency:AV,throwInvalidArtifactDependency:RV,assertArtifactTopologicalOrder:kV,assertValidConfig:DV}=Su,{filterConfigByGatherMode:CV,filterConfigByExplicitFilters:IV}=yV,{deepCloneConfigJson:NV,resolveSettings:LV,resolveAuditsToDefns:MV,resolveGathererToDefn:PV,mergePlugins:OV,mergeConfigFragment:FV,mergeConfigFragmentArrayByKey:UV}=xz,jV=vV.join("lighthouse-core/fraggle-rock/config","./default-config.js");function resolveWorkingCopy(e,t){let{configPath:r}=t;if(r&&!vV.isAbsolute(r))throw new Error("configPath must be an absolute path");e||(e=SV,r=jV);const a=r?vV.dirname(r):void 0;return{configWorkingCopy:NV(e),configPath:r,configDir:a}}function resolveArtifactDependencies(e,t,r){if(!("dependencies"in t.instance.meta))return;const a=Object.entries(t.instance.meta.dependencies).map((([a,n])=>{const i=r.get(n)
1217
- ;i||_V(e.id,a);return AV(t,i.gatherer)||RV(e.id,a),[a,{id:i.id}]}));return Object.fromEntries(a)}function resolveNavigationsToDefns(e,t,r){if(!e)return null;if(!t)throw new Error("Cannot use navigations without defining artifacts");const a={msg:"Resolve navigation definitions",id:"lh:config:resolveNavigationsToDefns"};bV.time(a,"verbose");const n=new Map(t.map((e=>[e.id,e]))),i=e.map((e=>{const t={...TV,...e},a=t.id,i=t.artifacts.map((e=>{const t=n.get(e);if(!t)throw new Error(`Unrecognized artifact "${e}" in navigation "${a}"`);return t})),o={...t,artifacts:i};return function overrideNavigationThrottlingWindows(e,t){e.disableThrottling||"simulate"!==t.throttlingMethod&&(e.cpuQuietThresholdMs=Math.max(e.cpuQuietThresholdMs||0,EV.cpuQuietThresholdMs),e.networkQuietThresholdMs=Math.max(e.networkQuietThresholdMs||0,EV.networkQuietThresholdMs),e.pauseAfterFcpMs=Math.max(e.pauseAfterFcpMs||0,EV.pauseAfterFcpMs),e.pauseAfterLoadMs=Math.max(e.pauseAfterLoadMs||0,EV.pauseAfterLoadMs))}(o,r),o
1218
- }));return kV(i),bV.timeEnd(a),i}var BV={resolveWorkingCopy,initializeConfig:function initializeConfig$4(e,t){const r={msg:"Initialize config",id:"lh:config"};bV.time(r,"verbose");let{configWorkingCopy:a,configDir:n}=resolveWorkingCopy(e,t);a=function resolveExtensions(e){if(!e.extends)return e;if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");const{artifacts:t,navigations:r,...a}=e,n=NV(SV),i=FV(n,a);return i.artifacts=UV(n.artifacts,t,(e=>e.id)),i.navigations=UV(n.navigations,r,(e=>e.id)),i}(a),a=OV(a,n,t.settingsOverrides);const i=LV(a.settings||{},t.settingsOverrides);!function overrideSettingsForGatherMode(e,t){"timespan"===t.gatherMode&&"simulate"===e.throttlingMethod&&(e.throttlingMethod="devtools")}(i,t);const o=function resolveArtifactsToDefns(e,t){if(!e)return null;const r={msg:"Resolve artifact definitions",id:"lh:config:resolveArtifactsToDefns"};bV.time(r,"verbose")
1219
- ;const a=new Map,n=wV.getGathererList(),i=e.map((e=>{const r=e.gatherer,i=PV(r,n,t);if(!xV(i))throw new Error(`${i.instance.name} gatherer does not have a Fraggle Rock meta obj`);const o={id:e.id,gatherer:i,dependencies:resolveArtifactDependencies(e,i,a)},s=o.gatherer.instance.meta.symbol;return s&&a.set(s,o),o}));return bV.timeEnd(r),i}(a.artifacts,n);let s={artifacts:o,navigations:resolveNavigationsToDefns(a.navigations,o,i),audits:MV(a.audits,n),categories:a.categories||null,groups:a.groups||null,settings:i};const{warnings:c}=DV(s);return s=CV(s,t.gatherMode),s=IV(s,i),bV.timeEnd(r),{config:s,warnings:c}}};const $V=on.default,qV=rV,zV=pu,{getEmptyArtifactState:VV,collectPhaseArtifacts:WV,awaitArtifacts:GV}=iV,{initializeConfig:HV}=BV,{getBaseArtifacts:YV,finalizeArtifacts:KV}=ac;var JV={snapshotGather:async function snapshotGather$2(e){const{configContext:t={}}=e;$V.setLevel(t.logLevel||"error");const{config:r}=HV(e.config,{...t,gatherMode:"snapshot"}),a=new qV(e.page)
1220
- ;await a.connect();const n=new Map,i=await a.url(),o={config:r,computedCache:n};return{artifacts:await zV.gather((async()=>{const e=await YV(r,a,{gatherMode:"snapshot"});e.URL.requestedUrl=i,e.URL.finalUrl=i;const t=r.artifacts||[],o=VV();await WV({url:i,phase:"getArtifact",gatherMode:"snapshot",driver:a,baseArtifacts:e,artifactDefinitions:t,artifactState:o,computedCache:n,settings:r.settings}),await a.disconnect();const s=await GV(o);return KV(e,s)}),o),runnerOptions:o}}};const XV=on.default,ZV=rV,QV=pu,{getEmptyArtifactState:eW,collectPhaseArtifacts:tW,awaitArtifacts:rW}=iV,{prepareTargetForTimespanMode:aW}=es,{initializeConfig:nW}=BV,{getBaseArtifacts:iW,finalizeArtifacts:oW}=ac;var sW={startTimespanGather:async function startTimespanGather$2(e){const{configContext:t={}}=e;XV.setLevel(t.logLevel||"error");const{config:r}=nW(e.config,{...t,gatherMode:"timespan"}),a=new ZV(e.page);await a.connect();const n=new Map,i=r.artifacts||[],o=await a.url(),s=await iW(r,a,{gatherMode:"timespan"
1221
- }),c=eW(),l={url:o,driver:a,artifactDefinitions:i,artifactState:c,baseArtifacts:s,computedCache:n,gatherMode:"timespan",settings:r.settings};return await aW(a,r.settings),await tW({phase:"startInstrumentation",...l}),await tW({phase:"startSensitiveInstrumentation",...l}),{async endTimespanGather(){const e=await a.url();l.url=e;const t={config:r,computedCache:n};return{artifacts:await QV.gather((async()=>{s.URL.requestedUrl=o,s.URL.finalUrl=e,await tW({phase:"stopSensitiveInstrumentation",...l}),await tW({phase:"stopInstrumentation",...l}),await tW({phase:"getArtifact",...l}),await a.disconnect();const t=await rW(c);return oW(s,t)}),t),runnerOptions:t}}}}};const cW=on.default,lW=rV,uW=pu,{getEmptyArtifactState:dW,collectPhaseArtifacts:mW,awaitArtifacts:pW}=iV,hW=es,{gotoURL:gW}=_s,fW=Ko,yW=Wo,{defaultNavigationConfig:vW}=mn,{initializeConfig:bW}=BV,{getBaseArtifacts:wW,finalizeArtifacts:SW}=ac,TW=Vn,EW=vi.exports,xW=ji,{getPageLoadError:_W}=Bo,AW=oo,RW=Ws,kW=Lo
1222
- ;async function _setup({driver:e,config:t,requestor:r,options:a}){await e.connect(),a?.skipAboutBlank||await gW(e,vW.blankPage,{waitUntil:["navigated"]});const n=await wW(t,e,{gatherMode:"navigation"});return"string"==typeof r&&(n.URL.requestedUrl=r),await hW.prepareTargetForNavigationMode(e,t.settings),{baseArtifacts:n}}async function _setupNavigation({requestor:e,driver:t,navigation:r,config:a,options:n}){n?.skipAboutBlank||await gW(t,r.blankPage,{...r,waitUntil:["navigated"]});const{warnings:i}=await hW.prepareTargetForIndividualNavigation(t.defaultSession,a.settings,{...r,requestor:e});return{warnings:i}}async function _navigate(e){const{driver:t,config:r,requestor:a}=e;try{const{requestedUrl:n,finalUrl:i,warnings:o}=await gW(t,a,{...e.navigation,debugNavigation:r.settings.debugNavigation,maxWaitForFcp:r.settings.maxWaitForFcp,maxWaitForLoad:r.settings.maxWaitForLoad,waitUntil:e.navigation.pauseAfterFcpMs?["fcp","load"]:["load"]});return{requestedUrl:n,finalUrl:i,
1223
- navigationError:void 0,warnings:o}}catch(e){if(!(e instanceof EW))throw e;if("NO_FCP"!==e.code&&"PAGE_HUNG"!==e.code)throw e;if("string"!=typeof a)throw e;return{requestedUrl:a,finalUrl:a,navigationError:e,warnings:[]}}}async function _computeNavigationResult(e,t,r,a){const{navigationError:n,finalUrl:i}=a,o=[...r.warnings,...a.warnings],s=await async function _collectDebugData(e,t){const r=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===RW.symbol)),a=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===AW.symbol)),n=[r,a].filter((e=>Boolean(e)));if(!n.length)return{};await mW({...t,phase:"getArtifact",artifactDefinitions:n});const i=t.artifactState.getArtifact,o=r?.id,s=o&&await i[o],c=s&&await kW.request(s,e),l=a?.id;return{devtoolsLog:s,records:c,trace:l&&await i[l]}}(e,t),c=s.records?_W(n,{url:i,loadFailureMode:e.navigation.loadFailureMode,networkRecords:s.records}):n;if(c){const t=e.config.settings.locale,r=TW.getFormatted(c.friendlyMessage,t)
1224
- ;cW.error("NavigationRunner",r,a.requestedUrl);const n={},l=`pageLoadError-${e.navigation.id}`;return s.devtoolsLog&&(n.devtoolsLogs={[l]:s.devtoolsLog}),s.trace&&(n.traces={[l]:s.trace}),{requestedUrl:a.requestedUrl,finalUrl:i,pageLoadError:c,artifacts:n,warnings:[...o,c.friendlyMessage]}}{await mW({phase:"getArtifact",...t});const e=await pW(t.artifactState);return{requestedUrl:a.requestedUrl,finalUrl:i,artifacts:e,warnings:o,pageLoadError:void 0}}}async function _navigation(e){const t=dW(),r={url:await e.driver.url(),gatherMode:"navigation",driver:e.driver,computedCache:e.computedCache,artifactDefinitions:e.navigation.artifacts,artifactState:t,baseArtifacts:e.baseArtifacts,settings:e.config.settings},a=await _setupNavigation(e);await mW({phase:"startInstrumentation",...r}),await mW({phase:"startSensitiveInstrumentation",...r});const n=await _navigate(e);return r.url=n.finalUrl,await mW({phase:"stopSensitiveInstrumentation",...r}),await mW({phase:"stopInstrumentation",...r}),
1225
- await async function _cleanupNavigation({driver:e}){await yW.clearThrottling(e.defaultSession)}(e),_computeNavigationResult(e,r,a,n)}async function _navigations({driver:e,config:t,requestor:r,baseArtifacts:a,computedCache:n,options:i}){if(!t.navigations)throw new Error("No navigations configured");const o={},s=[];for(const c of t.navigations){const l={driver:e,navigation:c,requestor:r,config:t,baseArtifacts:a,computedCache:n,options:i};let u=!1;const d=await _navigation(l);if("fatal"===c.loadFailureMode&&(d.pageLoadError&&(o.PageLoadError=d.pageLoadError,u=!0),o.URL={requestedUrl:d.requestedUrl,finalUrl:d.finalUrl}),s.push(...d.warnings),Object.assign(o,d.artifacts),u)break}return{artifacts:{...o,LighthouseRunWarnings:s}}}async function _cleanup({requestedUrl:e,driver:t,config:r}){!r.settings.disableStorageReset&&e&&await fW.clearDataForOrigin(t.defaultSession,e),await t.disconnect()}var DW={navigationGather:async function navigationGather$2(e,t){const{page:r,configContext:a={}}=t
1226
- ;cW.setLevel(a.logLevel||"error");const{config:n}=bW(t.config,{...a,gatherMode:"navigation"}),i=new Map,o={skipAboutBlank:a.skipAboutBlank};"string"!=typeof e&&(o.skipAboutBlank=!0);const s={config:n,computedCache:i};return{artifacts:await uW.gather((async()=>{const t={driver:new lW(r),config:n,requestor:"string"==typeof e?xW.normalizeUrl(e):e,options:o},{baseArtifacts:a}=await _setup(t),{artifacts:s}=await _navigations({...t,baseArtifacts:a,computedCache:i});return await _cleanup(t),SW(a,s)}),s),runnerOptions:s}},_setup,_setupNavigation,_navigate,_navigation,_navigations,_cleanup};const{generateFlowReportHtml:CW}=Zl,{snapshotGather:IW}=JV,{startTimespanGather:NW}=sW,{navigationGather:LW}=DW,MW=pu,{initializeConfig:PW}=BV;async function auditGatherSteps$1(e,t){if(!e.length)throw new Error("Need at least one step before getting the result");const r=[];for(const a of e){const{artifacts:e,name:n,configContext:i}=a;let o=t.gatherStepRunnerOptions?.get(a);if(!o){
1227
- const r=a.config||t.config,{gatherMode:n}=e.GatherContext,{config:s}=PW(r,{...i,gatherMode:n});o={config:s,computedCache:new Map}}const s=await MW.audit(e,o);if(!s)throw new Error(`Step "${n}" did not return a result`);r.push({lhr:s.lhr,name:n})}const a=new URL(e[0].artifacts.URL.finalUrl);return{steps:r,name:t.name||`User flow (${a.hostname})`}}var OW={UserFlow:class UserFlow$1{constructor(e,t){this.options={page:e,...t},this.name=t?.name,this._gatherSteps=[],this._gatherStepRunnerOptions=new WeakMap}_shortenUrl(e){const t=new URL(e);return`${t.hostname}${t.pathname}`}_getDefaultStepName(e){const t=this._shortenUrl(e.URL.finalUrl);switch(e.GatherContext.gatherMode){case"navigation":return`Navigation report (${t})`;case"timespan":return`Timespan report (${t})`;case"snapshot":return`Snapshot report (${t})`}}_getNextNavigationOptions(e){const t={...this.options,...e},r={...t.configContext},a={...r.settingsOverrides};void 0===r.skipAboutBlank&&(r.skipAboutBlank=!0)
1228
- ;return this._gatherSteps.some((e=>"navigation"===e.artifacts.GatherContext.gatherMode))&&void 0===a.disableStorageReset&&(a.disableStorageReset=!0),r.settingsOverrides=a,t.configContext=r,t}_addGatherStep(e,t){const r=t?.stepName,a={artifacts:e.artifacts,name:r||this._getDefaultStepName(e.artifacts),config:t.config,configContext:t.configContext};this._gatherSteps.push(a),this._gatherStepRunnerOptions.set(a,e.runnerOptions)}async navigate(e,t){if(this.currentTimespan)throw new Error("Timespan already in progress");const r=this._getNextNavigationOptions(t),a=await LW(e,r);return this._addGatherStep(a,r),a}async startTimespan(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await NW(t);this.currentTimespan={timespan:r,options:t}}async endTimespan(){if(!this.currentTimespan)throw new Error("No timespan in progress");const{timespan:e,options:t}=this.currentTimespan,r=await e.endTimespanGather();return this.currentTimespan=void 0,
1229
- this._addGatherStep(r,t),r}async snapshot(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await IW(t);return this._addGatherStep(r,t),r}async createFlowResult(){return auditGatherSteps$1(this._gatherSteps,{name:this.name,config:this.options.config,gatherStepRunnerOptions:this._gatherStepRunnerOptions})}async generateReport(){const e=await this.createFlowResult();return CW(e)}createArtifactsJson(){return{gatherSteps:this._gatherSteps,name:this.name}}},auditGatherSteps:auditGatherSteps$1};const{UserFlow:FW,auditGatherSteps:UW}=OW,{snapshotGather:jW}=JV,{startTimespanGather:BW}=sW,{navigationGather:$W}=DW,{generateFlowReportHtml:qW}=Zl,zW=pu;var VW=async function snapshot(...e){const t=await jW(...e);return zW.audit(t.artifacts,t.runnerOptions)},WW=async function startTimespan(...e){const{endTimespanGather:t}=await BW(...e);return{endTimespan:async()=>{const e=await t();return zW.audit(e.artifacts,e.runnerOptions)}}
1230
- },GW=async function navigation(...e){const t=await $W(...e);return zW.audit(t.artifacts,t.runnerOptions)};const HW=uo;var YW=class RawConnection extends HW{constructor(e){super(),this._port=e,this._port.on("message",this.handleRawMessage.bind(this)),this._port.on("close",this.dispose.bind(this))}connect(){return Promise.resolve()}disconnect(){return this._port.close(),Promise.resolve()}sendRawMessage(e){this._port.send(e)}};globalThis.Buffer=Buffer$2,"undefined"!=typeof self?(globalThis.isDevtools=!0,self.setUpWorkerConnection=function setUpWorkerConnection(e){return new YW(e)},self.runLighthouse=Hz,self.runLighthouseNavigation=GW,self.startLighthouseTimespan=WW,self.runLighthouseSnapshot=VW,self.createConfig=function createConfig(e,t){const r={onlyCategories:e,screenEmulation:{disabled:!0}};return"desktop"===t&&(r.throttling=mn.throttling.desktopDense4G,r.emulatedUserAgent=mn.userAgents.desktop,r.formFactor="desktop"),{extends:"lighthouse:default",
1231
- plugins:["lighthouse-plugin-publisher-ads"],settings:r}},self.listenForStatus=function listenForStatus(e){Log.events.addListener("status",e)},self.registerLocaleData=Vn.registerLocaleData,self.lookupLocale=function lookupCanonicalLocale(e){return oi.lookupLocale(e,Vn.getCanonicalLocales())}):global.runBundledLighthouse=Hz}();
1189
+ }],["../audits/performance-budget",yI.exports],["../audits/predictive-perf",BI],["../audits/preload-fonts",$I.exports],["../audits/preload-lcp-image",KI.exports],["../audits/redirects",iN.exports],["../audits/resource-summary",gN.exports],["../audits/screenshot-thumbnails",kN],["../audits/script-treemap-data",LN],["../audits/seo/canonical",MN.exports],["../audits/seo/crawlable-anchors",BN.exports],["../audits/seo/font-size",VN.exports],["../audits/seo/hreflang",tL.exports],["../audits/seo/http-status-code",lL.exports],["../audits/seo/is-crawlable",gL.exports],["../audits/seo/link-text",xL.exports],["../audits/seo/manual/structured-data",CL.exports],["../audits/seo/meta-description",ML.exports],["../audits/seo/plugins",UL.exports],["../audits/seo/robots-txt",YL.exports],["../audits/seo/tap-targets",oM.exports],["../audits/server-response-time",SM.exports],["../audits/service-worker",DM.exports],["../audits/splash-screen",MM.exports],["../audits/themed-omnibox",$M.exports],["../audits/third-party-facades",HM.exports],["../audits/third-party-summary",YM.exports],["../audits/timing-budget",hP.exports],["../audits/unsized-images",TP.exports],["../audits/user-timings",kP.exports],["../audits/uses-rel-preconnect",FP.exports],["../audits/uses-rel-preload",XP.exports],["../audits/valid-source-maps",lO.exports],["../audits/viewport",gO.exports],["../audits/work-during-interaction",wO.exports],["lighthouse-plugin-publisher-ads",MO.exports],["lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks",qO.exports],["lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources",lU.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-critical-path",wU.exports],["lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start",qU.exports],["lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start",aj.exports],["lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport",dj.exports],["lighthouse-plugin-publisher-ads/audits/ads-in-viewport",bj.exports],["lighthouse-plugin-publisher-ads/audits/async-ad-tags",Dj.exports],["lighthouse-plugin-publisher-ads/audits/blocking-load-events",qj.exports],["lighthouse-plugin-publisher-ads/audits/bottleneck-requests",nB.exports],["lighthouse-plugin-publisher-ads/audits/duplicate-tags",hB.exports],["lighthouse-plugin-publisher-ads/audits/first-ad-render",RB.exports],["lighthouse-plugin-publisher-ads/audits/full-width-slots",$B.exports],["lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel",JB.exports],["lighthouse-plugin-publisher-ads/audits/loads-gpt-from-official-source",c$.exports],["lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https",y$.exports],["lighthouse-plugin-publisher-ads/audits/script-injected-tags",A$.exports],["lighthouse-plugin-publisher-ads/audits/serial-header-bidding",U$.exports],["lighthouse-plugin-publisher-ads/audits/tag-load-time",nq.exports],["lighthouse-plugin-publisher-ads/audits/viewport-ad-density",bq.exports],["lighthouse-plugin-publisher-ads/audits/cumulative-ad-shift",Rq.exports],["lighthouse-plugin-publisher-ads/audits/deprecated-api-usage",jq.exports],["lighthouse-plugin-publisher-ads/audits/gpt-errors-overall",Yq.exports],["lighthouse-plugin-publisher-ads/audits/total-ad-blocking-time",az.exports]])
1190
+ ;function requireWrapper(e){return xz.get(e)||function commonjsRequire(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}(e)}function resolveModulePath(e,t,r){try{return require.resolve(e)}catch(e){}try{return require.resolve(e,{paths:[process.cwd()]})}catch(e){}const a=gz.resolve(process.cwd(),e);try{return require.resolve(a)}catch(e){}const n="Unable to locate "+(r?`${r}: `:"")+`\`${e}\`.\n Tried to require() from these locations:\n lighthouse-core/config\n ${a}`;if(!t)throw new Error(n);const i=gz.resolve(t,e);try{return require.resolve(i)}catch(e){}try{return require.resolve(e,{paths:[t]})}catch(e){}throw new Error(n+`\n ${i}`)}function shallowClone(e){return"object"==typeof e?Object.assign(Object.create(Object.getPrototypeOf(e)),e):e}function deepClone$2(e){return JSON.parse(JSON.stringify(e))}
1191
+ var _z={deepClone:deepClone$2,deepCloneConfigJson:function deepCloneConfigJson$2(e){const t=deepClone$2(e);if(Array.isArray(t.passes)&&Array.isArray(e.passes))for(let r=0;r<t.passes.length;r++){t.passes[r].gatherers=(e.passes[r].gatherers||[]).map((e=>shallowClone(e)))}return Array.isArray(e.audits)&&(t.audits=e.audits.map((e=>shallowClone(e)))),Array.isArray(e.artifacts)&&(t.artifacts=e.artifacts.map((e=>({...e,gatherer:shallowClone(e.gatherer)})))),t},mergeConfigFragment:Ez,mergeConfigFragmentArrayByKey:function mergeConfigFragmentArrayByKey$1(e,t,r){const a=new Map,n=e||[];for(let e=0;e<n.length;e++){const t=n[e];a.set(r(t),{index:e,item:t})}for(const e of t||[]){const t=a.get(r(e));if(t){const r=t.item,a="object"==typeof e&&"object"==typeof r?Ez(r,e,!0):e;n[t.index]=a}else n.push(e)}return n},mergeOptionsOfItems,mergePlugins:function mergePlugins$2(e,t,r){const a=e.plugins||[],n=new Set([...a,...r?.plugins||[]]);for(const r of n){Tz.assertValidPluginName(e,r)
1192
+ ;const a=requireWrapper(isBundledEnvironment()?r:resolveModulePath(r,t,"plugin")),n=bz.parsePlugin(a,r);e=Ez(e,n)}return e},resolveAuditsToDefns:function resolveAuditsToDefns$2(e,t){if(!e)return null;const r=wz.getAuditList(),a=e.map((e=>{const a=function expandAuditShorthand(e){if("string"==typeof e)return{path:e,options:{}};if("implementation"in e&&"function"==typeof e.implementation.audit)return e;if("path"in e&&"string"==typeof e.path)return e;if("audit"in e&&"function"==typeof e.audit)return{implementation:e,options:{}};throw new Error("Invalid Audit type "+JSON.stringify(e))}(e);let n;return n="implementation"in a?a.implementation:function requireAudit(e,t,r){const a=`${e}.js`;let n=`../audits/${e}`;if(!t.find((e=>e===a)))if(isBundledEnvironment())n=e;else{const t=resolveModulePath(e,r,"audit");n=gz.relative("lighthouse-core/config",t)}return requireWrapper(n)}(a.path,r,t),{implementation:n,path:a.path,options:a.options||{}}})),n=mergeOptionsOfItems(a)
1193
+ ;return n.forEach((e=>Tz.assertValidAudit(e))),n},resolveGathererToDefn:function resolveGathererToDefn$2(e,t,r){const a=function expandGathererShorthand(e){if("string"==typeof e)return{path:e};if("implementation"in e||"instance"in e)return e;if("path"in e){if("string"!=typeof e.path)throw new Error("Invalid Gatherer type "+JSON.stringify(e));return e}if("function"==typeof e)return{implementation:e};if(e&&"function"==typeof e.beforePass)return{instance:e};throw new Error("Invalid Gatherer type "+JSON.stringify(e))}(e);if(a.instance)return{instance:a.instance,implementation:a.implementation,path:a.path};if(a.implementation){return{instance:new(0,a.implementation),implementation:a.implementation,path:a.path}}if(a.path){return function requireGatherer(e,t,r){const a=t.find((t=>t===`${e}.js`));let n=`../gather/gatherers/${e}`;a||(n=resolveModulePath(e,r,"gatherer"));const i=requireWrapper(n);return{instance:new i,implementation:i,path:e}}(a.path,t,r)}
1194
+ throw new Error("Invalid expanded Gatherer: "+JSON.stringify(a))},resolveModulePath,resolveSettings:function resolveSettings$2(e={},t){const r=Sz.lookupLocale(t?.locale||e.locale),{defaultSettings:a}=yz,n=Ez(deepClone$2(a),e,!0),i=Ez(n,function cleanFlagsForSettings(e={}){const t={};for(const r of Object.keys(e))r in yz.defaultSettings&&(t[r]=e[r]);return t}(t),!0);return i.budgets&&(i.budgets=vz.initializeBudget(i.budgets)),i.locale=r,!0===i.emulatedUserAgent&&(i.emulatedUserAgent=yz.userAgents[i.formFactor]),Tz.assertValidSettings(i),i}};const Az=gu.exports,Rz=mn,kz=Vn,Dz=Su,Cz=on.default,Iz=bn,Nz=pu,{mergePlugins:Lz,mergeConfigFragment:Mz,resolveSettings:Pz,resolveAuditsToDefns:Oz,resolveGathererToDefn:Fz,deepClone:Uz,deepCloneConfigJson:jz}=_z,Bz=Object.keys({fetchTime:"",LighthouseRunWarnings:"",HostFormFactor:"",HostUserAgent:"",NetworkUserAgent:"",BenchmarkIndex:"",WebAppManifest:"",GatherContext:"",InstallabilityErrors:"",Stacks:"",traces:"",devtoolsLogs:"",settings:"",URL:"",
1195
+ Timing:"",PageLoadError:""});class Config$1{constructor(e,t){const r={msg:"Create config",id:"lh:init:config"};Cz.time(r,"verbose");let a=t?.configPath;if(e||(e=Az,a=Iz.resolve("lighthouse-core/config","./default-config.js")),a&&!Iz.isAbsolute(a))throw new Error("configPath must be an absolute path.");if((e=jz(e)).extends){if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");e=Config$1.extendConfigJSON(jz(Az),e)}const n=a?Iz.dirname(a):void 0;e=Lz(e,n,t),t&&function assertValidFlags(e){if("devtools"===e.channel&&e.internalDisableDeviceScreenEmulation&&(e.formFactor=e.emulatedFormFactor,e.emulatedFormFactor=e.internalDisableDeviceScreenEmulation=void 0),e.emulatedFormFactor||e.internalDisableDeviceScreenEmulation)throw new Error("Invalid emulation flag. Emulation configuration changed in LH 7.0. See https://github.com/GoogleChrome/lighthouse/blob/master/docs/emulation.md")}(t)
1196
+ ;const i=Pz(e.settings||{},t),o=Config$1.augmentPassesWithDefaults(e.passes);Config$1.adjustDefaultPassForThrottling(i,o);const s=Config$1.requireGatherers(o,n);this.settings=i,this.passes=s,this.audits=Config$1.requireAudits(e.audits,n),this.categories=e.categories||null,this.groups=e.groups||null,Config$1.filterConfigIfNeeded(this),function assertValidPasses(e,t){if(!Array.isArray(e))return;const r=Config$1.getGatherersRequestedByAudits(t),a=new Set(Bz);e.forEach(((e,t)=>{0===t&&"fatal"!==e.loadFailureMode&&(Cz.warn(`"${e.passName}" is the first pass but was marked as non-fatal. The first pass will always be treated as loadFailureMode=fatal.`),e.loadFailureMode="fatal"),e.gatherers.forEach((e=>{const t=e.instance;if(a.add(t.name),!r.has(t.name)){const e=`${t.name} gatherer requested, however no audit requires it.`;Cz.warn("config",e)}}))}));for(const e of t||[]){const t=e.implementation.meta
1197
+ ;for(const e of t.requiredArtifacts)if(!a.has(e))throw new Error(`${e} gatherer, required by audit ${t.id}, was not found in config.`)}const n=new Set;e.forEach((e=>{const t=e.passName;if(n.has(t))throw new Error(`Passes must have unique names (repeated passName: ${t}.`);n.add(t)}))}(this.passes,this.audits),Dz.assertValidCategories(this.categories,this.audits,this.groups),Cz.timeEnd(r)}getPrintString(){const e=Uz(this);if(e.passes)for(const t of e.passes)for(const e of t.gatherers)e.implementation=void 0,e.instance=void 0;if(e.audits)for(const t of e.audits)t.implementation=void 0,0===Object.keys(t.options).length&&(t.options=void 0);return kz.replaceIcuMessages(e,e.settings.locale),JSON.stringify(e,null,2)}static extendConfigJSON(e,t){if(t.passes&&e.passes){for(const r of t.passes){const t=r.passName||Rz.defaultPassConfig.passName,a=e.passes.find((e=>e.passName===t));a?Mz(a,r):e.passes.push(r)}delete t.passes}return Mz(e,t)}static augmentPassesWithDefaults(e){if(!e)return null
1198
+ ;const{defaultPassConfig:t}=Rz;return e.map((e=>Mz(Uz(t),e)))}static adjustDefaultPassForThrottling(e,t){if(!t||"devtools"!==e.throttlingMethod&&"provided"!==e.throttlingMethod)return;const r=t.find((e=>"defaultPass"===e.passName));if(!r)return;const a=Rz.nonSimulatedPassConfigOverrides;r.pauseAfterFcpMs=Math.max(a.pauseAfterFcpMs,r.pauseAfterFcpMs),r.pauseAfterLoadMs=Math.max(a.pauseAfterLoadMs,r.pauseAfterLoadMs),r.cpuQuietThresholdMs=Math.max(a.cpuQuietThresholdMs,r.cpuQuietThresholdMs),r.networkQuietThresholdMs=Math.max(a.networkQuietThresholdMs,r.networkQuietThresholdMs)}static filterConfigIfNeeded(e){const t=e.settings;if(!t.onlyCategories&&!t.onlyAudits&&!t.skipAudits)return;const{categories:r,requestedAuditNames:a}=Config$1.filterCategoriesAndAudits(e.categories,t),n=e.audits&&e.audits.filter((e=>a.has(e.implementation.meta.id))),i=Config$1.getGatherersRequestedByAudits(n),o=Config$1.generatePassesNeededByGatherers(e.passes,i);e.categories=r,e.audits=n,e.passes=o}
1199
+ static filterCategoriesAndAudits(e,t){if(!e)return{categories:null,requestedAuditNames:new Set};if(t.onlyAudits&&t.skipAudits)throw new Error("Cannot set both skipAudits and onlyAudits");const r={},a=!!t.onlyCategories,n=!!t.onlyAudits,i=t.onlyCategories||[],o=t.onlyAudits||[],s=t.skipAudits||[];i.forEach((t=>{e[t]||Cz.warn("config",`unrecognized category in 'onlyCategories': ${t}`)}));const c=new Set(o.concat(s));for(const t of c){const r=Object.keys(e).find((r=>!!e[r].auditRefs.find((e=>e.id===t))));if(r)o.includes(t)&&i.includes(r)&&Cz.warn("config",`${t} in 'onlyAudits' is already included by ${r} in 'onlyCategories'`);else{const e=s.includes(t)?"skipAudits":"onlyAudits";Cz.warn("config",`unrecognized audit in '${e}': ${t}`)}}const l=new Set(o);s.forEach((e=>l.delete(e))),Object.keys(e).forEach((t=>{const c=Uz(e[t]);if(a&&n)i.includes(t)||(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));else if(a){if(!i.includes(t))return
1200
+ }else n&&(c.auditRefs=c.auditRefs.filter((e=>o.includes(e.id))));c.auditRefs=c.auditRefs.filter((e=>!s.includes(e.id))),c.auditRefs.length&&(r[t]=c,c.auditRefs.forEach((e=>l.add(e.id))))}));return t.skipAudits&&t.skipAudits.includes("full-page-screenshot")||!t.onlyCategories&&!t.skipAudits||l.add("full-page-screenshot"),{categories:r,requestedAuditNames:l}}static getGatherersRequestedByAudits(e){if(!e)return new Set;const t=new Set;for(const r of e){const{requiredArtifacts:e,__internalOptionalArtifacts:a}=r.implementation.meta;e.forEach((e=>t.add(e))),a&&a.forEach((e=>t.add(e)))}return t}static generatePassesNeededByGatherers(e,t){if(!e)return null;const r=t.has("traces");return e.map((e=>{if(e.gatherers=e.gatherers.filter((e=>{const r=e.instance;return t.has(r.name)})),e.recordTrace&&!r){const t=e.passName||"unknown pass";Cz.warn("config",`Trace not requested by an audit, dropping trace in ${t}`),e.recordTrace=!1}return e
1201
+ })).filter((e=>!!e.recordTrace||("defaultPass"===e.passName||e.gatherers.length>0)))}static requireAudits(e,t){const r={msg:"Requiring audits",id:"lh:config:requireAudits"};Cz.time(r,"verbose");const a=Oz(e,t);return Cz.timeEnd(r),a}static requireGatherers(e,t){if(!e)return null;const r={msg:"Requiring gatherers",id:"lh:config:requireGatherers"};Cz.time(r,"verbose");const a=Nz.getGathererList(),n=e.map((e=>{const r=e.gatherers.map((e=>Fz(e,a,t))),n=Array.from(new Map(r.map((e=>[e.instance.name,e]))).values());return n.forEach((e=>function assertValidGatherer(e,t){if(t=t||e.name||"gatherer","function"!=typeof e.beforePass)throw new Error(`${t} has no beforePass() method.`);if("function"!=typeof e.pass)throw new Error(`${t} has no pass() method.`);if("function"!=typeof e.afterPass)throw new Error(`${t} has no afterPass() method.`)}(e.instance,e.path))),Object.assign(e,{gatherers:n})}));return Cz.timeEnd(r),n}}var $z=Config$1;var qz=class Gatherer{get name(){return this.constructor.name}
1202
+ beforePass(e){}pass(e){}afterPass(e,t){}};const zz=pu,Vz=on.default,Wz=hu,Gz=$z,Hz=ji;async function lighthouse(e,t={},r,a){t.logLevel=t.logLevel||"error",Vz.setLevel(t.logLevel);const n={config:generateConfig(r,t),computedCache:new Map},i=a||new Wz(t.port,t.hostname),o=await zz.gather((()=>{const t=Hz.normalizeUrl(e);return zz._gatherArtifactsFromBrowser(t,n,i)}),n);return zz.audit(o,n)}function generateConfig(e,t){return new Gz(e,t)}lighthouse.generateConfig=generateConfig,lighthouse.getAuditList=zz.getAuditList,lighthouse.traceCategories=To.traceCategories,lighthouse.Audit=kc,lighthouse.Gatherer=qz,lighthouse.NetworkRecords=Lo;var Yz=lighthouse;const Kz=vi.exports,Jz=Symbol("monkeypatch");class ProtocolSession$1{constructor(e){this._session=e,this._targetInfo=void 0,this._nextProtocolTimeout=void 0,this._callbackMap=new WeakMap;const t=e.emit;t[Jz]||(e.emit=(r,...a)=>{const n=this._targetInfo&&"iframe"===this._targetInfo.type?this._targetInfo.targetId:void 0;return t.call(e,"*",{
1203
+ method:r,params:a[0],sessionId:n}),t.call(e,r,...a)},e.emit[Jz]=!0)}setTargetInfo(e){this._targetInfo=e}hasNextProtocolTimeout(){return void 0!==this._nextProtocolTimeout}getNextProtocolTimeout(){return this._nextProtocolTimeout||3e4}setNextProtocolTimeout(e){this._nextProtocolTimeout=e}on(e,t){this._session.on(e,t)}once(e,t){this._session.once(e,t)}addSessionAttachedListener(e){const listener=t=>e(new ProtocolSession$1(t));this._callbackMap.set(e,listener),this._getConnection().on("sessionattached",listener)}removeSessionAttachedListener(e){const t=this._callbackMap.get(e);t&&this._getConnection().off("sessionattached",t)}addProtocolMessageListener(e){this._session.on("*",e)}removeProtocolMessageListener(e){this._session.off("*",e)}off(e,t){this._session.off(e,t)}sendCommand(e,...t){const r=this.getNextProtocolTimeout();let a;this._nextProtocolTimeout=void 0;const n=new Promise(((t,n)=>{r!==1/0&&(a=setTimeout(n,r,new Kz(Kz.errors.PROTOCOL_TIMEOUT,{protocolMethod:e})))
1204
+ })),i=this._session.send(e,...t);return Promise.race([i,n]).finally((()=>{a&&clearTimeout(a)}))}async dispose(){this._session.removeAllListeners(),await this._session.detach()}_getConnection(){const e=this._session.connection();if(!e)throw new Error("Connection has been closed.");return e}}var Xz=ProtocolSession$1;const Zz=on.default,Qz=Xz,eV=yi,tV=gi,throwNotConnectedFn=()=>{throw new Error("Session not connected")},rV={setTargetInfo:throwNotConnectedFn,hasNextProtocolTimeout:throwNotConnectedFn,getNextProtocolTimeout:throwNotConnectedFn,setNextProtocolTimeout:throwNotConnectedFn,on:throwNotConnectedFn,once:throwNotConnectedFn,off:throwNotConnectedFn,addProtocolMessageListener:throwNotConnectedFn,removeProtocolMessageListener:throwNotConnectedFn,addSessionAttachedListener:throwNotConnectedFn,removeSessionAttachedListener:throwNotConnectedFn,sendCommand:throwNotConnectedFn,dispose:throwNotConnectedFn};var aV=class Driver$3{constructor(e){this._page=e,this._session=void 0,
1205
+ this._executionContext=void 0,this._fetcher=void 0,this.defaultSession=rV}get executionContext(){return this._executionContext?this._executionContext:throwNotConnectedFn()}get fetcher(){return this._fetcher?this._fetcher:throwNotConnectedFn()}async url(){return this._page.url()}async connect(){if(this._session)return;const e={msg:"Connecting to browser",id:"lh:driver:connect"};Zz.time(e);const t=await this._page.target().createCDPSession();this._session=this.defaultSession=new Qz(t),this._executionContext=new eV(this._session),this._fetcher=new tV(this._session,this._executionContext),Zz.timeEnd(e)}async disconnect(){this._session&&await this._session.dispose()}};const nV=on.default;function createDependencyError(e,t){return new Error(`Dependency "${e.id}" failed with exception: ${t.message}`)}const iV={startInstrumentation:void 0,startSensitiveInstrumentation:"startInstrumentation",stopSensitiveInstrumentation:"startSensitiveInstrumentation",
1206
+ stopInstrumentation:"stopSensitiveInstrumentation",getArtifact:"stopInstrumentation"};async function collectArtifactDependencies(e,t){if(!e.dependencies)return{};const r=Object.entries(e.dependencies).map((async([e,r])=>{const a=t[r.id];if(void 0===a)throw new Error(`"${r.id}" did not run`);if(a instanceof Error)throw createDependencyError(r,a);const n=Promise.resolve().then((()=>a)).catch((e=>Promise.reject(createDependencyError(r,e))));return[e,await n]}));return Object.fromEntries(await Promise.all(r))}var oV={getEmptyArtifactState:function getEmptyArtifactState$3(){return{startInstrumentation:{},startSensitiveInstrumentation:{},stopSensitiveInstrumentation:{},stopInstrumentation:{},getArtifact:{}}},awaitArtifacts:async function awaitArtifacts$3(e){const t={};for(const[r,a]of Object.entries(e.getArtifact)){const e=await a.catch((e=>e));void 0!==e&&(t[r]=e)}return t},collectPhaseArtifacts:async function collectPhaseArtifacts$3(e){
1207
+ const{driver:t,artifactDefinitions:r,artifactState:a,baseArtifacts:n,phase:i,gatherMode:o,computedCache:s,settings:c,url:l}=e,u=iV[i],d=u&&a[u]||{};for(const e of r){nV["getArtifact"===i?"log":"verbose"](`artifacts:${i}`,e.id);const r=e.gatherer.instance,u=(d[e.id]||Promise.resolve()).then((async()=>{const u="getArtifact"===i?await collectArtifactDependencies(e,a.getArtifact):{};return r[i]({url:l,gatherMode:o,driver:t,baseArtifacts:n,dependencies:u,computedCache:s,settings:c})}));await u.catch((()=>{})),a[i][e.id]=u}},collectArtifactDependencies};const sV=gu.exports,cV=yu,{deepClone:lV}=_z,uV={performance:[{id:"uses-responsive-images-snapshot",weight:0},{id:"experimental-interaction-to-next-paint",weight:0,group:"metrics",acronym:"INP",relevantAudits:cV.inpRelevantAudits},{id:"work-during-interaction",weight:0}]};const dV={DevtoolsLog:"",Trace:"",Accessibility:"",AnchorElements:"",CacheContents:"",ConsoleMessages:"",CSSUsage:"",Doctype:"",DOMStats:"",EmbeddedContent:"",FontSize:"",
1208
+ Inputs:"",FullPageScreenshot:"",GlobalListeners:"",IFrameElements:"",ImageElements:"",InstallabilityErrors:"",InspectorIssues:"",JsUsage:"",LinkElements:"",MainDocumentContent:"",MetaElements:"",NetworkUserAgent:"",OptimizedImages:"",PasswordInputsWithPreventedPaste:"",ResponseCompression:"",RobotsTxt:"",ServiceWorker:"",ScriptElements:"",SourceMaps:"",Stacks:"",TagsBlockingFirstPaint:"",TapTargets:"",TraceElements:"",ViewportDimensions:"",WebAppManifest:"",devtoolsLogs:"",traces:""};for(const e of Object.keys(dV))dV[e]=e;var mV={artifacts:[{id:dV.DevtoolsLog,gatherer:"devtools-log"},{id:dV.Trace,gatherer:"trace"},{id:dV.Accessibility,gatherer:"accessibility"},{id:dV.AnchorElements,gatherer:"anchor-elements"},{id:dV.CacheContents,gatherer:"cache-contents"},{id:dV.ConsoleMessages,gatherer:"console-messages"},{id:dV.CSSUsage,gatherer:"css-usage"},{id:dV.Doctype,gatherer:"dobetterweb/doctype"},{id:dV.DOMStats,gatherer:"dobetterweb/domstats"},{id:dV.EmbeddedContent,
1209
+ gatherer:"seo/embedded-content"},{id:dV.FontSize,gatherer:"seo/font-size"},{id:dV.Inputs,gatherer:"inputs"},{id:dV.GlobalListeners,gatherer:"global-listeners"},{id:dV.IFrameElements,gatherer:"iframe-elements"},{id:dV.ImageElements,gatherer:"image-elements"},{id:dV.InstallabilityErrors,gatherer:"installability-errors"},{id:dV.InspectorIssues,gatherer:"inspector-issues"},{id:dV.JsUsage,gatherer:"js-usage"},{id:dV.LinkElements,gatherer:"link-elements"},{id:dV.MainDocumentContent,gatherer:"main-document-content"},{id:dV.MetaElements,gatherer:"meta-elements"},{id:dV.NetworkUserAgent,gatherer:"network-user-agent"},{id:dV.OptimizedImages,gatherer:"dobetterweb/optimized-images"},{id:dV.PasswordInputsWithPreventedPaste,gatherer:"dobetterweb/password-inputs-with-prevented-paste"},{id:dV.ResponseCompression,gatherer:"dobetterweb/response-compression"},{id:dV.RobotsTxt,gatherer:"seo/robots-txt"},{id:dV.ServiceWorker,gatherer:"service-worker"},{id:dV.ScriptElements,gatherer:"script-elements"},{
1210
+ id:dV.SourceMaps,gatherer:"source-maps"},{id:dV.Stacks,gatherer:"stacks"},{id:dV.TagsBlockingFirstPaint,gatherer:"dobetterweb/tags-blocking-first-paint"},{id:dV.TapTargets,gatherer:"seo/tap-targets"},{id:dV.TraceElements,gatherer:"trace-elements"},{id:dV.ViewportDimensions,gatherer:"viewport-dimensions"},{id:dV.WebAppManifest,gatherer:"web-app-manifest"},{id:dV.devtoolsLogs,gatherer:"devtools-log-compat"},{id:dV.traces,gatherer:"trace-compat"},{id:dV.FullPageScreenshot,gatherer:"full-page-screenshot"}],navigations:[{id:"default",pauseAfterFcpMs:1e3,pauseAfterLoadMs:1e3,networkQuietThresholdMs:1e3,cpuQuietThresholdMs:1e3,
1211
+ artifacts:[dV.DevtoolsLog,dV.Trace,dV.Accessibility,dV.AnchorElements,dV.CacheContents,dV.ConsoleMessages,dV.CSSUsage,dV.Doctype,dV.DOMStats,dV.EmbeddedContent,dV.FontSize,dV.Inputs,dV.GlobalListeners,dV.IFrameElements,dV.ImageElements,dV.InstallabilityErrors,dV.InspectorIssues,dV.JsUsage,dV.LinkElements,dV.MainDocumentContent,dV.MetaElements,dV.NetworkUserAgent,dV.OptimizedImages,dV.PasswordInputsWithPreventedPaste,dV.ResponseCompression,dV.RobotsTxt,dV.ServiceWorker,dV.ScriptElements,dV.SourceMaps,dV.Stacks,dV.TagsBlockingFirstPaint,dV.TapTargets,dV.TraceElements,dV.ViewportDimensions,dV.WebAppManifest,dV.devtoolsLogs,dV.traces,dV.FullPageScreenshot]}],settings:sV.settings,audits:[...(sV.audits||[]).map((e=>"string"==typeof e?{path:e}:e)),"byte-efficiency/uses-responsive-images-snapshot","metrics/experimental-interaction-to-next-paint","work-during-interaction"],categories:function mergeCategories(){if(!sV.categories)return{};const e=lV(sV.categories)
1212
+ ;for(const t of Object.keys(uV))e[t]&&e[t].auditRefs.push(...uV[t]);return e}(),groups:sV.groups};const pV=on.default,hV=kc,gV=Object.keys({fetchTime:"",LighthouseRunWarnings:"",BenchmarkIndex:"",settings:"",Timing:"",URL:"",PageLoadError:"",HostFormFactor:"",HostUserAgent:"",GatherContext:""}),fV=["full-page-screenshot"],yV=["HostUserAgent","HostFormFactor","Stacks","GatherContext"];function getAuditIdsInCategories(e,t){if(!e)return new Set;const r=(t=t||Object.keys(e)).map((t=>e[t])).flatMap((e=>e?.auditRefs||[]));return new Set(r.map((e=>e.id)))}function filterArtifactsByAvailableAudits(e,t){if(!e)return null;if(!t)return e;const r=new Map(e.map((e=>[e.id,e]))),a=new Set([...yV,...t.flatMap((e=>e.implementation.meta.requiredArtifacts))]);let n=0;for(;n!==a.size;){n=a.size;for(const e of a){const t=r.get(e);if(t&&t.dependencies)for(const e of Object.values(t.dependencies))a.add(e.id)}}return e.filter((e=>a.has(e.id)))}function filterArtifactsByGatherMode(e,t){
1213
+ return e?e.filter((e=>e.gatherer.instance.meta.supportedModes.includes(t))):null}function filterNavigationsByAvailableArtifacts(e,t){if(!e)return e;const r=new Set(t.map((e=>e.id)).concat(gV));return e.map((e=>({...e,artifacts:e.artifacts.filter((e=>r.has(e.id)))}))).filter((e=>e.artifacts.length))}function filterAuditsByAvailableArtifacts(e,t){if(!e)return null;const r=new Set(t.map((e=>e.id)).concat(gV));return e.filter((e=>e.implementation.meta.requiredArtifacts.every((e=>r.has(e)))))}function filterAuditsByGatherMode(e,t){return e?e.filter((e=>{const r=e.implementation.meta;return!r.supportedModes||r.supportedModes.includes(t)})):null}function filterCategoriesByGatherMode(e,t){if(!e)return null;const r=Object.entries(e).filter((([e,r])=>!r.supportedModes||r.supportedModes.includes(t)));return Object.fromEntries(r)}function filterCategoriesByExplicitFilters(e,t){if(!e||!t)return e;const r=Object.entries(e).filter((([e])=>t.includes(e)));return Object.fromEntries(r)}
1214
+ function filterCategoriesByAvailableAudits(e,t){if(!e)return e;const r=new Map(t.map((e=>[e.implementation.meta.id,e.implementation.meta]))),a=Object.entries(e).map((([e,t])=>{const a={...t,auditRefs:t.auditRefs.filter((e=>r.has(e.id)))},n=a.auditRefs.length<t.auditRefs.length,i=a.auditRefs.every((e=>{const t=r.get(e.id);return!!t&&t.scoreDisplayMode===hV.SCORING_MODES.MANUAL}));return n&&i&&(a.auditRefs=[]),[e,a]})).filter((e=>"object"==typeof e[1]&&e[1].auditRefs.length));return Object.fromEntries(a)}var vV={filterConfigByGatherMode:function filterConfigByGatherMode$1(e,t){const r=filterArtifactsByGatherMode(e.artifacts,t),a=filterAuditsByAvailableArtifacts(filterAuditsByGatherMode(e.audits,t),r||[]),n=filterCategoriesByAvailableAudits(filterCategoriesByGatherMode(e.categories,t),a||[]);return{...e,artifacts:r,audits:a,categories:n}},filterConfigByExplicitFilters:function filterConfigByExplicitFilters$1(e,t){const{onlyAudits:r,onlyCategories:a,skipAudits:n}=t
1215
+ ;!function warnOnUnknownOnlyCategories(e,t){if(t)for(const r of t)e?.[r]||pV.warn("config",`unrecognized category in 'onlyCategories': ${r}`)}(e.categories,a);let i=getAuditIdsInCategories(e.categories,void 0);a?i=getAuditIdsInCategories(e.categories,a):r&&(i=new Set);const o=new Set([...i,...r||[],...fV].filter((e=>!n||!n.includes(e)))),s=o.size&&e.audits?e.audits.filter((e=>o.has(e.implementation.meta.id))):e.audits,c=filterCategoriesByExplicitFilters(filterCategoriesByAvailableAudits(e.categories,s||[]),a),l=filterArtifactsByAvailableAudits(e.artifacts,s),u=filterNavigationsByAvailableArtifacts(e.navigations,l||[]);return{...e,artifacts:l,navigations:u,audits:s,categories:c}},filterArtifactsByGatherMode,filterArtifactsByAvailableAudits,filterNavigationsByAvailableArtifacts,filterAuditsByAvailableArtifacts,filterAuditsByGatherMode,filterCategoriesByAvailableAudits,filterCategoriesByExplicitFilters,filterCategoriesByGatherMode}
1216
+ ;const bV=bn,wV=on.default,SV=pu,TV=mV,{defaultNavigationConfig:EV,nonSimulatedPassConfigOverrides:xV}=mn,{isFRGathererDefn:_V,throwInvalidDependencyOrder:AV,isValidArtifactDependency:RV,throwInvalidArtifactDependency:kV,assertArtifactTopologicalOrder:DV,assertValidConfig:CV}=Su,{filterConfigByGatherMode:IV,filterConfigByExplicitFilters:NV}=vV,{deepCloneConfigJson:LV,resolveSettings:MV,resolveAuditsToDefns:PV,resolveGathererToDefn:OV,mergePlugins:FV,mergeConfigFragment:UV,mergeConfigFragmentArrayByKey:jV}=_z,BV=bV.join("lighthouse-core/fraggle-rock/config","./default-config.js");function resolveWorkingCopy(e,t){let{configPath:r}=t;if(r&&!bV.isAbsolute(r))throw new Error("configPath must be an absolute path");e||(e=TV,r=BV);const a=r?bV.dirname(r):void 0;return{configWorkingCopy:LV(e),configPath:r,configDir:a}}function resolveArtifactDependencies(e,t,r){if(!("dependencies"in t.instance.meta))return;const a=Object.entries(t.instance.meta.dependencies).map((([a,n])=>{const i=r.get(n)
1217
+ ;i||AV(e.id,a);return RV(t,i.gatherer)||kV(e.id,a),[a,{id:i.id}]}));return Object.fromEntries(a)}function resolveNavigationsToDefns(e,t,r){if(!e)return null;if(!t)throw new Error("Cannot use navigations without defining artifacts");const a={msg:"Resolve navigation definitions",id:"lh:config:resolveNavigationsToDefns"};wV.time(a,"verbose");const n=new Map(t.map((e=>[e.id,e]))),i=e.map((e=>{const t={...EV,...e},a=t.id,i=t.artifacts.map((e=>{const t=n.get(e);if(!t)throw new Error(`Unrecognized artifact "${e}" in navigation "${a}"`);return t})),o={...t,artifacts:i};return function overrideNavigationThrottlingWindows(e,t){e.disableThrottling||"simulate"!==t.throttlingMethod&&(e.cpuQuietThresholdMs=Math.max(e.cpuQuietThresholdMs||0,xV.cpuQuietThresholdMs),e.networkQuietThresholdMs=Math.max(e.networkQuietThresholdMs||0,xV.networkQuietThresholdMs),e.pauseAfterFcpMs=Math.max(e.pauseAfterFcpMs||0,xV.pauseAfterFcpMs),e.pauseAfterLoadMs=Math.max(e.pauseAfterLoadMs||0,xV.pauseAfterLoadMs))}(o,r),o
1218
+ }));return DV(i),wV.timeEnd(a),i}var $V={resolveWorkingCopy,initializeConfig:function initializeConfig$4(e,t){const r={msg:"Initialize config",id:"lh:config"};wV.time(r,"verbose");let{configWorkingCopy:a,configDir:n}=resolveWorkingCopy(e,t);a=function resolveExtensions(e){if(!e.extends)return e;if("lighthouse:default"!==e.extends)throw new Error("`lighthouse:default` is the only valid extension method.");const{artifacts:t,navigations:r,...a}=e,n=LV(TV),i=UV(n,a);return i.artifacts=jV(n.artifacts,t,(e=>e.id)),i.navigations=jV(n.navigations,r,(e=>e.id)),i}(a),a=FV(a,n,t.settingsOverrides);const i=MV(a.settings||{},t.settingsOverrides);!function overrideSettingsForGatherMode(e,t){"timespan"===t.gatherMode&&"simulate"===e.throttlingMethod&&(e.throttlingMethod="devtools")}(i,t);const o=function resolveArtifactsToDefns(e,t){if(!e)return null;const r={msg:"Resolve artifact definitions",id:"lh:config:resolveArtifactsToDefns"};wV.time(r,"verbose")
1219
+ ;const a=new Map,n=SV.getGathererList(),i=e.map((e=>{const r=e.gatherer,i=OV(r,n,t);if(!_V(i))throw new Error(`${i.instance.name} gatherer does not have a Fraggle Rock meta obj`);const o={id:e.id,gatherer:i,dependencies:resolveArtifactDependencies(e,i,a)},s=o.gatherer.instance.meta.symbol;return s&&a.set(s,o),o}));return wV.timeEnd(r),i}(a.artifacts,n);let s={artifacts:o,navigations:resolveNavigationsToDefns(a.navigations,o,i),audits:PV(a.audits,n),categories:a.categories||null,groups:a.groups||null,settings:i};const{warnings:c}=CV(s);return s=IV(s,t.gatherMode),s=NV(s,i),wV.timeEnd(r),{config:s,warnings:c}}};const qV=on.default,zV=aV,VV=pu,{getEmptyArtifactState:WV,collectPhaseArtifacts:GV,awaitArtifacts:HV}=oV,{initializeConfig:YV}=$V,{getBaseArtifacts:KV,finalizeArtifacts:JV}=ac;var XV={snapshotGather:async function snapshotGather$2(e){const{configContext:t={}}=e;qV.setLevel(t.logLevel||"error");const{config:r}=YV(e.config,{...t,gatherMode:"snapshot"}),a=new zV(e.page)
1220
+ ;await a.connect();const n=new Map,i=await a.url(),o={config:r,computedCache:n};return{artifacts:await VV.gather((async()=>{const e=await KV(r,a,{gatherMode:"snapshot"});e.URL.requestedUrl=i,e.URL.finalUrl=i;const t=r.artifacts||[],o=WV();await GV({url:i,phase:"getArtifact",gatherMode:"snapshot",driver:a,baseArtifacts:e,artifactDefinitions:t,artifactState:o,computedCache:n,settings:r.settings}),await a.disconnect();const s=await HV(o);return JV(e,s)}),o),runnerOptions:o}}};const ZV=on.default,QV=aV,eW=pu,{getEmptyArtifactState:tW,collectPhaseArtifacts:rW,awaitArtifacts:aW}=oV,{prepareTargetForTimespanMode:nW}=es,{initializeConfig:iW}=$V,{getBaseArtifacts:oW,finalizeArtifacts:sW}=ac;var cW={startTimespanGather:async function startTimespanGather$2(e){const{configContext:t={}}=e;ZV.setLevel(t.logLevel||"error");const{config:r}=iW(e.config,{...t,gatherMode:"timespan"}),a=new QV(e.page);await a.connect();const n=new Map,i=r.artifacts||[],o=await a.url(),s=await oW(r,a,{gatherMode:"timespan"
1221
+ }),c=tW(),l={url:o,driver:a,artifactDefinitions:i,artifactState:c,baseArtifacts:s,computedCache:n,gatherMode:"timespan",settings:r.settings};return await nW(a,r.settings),await rW({phase:"startInstrumentation",...l}),await rW({phase:"startSensitiveInstrumentation",...l}),{async endTimespanGather(){const e=await a.url();l.url=e;const t={config:r,computedCache:n};return{artifacts:await eW.gather((async()=>{s.URL.requestedUrl=o,s.URL.finalUrl=e,await rW({phase:"stopSensitiveInstrumentation",...l}),await rW({phase:"stopInstrumentation",...l}),await rW({phase:"getArtifact",...l}),await a.disconnect();const t=await aW(c);return sW(s,t)}),t),runnerOptions:t}}}}};const lW=on.default,uW=aV,dW=pu,{getEmptyArtifactState:mW,collectPhaseArtifacts:pW,awaitArtifacts:hW}=oV,gW=es,{gotoURL:fW}=_s,yW=Ko,vW=Wo,{defaultNavigationConfig:bW}=mn,{initializeConfig:wW}=$V,{getBaseArtifacts:SW,finalizeArtifacts:TW}=ac,EW=Vn,xW=vi.exports,_W=ji,{getPageLoadError:AW}=Bo,RW=oo,kW=Ws,DW=Lo
1222
+ ;async function _setup({driver:e,config:t,requestor:r,options:a}){await e.connect(),a?.skipAboutBlank||await fW(e,bW.blankPage,{waitUntil:["navigated"]});const n=await SW(t,e,{gatherMode:"navigation"});return"string"==typeof r&&(n.URL.requestedUrl=r),await gW.prepareTargetForNavigationMode(e,t.settings),{baseArtifacts:n}}async function _setupNavigation({requestor:e,driver:t,navigation:r,config:a,options:n}){n?.skipAboutBlank||await fW(t,r.blankPage,{...r,waitUntil:["navigated"]});const{warnings:i}=await gW.prepareTargetForIndividualNavigation(t.defaultSession,a.settings,{...r,requestor:e});return{warnings:i}}async function _navigate(e){const{driver:t,config:r,requestor:a}=e;try{const{requestedUrl:n,finalUrl:i,warnings:o}=await fW(t,a,{...e.navigation,debugNavigation:r.settings.debugNavigation,maxWaitForFcp:r.settings.maxWaitForFcp,maxWaitForLoad:r.settings.maxWaitForLoad,waitUntil:e.navigation.pauseAfterFcpMs?["fcp","load"]:["load"]});return{requestedUrl:n,finalUrl:i,
1223
+ navigationError:void 0,warnings:o}}catch(e){if(!(e instanceof xW))throw e;if("NO_FCP"!==e.code&&"PAGE_HUNG"!==e.code)throw e;if("string"!=typeof a)throw e;return{requestedUrl:a,finalUrl:a,navigationError:e,warnings:[]}}}async function _computeNavigationResult(e,t,r,a){const{navigationError:n,finalUrl:i}=a,o=[...r.warnings,...a.warnings],s=await async function _collectDebugData(e,t){const r=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===kW.symbol)),a=t.artifactDefinitions.find((e=>e.gatherer.instance.meta.symbol===RW.symbol)),n=[r,a].filter((e=>Boolean(e)));if(!n.length)return{};await pW({...t,phase:"getArtifact",artifactDefinitions:n});const i=t.artifactState.getArtifact,o=r?.id,s=o&&await i[o],c=s&&await DW.request(s,e),l=a?.id;return{devtoolsLog:s,records:c,trace:l&&await i[l]}}(e,t),c=s.records?AW(n,{url:i,loadFailureMode:e.navigation.loadFailureMode,networkRecords:s.records}):n;if(c){const t=e.config.settings.locale,r=EW.getFormatted(c.friendlyMessage,t)
1224
+ ;lW.error("NavigationRunner",r,a.requestedUrl);const n={},l=`pageLoadError-${e.navigation.id}`;return s.devtoolsLog&&(n.devtoolsLogs={[l]:s.devtoolsLog}),s.trace&&(n.traces={[l]:s.trace}),{requestedUrl:a.requestedUrl,finalUrl:i,pageLoadError:c,artifacts:n,warnings:[...o,c.friendlyMessage]}}{await pW({phase:"getArtifact",...t});const e=await hW(t.artifactState);return{requestedUrl:a.requestedUrl,finalUrl:i,artifacts:e,warnings:o,pageLoadError:void 0}}}async function _navigation(e){const t=mW(),r={url:await e.driver.url(),gatherMode:"navigation",driver:e.driver,computedCache:e.computedCache,artifactDefinitions:e.navigation.artifacts,artifactState:t,baseArtifacts:e.baseArtifacts,settings:e.config.settings},a=await _setupNavigation(e);await pW({phase:"startInstrumentation",...r}),await pW({phase:"startSensitiveInstrumentation",...r});const n=await _navigate(e);return r.url=n.finalUrl,await pW({phase:"stopSensitiveInstrumentation",...r}),await pW({phase:"stopInstrumentation",...r}),
1225
+ await async function _cleanupNavigation({driver:e}){await vW.clearThrottling(e.defaultSession)}(e),_computeNavigationResult(e,r,a,n)}async function _navigations({driver:e,config:t,requestor:r,baseArtifacts:a,computedCache:n,options:i}){if(!t.navigations)throw new Error("No navigations configured");const o={},s=[];for(const c of t.navigations){const l={driver:e,navigation:c,requestor:r,config:t,baseArtifacts:a,computedCache:n,options:i};let u=!1;const d=await _navigation(l);if("fatal"===c.loadFailureMode&&(d.pageLoadError&&(o.PageLoadError=d.pageLoadError,u=!0),o.URL={requestedUrl:d.requestedUrl,finalUrl:d.finalUrl}),s.push(...d.warnings),Object.assign(o,d.artifacts),u)break}return{artifacts:{...o,LighthouseRunWarnings:s}}}async function _cleanup({requestedUrl:e,driver:t,config:r}){!r.settings.disableStorageReset&&e&&await yW.clearDataForOrigin(t.defaultSession,e),await t.disconnect()}var CW={navigationGather:async function navigationGather$2(e,t){const{page:r,configContext:a={}}=t
1226
+ ;lW.setLevel(a.logLevel||"error");const{config:n}=wW(t.config,{...a,gatherMode:"navigation"}),i=new Map,o={skipAboutBlank:a.skipAboutBlank};"string"!=typeof e&&(o.skipAboutBlank=!0);const s={config:n,computedCache:i};return{artifacts:await dW.gather((async()=>{const t={driver:new uW(r),config:n,requestor:"string"==typeof e?_W.normalizeUrl(e):e,options:o},{baseArtifacts:a}=await _setup(t),{artifacts:s}=await _navigations({...t,baseArtifacts:a,computedCache:i});return await _cleanup(t),TW(a,s)}),s),runnerOptions:s}},_setup,_setupNavigation,_navigate,_navigation,_navigations,_cleanup};const{generateFlowReportHtml:IW}=Zl,{snapshotGather:NW}=XV,{startTimespanGather:LW}=cW,{navigationGather:MW}=CW,PW=pu,{initializeConfig:OW}=$V;async function auditGatherSteps$1(e,t){if(!e.length)throw new Error("Need at least one step before getting the result");const r=[];for(const a of e){const{artifacts:e,name:n,configContext:i}=a;let o=t.gatherStepRunnerOptions?.get(a);if(!o){
1227
+ const r=a.config||t.config,{gatherMode:n}=e.GatherContext,{config:s}=OW(r,{...i,gatherMode:n});o={config:s,computedCache:new Map}}const s=await PW.audit(e,o);if(!s)throw new Error(`Step "${n}" did not return a result`);r.push({lhr:s.lhr,name:n})}const a=new URL(e[0].artifacts.URL.finalUrl);return{steps:r,name:t.name||`User flow (${a.hostname})`}}var FW={UserFlow:class UserFlow$1{constructor(e,t){this.options={page:e,...t},this.name=t?.name,this._gatherSteps=[],this._gatherStepRunnerOptions=new WeakMap}_shortenUrl(e){const t=new URL(e);return`${t.hostname}${t.pathname}`}_getDefaultStepName(e){const t=this._shortenUrl(e.URL.finalUrl);switch(e.GatherContext.gatherMode){case"navigation":return`Navigation report (${t})`;case"timespan":return`Timespan report (${t})`;case"snapshot":return`Snapshot report (${t})`}}_getNextNavigationOptions(e){const t={...this.options,...e},r={...t.configContext},a={...r.settingsOverrides};void 0===r.skipAboutBlank&&(r.skipAboutBlank=!0)
1228
+ ;return this._gatherSteps.some((e=>"navigation"===e.artifacts.GatherContext.gatherMode))&&void 0===a.disableStorageReset&&(a.disableStorageReset=!0),r.settingsOverrides=a,t.configContext=r,t}_addGatherStep(e,t){const r=t?.stepName,a={artifacts:e.artifacts,name:r||this._getDefaultStepName(e.artifacts),config:t.config,configContext:t.configContext};this._gatherSteps.push(a),this._gatherStepRunnerOptions.set(a,e.runnerOptions)}async navigate(e,t){if(this.currentTimespan)throw new Error("Timespan already in progress");const r=this._getNextNavigationOptions(t),a=await MW(e,r);return this._addGatherStep(a,r),a}async startTimespan(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await LW(t);this.currentTimespan={timespan:r,options:t}}async endTimespan(){if(!this.currentTimespan)throw new Error("No timespan in progress");const{timespan:e,options:t}=this.currentTimespan,r=await e.endTimespanGather();return this.currentTimespan=void 0,
1229
+ this._addGatherStep(r,t),r}async snapshot(e){if(this.currentTimespan)throw new Error("Timespan already in progress");const t={...this.options,...e},r=await NW(t);return this._addGatherStep(r,t),r}async createFlowResult(){return auditGatherSteps$1(this._gatherSteps,{name:this.name,config:this.options.config,gatherStepRunnerOptions:this._gatherStepRunnerOptions})}async generateReport(){const e=await this.createFlowResult();return IW(e)}createArtifactsJson(){return{gatherSteps:this._gatherSteps,name:this.name}}},auditGatherSteps:auditGatherSteps$1};const{UserFlow:UW,auditGatherSteps:jW}=FW,{snapshotGather:BW}=XV,{startTimespanGather:$W}=cW,{navigationGather:qW}=CW,{generateFlowReportHtml:zW}=Zl,VW=pu;var WW=async function snapshot(...e){const t=await BW(...e);return VW.audit(t.artifacts,t.runnerOptions)},GW=async function startTimespan(...e){const{endTimespanGather:t}=await $W(...e);return{endTimespan:async()=>{const e=await t();return VW.audit(e.artifacts,e.runnerOptions)}}
1230
+ },HW=async function navigation(...e){const t=await qW(...e);return VW.audit(t.artifacts,t.runnerOptions)};const YW=uo;var KW=class RawConnection extends YW{constructor(e){super(),this._port=e,this._port.on("message",this.handleRawMessage.bind(this)),this._port.on("close",this.dispose.bind(this))}connect(){return Promise.resolve()}disconnect(){return this._port.close(),Promise.resolve()}sendRawMessage(e){this._port.send(e)}};globalThis.Buffer=Buffer$2,"undefined"!=typeof self?(globalThis.isDevtools=!0,self.setUpWorkerConnection=function setUpWorkerConnection(e){return new KW(e)},self.runLighthouse=Yz,self.runLighthouseNavigation=HW,self.startLighthouseTimespan=GW,self.runLighthouseSnapshot=WW,self.createConfig=function createConfig(e,t){const r={onlyCategories:e,screenEmulation:{disabled:!0}};return"desktop"===t&&(r.throttling=mn.throttling.desktopDense4G,r.emulatedUserAgent=mn.userAgents.desktop,r.formFactor="desktop"),{extends:"lighthouse:default",
1231
+ plugins:["lighthouse-plugin-publisher-ads"],settings:r}},self.listenForStatus=function listenForStatus(e){Log.events.addListener("status",e),Log.events.addListener("warning",e)},self.registerLocaleData=Vn.registerLocaleData,self.lookupLocale=function lookupCanonicalLocale(e){return oi.lookupLocale(e,Vn.getCanonicalLocales())}):global.runBundledLighthouse=Yz}();