sparkforensics-server 0.2.4 → 0.4.0
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.
- package/LICENSE +21 -0
- package/README.md +5 -1
- package/index.js +5 -4
- package/package.json +1 -1
- package/public/assets/AutoscalingChurn-CUSIvvab.js +1 -0
- package/public/assets/CacheUtilization-Ce0K6_X2.js +1 -0
- package/public/assets/CachingOpportunity-Cn-LmRA4.js +1 -0
- package/public/assets/ColdStart-BoiYzEyV.js +1 -0
- package/public/assets/ConfigAudit-BoJc6PAw.js +1 -0
- package/public/assets/CoreUsageArea-BFfXKu7K.js +1 -0
- package/public/assets/Dashboard-Bo_1jGqH.js +2 -0
- package/public/assets/DisclosureContext-LYzHroHO.js +1 -0
- package/public/assets/DuplicatePlanSubtree-BaAuGAoo.js +1 -0
- package/public/assets/ExecutorUtilization-OE6VMFkG.js +1 -0
- package/public/assets/GcPressure-AoL_ZNrV.js +1 -0
- package/public/assets/IncompleteRun-Bv6IzgsQ.js +1 -0
- package/public/assets/JobFailures-DF3U2z1f.js +1 -0
- package/public/assets/MemoryUtilization-B65OVZlq.js +1 -0
- package/public/assets/OverBroadcast-DXbJREDl.js +1 -0
- package/public/assets/PartitionSizing-DZLnjy0d.js +1 -0
- package/public/assets/PlanExplorer-DdmPkKO1.js +1 -0
- package/public/assets/PlanGraphRoute-C-BGmC6j.js +1 -0
- package/public/assets/RetryWaste-BbEPsdMw.js +1 -0
- package/public/assets/ShuffleIO-wZB94LS8.js +1 -0
- package/public/assets/Skew-SpQE7zeJ.js +1 -0
- package/public/assets/SlowHost-DwDBCTvr.js +1 -0
- package/public/assets/SmallFiles-yjY_6sT1.js +1 -0
- package/public/assets/SpeculationWaste-73PDmj0c.js +1 -0
- package/public/assets/Spill-DEw0Kd1i.js +1 -0
- package/public/assets/StageFailed-BEfXdEJc.js +1 -0
- package/public/assets/StageFindingGroup-Bzm2TY03.js +1 -0
- package/public/assets/StageHeader-BSV8ALhT.js +1 -0
- package/public/assets/StageShape-CzR4jHOt.js +1 -0
- package/public/assets/StageSlowness-vMPsnAaa.js +1 -0
- package/public/assets/Straggler-Cf__OGl5.js +1 -0
- package/public/assets/TaskFailures-BZ8kLZiO.js +1 -0
- package/public/assets/{TinyTask-DYXks5sT.js → TinyTask-CIPRxWfT.js} +1 -1
- package/public/assets/UnderBroadcast-CBm8ZPoS.js +1 -0
- package/public/assets/{finding-anchor-CDbHtqKT.js → finding-anchor-DF1cSHO1.js} +1 -1
- package/public/assets/impact-sort-7z0ZcBZf.js +1 -0
- package/public/assets/index-BcqTLKFp.css +2 -0
- package/public/assets/index-CEM9bz_x.js +13 -0
- package/public/assets/parser-worker-Q5KCPdKT.js +122 -0
- package/public/assets/react-vendor-BAKt3vny.js +9 -0
- package/public/assets/select-Cy5pmbrh.js +1 -0
- package/public/assets/usePagedRows-BjPOpUU8.js +1 -0
- package/public/assets/useRecentFiles-BrBl-AP1.js +11 -0
- package/public/assets/useSortMode-CU0vzThu.js +1 -0
- package/public/docs/404.html +2 -2
- package/public/docs/assets/{app.DsFQcynM.js → app.C6w47a9W.js} +1 -1
- package/public/docs/assets/chunks/@localSearchIndexroot.DbZy5EtM.js +1 -0
- package/public/docs/assets/chunks/{VPLocalSearchBox.oa8NbaiV.js → VPLocalSearchBox.BcTNvT55.js} +1 -1
- package/public/docs/assets/chunks/{theme.Ca4dR9dL.js → theme.D-mE6j02.js} +2 -2
- package/public/docs/assets/{contributor-guide_architecture_board-widgets.md.9ToZXcTk.js → contributor-guide_architecture_board-widgets.md.VTcYTH4d.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.CsqZHz_T.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.aQQfP7pj.lean.js → contributor-guide_architecture_detector-contract.md.CsqZHz_T.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.CFNCE8JB.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_drill-down.md.Bawx6NgP.lean.js → contributor-guide_architecture_drill-down.md.CFNCE8JB.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.HT9IJGIl.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.sf9DU2bA.lean.js → contributor-guide_architecture_impact-estimation.md.HT9IJGIl.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_overview.md.CTEqVeV4.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_overview.md.CTEqVeV4.lean.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.DOTVHjTV.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_state-and-history.md.C-xxn0q7.lean.js → contributor-guide_architecture_state-and-history.md.DOTVHjTV.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.BmpARZve.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_widget-rendering.md.DYwFeyjV.lean.js → contributor-guide_architecture_widget-rendering.md.BmpARZve.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.21pTYhFF.js +6 -0
- package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.21pTYhFF.lean.js +1 -0
- package/public/docs/assets/contributor-guide_contributing.md.B2E9ni79.js +1 -0
- package/public/docs/assets/contributor-guide_contributing.md.B2E9ni79.lean.js +1 -0
- package/public/docs/assets/contributor-guide_development-setup.md.CjgZJwjK.js +15 -0
- package/public/docs/assets/{contributor-guide_development-setup.md.DvMV1xhQ.lean.js → contributor-guide_development-setup.md.CjgZJwjK.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_testing.md.DTwhpoN2.js +1 -0
- package/public/docs/assets/contributor-guide_testing.md.DTwhpoN2.lean.js +1 -0
- package/public/docs/assets/tuning-reference_anti-patterns.md.D08Uaod7.js +1 -0
- package/public/docs/assets/tuning-reference_anti-patterns.md.D08Uaod7.lean.js +1 -0
- package/public/docs/assets/tuning-reference_aqe.md.C1Ae6A8u.js +1 -0
- package/public/docs/assets/tuning-reference_aqe.md.C1Ae6A8u.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.6wjKuJNE.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.6wjKuJNE.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.BVQbsuHP.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.BVQbsuHP.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.DtaYnaiF.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.DtaYnaiF.lean.js +1 -0
- package/public/docs/assets/{tuning-reference_bottleneck-failures.md.CAsFf3RR.js → tuning-reference_bottleneck-failures.md.Z1Tdmdd3.js} +2 -2
- package/public/docs/assets/tuning-reference_bottleneck-failures.md.Z1Tdmdd3.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.BCnXLf1n.js +6 -0
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.BCnXLf1n.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.CcvQj2g9.js +8 -0
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.CcvQj2g9.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.B-C0-8h-.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.B-C0-8h-.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.DCnhWiqj.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.DCnhWiqj.lean.js +1 -0
- package/public/docs/assets/{tuning-reference_bottleneck-shuffle.md.DDMQVOW6.js → tuning-reference_bottleneck-shuffle.md.B5OMJCd3.js} +2 -2
- package/public/docs/assets/tuning-reference_bottleneck-shuffle.md.B5OMJCd3.lean.js +1 -0
- package/public/docs/assets/{tuning-reference_bottleneck-skew.md.B0MzhWcX.js → tuning-reference_bottleneck-skew.md.Cvo6NQm_.js} +1 -1
- package/public/docs/assets/tuning-reference_bottleneck-skew.md.Cvo6NQm_.lean.js +1 -0
- package/public/docs/assets/{tuning-reference_bottleneck-slow-host.md.BlIo6UDW.js → tuning-reference_bottleneck-slow-host.md.ja5qr3wq.js} +1 -1
- package/public/docs/assets/tuning-reference_bottleneck-slow-host.md.ja5qr3wq.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.Crjtb0i2.js +5 -0
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.Crjtb0i2.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.Bl8KtSRg.js +6 -0
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.Bl8KtSRg.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.B0VN8reT.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.B0VN8reT.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.DQCftGhu.js +8 -0
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.DQCftGhu.lean.js +1 -0
- package/public/docs/assets/{tuning-reference_bottleneck-utilization.md.DqC_iGkw.js → tuning-reference_bottleneck-utilization.md.BXDl30f9.js} +1 -1
- package/public/docs/assets/tuning-reference_bottleneck-utilization.md.BXDl30f9.lean.js +1 -0
- package/public/docs/assets/tuning-reference_caching.md.CcaiMn_7.js +1 -0
- package/public/docs/assets/tuning-reference_caching.md.CcaiMn_7.lean.js +1 -0
- package/public/docs/assets/tuning-reference_cluster-config.md.DbWG1yZq.js +1 -0
- package/public/docs/assets/tuning-reference_cluster-config.md.DbWG1yZq.lean.js +1 -0
- package/public/docs/assets/tuning-reference_config.md.YUqSpwFB.js +1 -0
- package/public/docs/assets/tuning-reference_config.md.YUqSpwFB.lean.js +1 -0
- package/public/docs/assets/tuning-reference_data-formats.md.C5DX5xL4.js +1 -0
- package/public/docs/assets/tuning-reference_data-formats.md.C5DX5xL4.lean.js +1 -0
- package/public/docs/assets/tuning-reference_index.md.ZVIpQ6Dk.js +1 -0
- package/public/docs/assets/tuning-reference_index.md.ZVIpQ6Dk.lean.js +1 -0
- package/public/docs/assets/tuning-reference_intro.md.BSSaDlqx.js +1 -0
- package/public/docs/assets/tuning-reference_intro.md.BSSaDlqx.lean.js +1 -0
- package/public/docs/assets/tuning-reference_joins.md.BVhNCDnE.js +1 -0
- package/public/docs/assets/tuning-reference_joins.md.BVhNCDnE.lean.js +1 -0
- package/public/docs/assets/tuning-reference_memory-model.md.CfjFdgbl.js +1 -0
- package/public/docs/assets/tuning-reference_memory-model.md.CfjFdgbl.lean.js +1 -0
- package/public/docs/assets/tuning-reference_metrics.md.C64VNEL4.js +1 -0
- package/public/docs/assets/tuning-reference_metrics.md.C64VNEL4.lean.js +1 -0
- package/public/docs/assets/tuning-reference_partitioning.md.CtLK0xsS.js +1 -0
- package/public/docs/assets/tuning-reference_partitioning.md.CtLK0xsS.lean.js +1 -0
- package/public/docs/assets/tuning-reference_pyspark.md.D-92XgF8.js +6 -0
- package/public/docs/assets/tuning-reference_pyspark.md.D-92XgF8.lean.js +1 -0
- package/public/docs/assets/tuning-reference_shuffle.md.Iq2v1oHJ.js +1 -0
- package/public/docs/assets/tuning-reference_shuffle.md.Iq2v1oHJ.lean.js +1 -0
- package/public/docs/assets/tuning-reference_spark-architecture.md._qwnE_Sc.js +1 -0
- package/public/docs/assets/tuning-reference_spark-architecture.md._qwnE_Sc.lean.js +1 -0
- package/public/docs/assets/tuning-reference_table-formats.md.BSYEK-eN.js +1 -0
- package/public/docs/assets/tuning-reference_table-formats.md.BSYEK-eN.lean.js +1 -0
- package/public/docs/assets/{user-guide_alternative-log-retrieval.md.B4tPGIal.js → user-guide_alternative-log-retrieval.md.ZHPSbBkF.js} +1 -1
- package/public/docs/assets/{user-guide_alternative-log-retrieval.md.B4tPGIal.lean.js → user-guide_alternative-log-retrieval.md.ZHPSbBkF.lean.js} +1 -1
- package/public/docs/assets/user-guide_getting-started.md.CEa2ZX-l.js +6 -0
- package/public/docs/assets/user-guide_getting-started.md.CEa2ZX-l.lean.js +1 -0
- package/public/docs/assets/{user-guide_mcp-tools.md.DGvolGzt.js → user-guide_mcp-tools.md.dQwIvdTF.js} +13 -7
- package/public/docs/assets/user-guide_mcp-tools.md.dQwIvdTF.lean.js +1 -0
- package/public/docs/assets/user-guide_run-comparison.md.ChLI3MK0.js +1 -0
- package/public/docs/assets/user-guide_run-comparison.md.ChLI3MK0.lean.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.D1ccs60C.js +1 -0
- package/public/docs/assets/{user-guide_understanding-findings.md.B29f0ucS.lean.js → user-guide_understanding-findings.md.D1ccs60C.lean.js} +1 -1
- package/public/docs/contributor-guide/architecture/board-widgets.html +5 -5
- package/public/docs/contributor-guide/architecture/detector-contract.html +5 -5
- package/public/docs/contributor-guide/architecture/drill-down.html +5 -5
- package/public/docs/contributor-guide/architecture/impact-estimation.html +5 -5
- package/public/docs/contributor-guide/architecture/index.html +3 -3
- package/public/docs/contributor-guide/architecture/overview.html +5 -5
- package/public/docs/contributor-guide/architecture/state-and-history.html +5 -5
- package/public/docs/contributor-guide/architecture/widget-rendering.html +5 -5
- package/public/docs/contributor-guide/architecture/worker-protocol.html +6 -6
- package/public/docs/contributor-guide/contributing.html +5 -5
- package/public/docs/contributor-guide/development-setup.html +13 -10
- package/public/docs/contributor-guide/testing.html +5 -5
- package/public/docs/hashmap.json +1 -1
- package/public/docs/index.html +3 -3
- package/public/docs/tuning-reference/anti-patterns.html +6 -6
- package/public/docs/tuning-reference/aqe.html +6 -6
- package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +6 -6
- package/public/docs/tuning-reference/bottleneck-cold-start.html +6 -6
- package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +6 -6
- package/public/docs/tuning-reference/bottleneck-failures.html +6 -6
- package/public/docs/tuning-reference/bottleneck-gc.html +6 -6
- package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +6 -6
- package/public/docs/tuning-reference/bottleneck-memory-utilization.html +6 -6
- package/public/docs/tuning-reference/bottleneck-retry-waste.html +6 -6
- package/public/docs/tuning-reference/bottleneck-shuffle.html +6 -6
- package/public/docs/tuning-reference/bottleneck-skew.html +6 -6
- package/public/docs/tuning-reference/bottleneck-slow-host.html +6 -6
- package/public/docs/tuning-reference/bottleneck-small-files.html +6 -6
- package/public/docs/tuning-reference/bottleneck-spill.html +6 -6
- package/public/docs/tuning-reference/bottleneck-straggler.html +6 -6
- package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +6 -6
- package/public/docs/tuning-reference/bottleneck-utilization.html +6 -6
- package/public/docs/tuning-reference/caching.html +6 -6
- package/public/docs/tuning-reference/cluster-config.html +6 -6
- package/public/docs/tuning-reference/config.html +6 -6
- package/public/docs/tuning-reference/data-formats.html +6 -6
- package/public/docs/tuning-reference/index.html +6 -6
- package/public/docs/tuning-reference/intro.html +6 -6
- package/public/docs/tuning-reference/joins.html +6 -6
- package/public/docs/tuning-reference/memory-model.html +6 -6
- package/public/docs/tuning-reference/metrics.html +6 -6
- package/public/docs/tuning-reference/partitioning.html +6 -6
- package/public/docs/tuning-reference/pyspark.html +6 -6
- package/public/docs/tuning-reference/shuffle.html +6 -6
- package/public/docs/tuning-reference/spark-architecture.html +6 -6
- package/public/docs/tuning-reference/table-formats.html +6 -6
- package/public/docs/user-guide/alternative-log-retrieval.html +5 -5
- package/public/docs/user-guide/getting-started.html +9 -6
- package/public/docs/user-guide/mcp-tools.html +15 -9
- package/public/docs/user-guide/run-comparison.html +5 -5
- package/public/docs/user-guide/understanding-findings.html +5 -5
- package/public/export-template.html +111 -0
- package/public/index.html +4 -3
- package/vendor-core/analyzer.js +156 -48
- package/vendor-core/check-coverage.js +88 -0
- package/vendor-core/cli/budgets.js +31 -18
- package/vendor-core/cli/collect-run.js +76 -31
- package/vendor-core/cli/native-zstd.js +2 -2
- package/vendor-core/cli/threshold-config.js +28 -0
- package/vendor-core/comparison-verdict.js +177 -0
- package/vendor-core/core-source-hash.txt +1 -0
- package/vendor-core/core-usage-locality.js +56 -2
- package/vendor-core/detector-docs.js +58 -0
- package/vendor-core/detectors.js +933 -459
- package/vendor-core/docs-config.js +0 -36
- package/vendor-core/docs-content/chapters/nav-index.json +31 -0
- package/vendor-core/docs-content/detection/cstor.md +9 -0
- package/vendor-core/docs-content/detection/fail.md +6 -2
- package/vendor-core/docs-site-config.js +3 -0
- package/vendor-core/event-handlers.js +191 -6
- package/vendor-core/event-schemas.js +29 -0
- package/vendor-core/evidence-report.js +440 -112
- package/vendor-core/export-data.js +79 -6
- package/vendor-core/finding-action-label.js +9 -88
- package/vendor-core/finding-filter-predicate.js +9 -0
- package/vendor-core/finding-generic-recommendation.js +6 -104
- package/vendor-core/finding-names.js +21 -45
- package/vendor-core/finding-presentation.js +333 -0
- package/vendor-core/finding-tag-help.js +110 -0
- package/vendor-core/finding-types.js +361 -0
- package/vendor-core/findings-of-type.js +11 -0
- package/vendor-core/format-utils.js +92 -27
- package/vendor-core/html-export.js +51 -0
- package/vendor-core/impact-band.js +21 -8
- package/vendor-core/impact-estimator.js +8 -521
- package/vendor-core/impact-format.js +114 -0
- package/vendor-core/impact-model.js +175 -0
- package/vendor-core/ingest.js +2 -0
- package/vendor-core/intervals.js +13 -0
- package/vendor-core/list-runs.js +2 -3
- package/vendor-core/load-vendored.js +70 -5
- package/vendor-core/mcp-server-factory.js +14 -10
- package/vendor-core/mcp-tools.js +105 -45
- package/vendor-core/model-assembler.js +12 -0
- package/vendor-core/occupancy.js +1 -1
- package/vendor-core/parser-worker.js +22 -5
- package/vendor-core/plan-graph-model.js +3 -2
- package/vendor-core/plan-node-detail.js +1 -1
- package/vendor-core/recommendation-rollup.js +63 -3
- package/vendor-core/redact.js +68 -28
- package/vendor-core/run-comparison.js +40 -7
- package/vendor-core/run-interpretation.js +290 -0
- package/vendor-core/run-outcome.js +74 -0
- package/vendor-core/run-payload.js +17 -0
- package/vendor-core/run-shape.js +40 -0
- package/vendor-core/run-verdict.js +353 -0
- package/vendor-core/scaling-sim.js +4 -5
- package/vendor-core/scorecard-estimates.js +62 -0
- package/vendor-core/shs-fetch.js +175 -65
- package/vendor-core/shs-load.js +1 -1
- package/vendor-core/sql-stages.js +11 -0
- package/vendor-core/stage-quantiles.js +14 -0
- package/vendor-core/task-failure.js +151 -0
- package/vendor-core/threshold-overrides.js +160 -0
- package/vendor-core/threshold-summary.js +11 -33
- package/vendor-core/types.js +6 -42
- package/vendor-core/vendor/fflate.js +1 -1
- package/vendor-core/wall-clock.js +1 -12
- package/vendor-core/wasted-core-hours.js +2 -2
- package/vendor-core/zip-archive.js +167 -0
- package/public/assets/AutoscalingChurn-BOiUUfuY.js +0 -1
- package/public/assets/CacheUtilization-DwX7lisd.js +0 -1
- package/public/assets/CachingOpportunity-DUE3GKpx.js +0 -1
- package/public/assets/ColdStart-ZHxPrJmI.js +0 -1
- package/public/assets/ConfigAudit-BkVnq2XE.js +0 -1
- package/public/assets/CoreUsageArea-DobrSXk2.js +0 -1
- package/public/assets/Dashboard-y3_9iQJo.js +0 -1
- package/public/assets/DuplicatePlanSubtree-BSQZFeNq.js +0 -1
- package/public/assets/DurationHistogram-DlQv4ZCB.js +0 -1
- package/public/assets/EmptyState-DqnSxTjJ.js +0 -1
- package/public/assets/ExecutorUtilization-CuQUxaCd.js +0 -1
- package/public/assets/GcPressure-CLT5hkMJ.js +0 -1
- package/public/assets/ImpactEstimate-Df_laG-n.js +0 -1
- package/public/assets/IncompleteRun-CpIkS4XZ.js +0 -1
- package/public/assets/JobFailures-DKbvYc4J.js +0 -1
- package/public/assets/MemoryUtilization-C5kHmXIb.js +0 -1
- package/public/assets/OverBroadcast-C5pF66aq.js +0 -1
- package/public/assets/PartitionSizing-BvEJQ5M1.js +0 -1
- package/public/assets/PlanExplorer-DjGTZifP.js +0 -1
- package/public/assets/PlanGraphRoute-DoIGA7_H.js +0 -1
- package/public/assets/RetryWaste-C0znHd_w.js +0 -1
- package/public/assets/RowPagination-2icPidMP.js +0 -1
- package/public/assets/ShuffleIO-L_XSnJ_V.js +0 -1
- package/public/assets/Skew-w4uV5H_g.js +0 -1
- package/public/assets/SlowHost-D5tWJ1UR.js +0 -1
- package/public/assets/SmallFiles-CTtNiSOh.js +0 -1
- package/public/assets/SpeculationWaste-xCKwjz2K.js +0 -1
- package/public/assets/Spill-BT8my24K.js +0 -1
- package/public/assets/StageFailed-De3vVDbc.js +0 -1
- package/public/assets/StageFindingGroup-R4OW-g4U.js +0 -1
- package/public/assets/StageHeader-CGeWqC-0.js +0 -1
- package/public/assets/StagePill-BwwKLcFl.js +0 -1
- package/public/assets/StageShape-D4LmPVyV.js +0 -1
- package/public/assets/StageSlowness-8-z6qn4Q.js +0 -1
- package/public/assets/Straggler-BIgxsowI.js +0 -1
- package/public/assets/TaskFailures-B9lLt6Rw.js +0 -1
- package/public/assets/UnderBroadcast-BWqWMpeG.js +0 -1
- package/public/assets/WidgetLeadSummary-BdUUi7L5.js +0 -1
- package/public/assets/downsample-WmNM1qc9.js +0 -1
- package/public/assets/impact-sort-DxaUheWV.js +0 -1
- package/public/assets/inbox-M_EuWNiK.js +0 -1
- package/public/assets/index-CjVklAdW.css +0 -2
- package/public/assets/index-pnImGbgQ.js +0 -9
- package/public/assets/parser-worker-C3BAO6z9.js +0 -117
- package/public/assets/react-vendor-D2TLlSzI.js +0 -9
- package/public/assets/select-C-MZGNpb.js +0 -1
- package/public/assets/toggle-group-C3nz7UQ_.js +0 -1
- package/public/assets/usePagedRows-jNUWgVTD.js +0 -1
- package/public/assets/useRecentFiles-0XuhS91q.js +0 -11
- package/public/assets/useSortMode-DHlKZeWv.js +0 -1
- package/public/docs/assets/chunks/@localSearchIndexroot.BEfYag5Q.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.aQQfP7pj.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.Bawx6NgP.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.sf9DU2bA.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_overview.md.BXQdgG5u.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_overview.md.BXQdgG5u.lean.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.C-xxn0q7.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.DYwFeyjV.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.P7d1vtEJ.js +0 -6
- package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.P7d1vtEJ.lean.js +0 -1
- package/public/docs/assets/contributor-guide_contributing.md.CvRsdr6J.js +0 -1
- package/public/docs/assets/contributor-guide_contributing.md.CvRsdr6J.lean.js +0 -1
- package/public/docs/assets/contributor-guide_development-setup.md.DvMV1xhQ.js +0 -12
- package/public/docs/assets/contributor-guide_testing.md.BU6vyA-9.js +0 -1
- package/public/docs/assets/contributor-guide_testing.md.BU6vyA-9.lean.js +0 -1
- package/public/docs/assets/tuning-reference_anti-patterns.md.Df1YMIHu.js +0 -1
- package/public/docs/assets/tuning-reference_anti-patterns.md.Df1YMIHu.lean.js +0 -1
- package/public/docs/assets/tuning-reference_aqe.md.BIsCtLzm.js +0 -1
- package/public/docs/assets/tuning-reference_aqe.md.BIsCtLzm.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.CEstB3Ia.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.CEstB3Ia.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.CEuy-72y.js +0 -7
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.CEuy-72y.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.CIohQDfn.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.CIohQDfn.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-failures.md.CAsFf3RR.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.B4T3kJYV.js +0 -6
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.B4T3kJYV.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.BaJl__1W.js +0 -8
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.BaJl__1W.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.DbP-SJZc.js +0 -7
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.DbP-SJZc.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.D5JMjVOt.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.D5JMjVOt.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-shuffle.md.DDMQVOW6.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-skew.md.B0MzhWcX.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-slow-host.md.BlIo6UDW.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.DHGMTmPs.js +0 -5
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.DHGMTmPs.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.PNH7mITt.js +0 -6
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.PNH7mITt.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.DIbXdAcQ.js +0 -7
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.DIbXdAcQ.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.CB05v3zh.js +0 -8
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.CB05v3zh.lean.js +0 -1
- package/public/docs/assets/tuning-reference_bottleneck-utilization.md.DqC_iGkw.lean.js +0 -1
- package/public/docs/assets/tuning-reference_caching.md.B7aQ8asB.js +0 -1
- package/public/docs/assets/tuning-reference_caching.md.B7aQ8asB.lean.js +0 -1
- package/public/docs/assets/tuning-reference_cluster-config.md.CD6vzYtD.js +0 -1
- package/public/docs/assets/tuning-reference_cluster-config.md.CD6vzYtD.lean.js +0 -1
- package/public/docs/assets/tuning-reference_config.md.UvveiWG3.js +0 -1
- package/public/docs/assets/tuning-reference_config.md.UvveiWG3.lean.js +0 -1
- package/public/docs/assets/tuning-reference_data-formats.md.bjCAWH3N.js +0 -1
- package/public/docs/assets/tuning-reference_data-formats.md.bjCAWH3N.lean.js +0 -1
- package/public/docs/assets/tuning-reference_index.md.BQ_NooMV.js +0 -1
- package/public/docs/assets/tuning-reference_index.md.BQ_NooMV.lean.js +0 -1
- package/public/docs/assets/tuning-reference_intro.md.CobD-lGB.js +0 -1
- package/public/docs/assets/tuning-reference_intro.md.CobD-lGB.lean.js +0 -1
- package/public/docs/assets/tuning-reference_joins.md.BtKs_CuW.js +0 -1
- package/public/docs/assets/tuning-reference_joins.md.BtKs_CuW.lean.js +0 -1
- package/public/docs/assets/tuning-reference_memory-model.md.CWhvgevP.js +0 -1
- package/public/docs/assets/tuning-reference_memory-model.md.CWhvgevP.lean.js +0 -1
- package/public/docs/assets/tuning-reference_metrics.md.mLOh7Apj.js +0 -1
- package/public/docs/assets/tuning-reference_metrics.md.mLOh7Apj.lean.js +0 -1
- package/public/docs/assets/tuning-reference_partitioning.md.q0zKF_8X.js +0 -1
- package/public/docs/assets/tuning-reference_partitioning.md.q0zKF_8X.lean.js +0 -1
- package/public/docs/assets/tuning-reference_pyspark.md.DDCfvN9t.js +0 -6
- package/public/docs/assets/tuning-reference_pyspark.md.DDCfvN9t.lean.js +0 -1
- package/public/docs/assets/tuning-reference_shuffle.md.BZZ7R4Ix.js +0 -1
- package/public/docs/assets/tuning-reference_shuffle.md.BZZ7R4Ix.lean.js +0 -1
- package/public/docs/assets/tuning-reference_spark-architecture.md.Dwzm5avO.js +0 -1
- package/public/docs/assets/tuning-reference_spark-architecture.md.Dwzm5avO.lean.js +0 -1
- package/public/docs/assets/tuning-reference_table-formats.md.D6wj-2dX.js +0 -1
- package/public/docs/assets/tuning-reference_table-formats.md.D6wj-2dX.lean.js +0 -1
- package/public/docs/assets/user-guide_getting-started.md.BJvwLEIM.js +0 -3
- package/public/docs/assets/user-guide_getting-started.md.BJvwLEIM.lean.js +0 -1
- package/public/docs/assets/user-guide_mcp-tools.md.DGvolGzt.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.CQc1aoU8.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.CQc1aoU8.lean.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.B29f0ucS.js +0 -1
- /package/public/docs/assets/{contributor-guide_architecture_board-widgets.md.9ToZXcTk.lean.js → contributor-guide_architecture_board-widgets.md.VTcYTH4d.lean.js} +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PlanGraphRoute-C-BGmC6j.js","./rolldown-runtime-hePW80VL.js","./charts-vendor-0VMaLVLN.js","./react-vendor-BAKt3vny.js","./plan-graph-vendor-B0sEms9Z.js","./plan-graph-vendor-DLioOiRN.css","./DisclosureContext-LYzHroHO.js","./useRecentFiles-BrBl-AP1.js","./impact-sort-7z0ZcBZf.js","./Dashboard-Bo_1jGqH.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{M as t,j as n}from"./charts-vendor-0VMaLVLN.js";import{J as r,Q as i,X as a,Y as o,at as s,it as c,lt as l,ot as u,q as d,st as f}from"./react-vendor-BAKt3vny.js";import{A as p,C as m,I as h,K as g,L as _,N as v,O as y,P as b,Q as x,R as S,U as C,W as w,Y as T,Z as E,_t as D,a as O,at as k,bt as A,c as ee,ct as te,d as ne,dt as j,et as M,ft as N,gt as re,ht as ie,i as ae,it as oe,k as se,lt as ce,ot as le,pt as P,r as ue,rt as F,st as de,t as fe,tt as I,ut as pe,w as me,x as he,yt as L,z as ge}from"./DisclosureContext-LYzHroHO.js";import{p as _e}from"./plan-graph-vendor-B0sEms9Z.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var R=e(t(),1),z=l(),B=_e(),ve=A(`group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none cursor-pointer focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-default disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:cursor-default aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/80`,outline:`border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground`,ghost:`hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50`,destructive:`bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,xs:`h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5`,lg:`h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,icon:`size-8`,"icon-xs":`size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg`,"icon-lg":`size-9`}},defaultVariants:{variant:`default`,size:`default`}});function V({className:e,variant:t=`default`,size:n=`default`,...r}){return(0,B.jsx)(f,{"data-slot":`button`,className:L(ve({variant:t,size:n,className:e})),...r})}function ye({className:e,children:t,value:n,...r}){return(0,B.jsxs)(u,{value:n,"data-slot":`progress`,className:L(`flex flex-wrap gap-3`,e),...r,children:[t,(0,B.jsx)(be,{children:(0,B.jsx)(xe,{})})]})}function be({className:e,...t}){return(0,B.jsx)(s,{className:L(`relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted`,e),"data-slot":`progress-track`,...t})}function xe({className:e,...t}){return(0,B.jsx)(c,{"data-slot":`progress-indicator`,className:L(`h-full bg-primary transition-all`,e),...t})}var Se=(0,R.createContext)(null);function Ce({children:e}){let t=P(e=>e.theme);return(0,R.useEffect)(()=>{if(t===`light`?document.documentElement.setAttribute(`data-theme`,`light`):document.documentElement.removeAttribute(`data-theme`),typeof window<`u`){try{window.localStorage.setItem(`shuffle-works-theme`,t)}catch{}try{window.localStorage.setItem(`vitepress-theme-appearance`,t)}catch{}}},[t]),(0,B.jsx)(Se.Provider,{value:{theme:t,toggle:()=>N.getState().setTheme(t===`dark`?`light`:`dark`)},children:e})}function H(){let e=(0,R.useContext)(Se);if(!e)throw Error(`useTheme outside ThemeProvider`);return e}var we=e(n(),1);function Te(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var Ee=e=>{switch(e){case`success`:return ke;case`info`:return je;case`warning`:return Ae;case`error`:return Me;default:return null}},De=Array(12).fill(0),Oe=({visible:e,className:t})=>R.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},R.createElement(`div`,{className:`sonner-spinner`},De.map((e,t)=>R.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),ke=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),Ae=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),je=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),Me=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),Ne=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`},R.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),R.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),Pe=()=>{let[e,t]=R.useState(document.hidden);return R.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e},Fe=1,Ie=100,Le=e=>typeof e?.id==`number`||e?.id?.length>0?e.id:Fe++,U=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),this.getActiveToasts().forEach(t=>e(t)),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e],this.trimHistory()},this.trimHistory=()=>{let e=this.toasts.length-Ie;e<=0||(this.toasts=this.toasts.filter(t=>e>0&&this.dismissedToasts.has(t.id)?(this.dismissedToasts.delete(t.id),e--,!1):!0))},this.create=e=>{let{message:t,...n}=e,r=Le(e),i=this.pendingDismissals.get(r);i!==void 0&&(cancelAnimationFrame(i),this.pendingDismissals.delete(r),this.dismissedToasts.delete(r));let a=this.dismissedToasts.has(r),o=e.dismissible===void 0||e.dismissible;return a&&(this.dismissedToasts.delete(r),this.toasts=this.toasts.filter(e=>e.id!==r)),!a&&this.toasts.find(e=>e.id===r)?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:o,title:t}):n):this.addToast({title:t,...n,dismissible:o,id:r}),r},this.dismiss=e=>{if(e==null)return this.getActiveToasts().forEach(e=>{this.dismissedToasts.add(e.id),this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e;this.dismissedToasts.add(e);let t=this.pendingDismissals.get(e);return t!==void 0&&cancelAnimationFrame(t),this.pendingDismissals.set(e,requestAnimationFrame(()=>{this.pendingDismissals.delete(e),this.subscribers.forEach(t=>t({id:e,dismiss:!0}))})),e},this.message=(e,t)=>this.create({...t,message:e,type:void 0}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],R.isValidElement(e))i=!1,this.create({id:n,type:`default`,message:e});else if(ze(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),s=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:s}:Object.assign(n,{unwrap:s})},this.custom=(e,t)=>{let n=Le(t);return this.create({...t,jsx:e(n),id:n,type:void 0}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set,this.pendingDismissals=new Map}},Re=(e,t)=>U.message(e,t),ze=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,Be=Object.assign(Re,{success:U.success,info:U.info,warning:U.warning,error:U.error,custom:U.custom,message:U.message,promise:U.promise,dismiss:U.dismiss,loading:U.loading},{getHistory:()=>U.toasts,getToasts:()=>U.getActiveToasts()});Te(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--normal-text);background:var(--normal-bg);border:1px solid var(--normal-border);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{-webkit-user-select:none;user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function Ve(e){return e.label!==void 0}var He=3,Ue=`24px`,We=`16px`,Ge=4e3,Ke=356,qe=14,Je=45,Ye=200;function Xe(...e){return e.filter(Boolean).join(` `)}function Ze(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var Qe=e=>{let{invert:t,toast:n,unstyled:r,interacting:i,setHeights:a,visibleToasts:o,heights:s,index:c,toasts:l,expanded:u,removeToast:d,defaultRichColors:f,closeButton:p,style:m,cancelButtonStyle:h,actionButtonStyle:g,className:_=``,descriptionClassName:v=``,duration:y,position:b,gap:x,expandByDefault:S,classNames:C,icons:w,closeButtonAriaLabel:T=`Close toast`}=e,[E,D]=R.useState(null),[O,k]=R.useState(null),[A,ee]=R.useState(!1),[te,ne]=R.useState(!1),[j,M]=R.useState(!1),[N,re]=R.useState(!1),[ie,ae]=R.useState(!1),[oe,se]=R.useState(0),[ce,le]=R.useState(0),P=R.useRef(n.duration||y||Ge),ue=R.useRef(null),F=R.useRef(null),de=c===0,fe=c+1<=o,I=n.type,pe=I??`default`,me=n.dismissible!==!1,he=n.className||``,L=n.descriptionClassName||``,ge=R.useMemo(()=>s.findIndex(e=>e.toastId===n.id)||0,[s,n.id]),_e=R.useMemo(()=>n.closeButton??p,[n.closeButton,p]),z=R.useMemo(()=>n.duration||y||Ge,[n.duration,y]),B=R.useRef(0),ve=R.useRef(0),V=R.useRef(0),ye=R.useRef(null),[be,xe]=b.split(`-`),Se=R.useMemo(()=>s.reduce((e,t,n)=>n>=ge?e:e+t.height,0),[s,ge]),Ce=Pe(),H=R.useMemo(()=>e.swipeDirections??Ze(b),[e.swipeDirections,b]),we=n.invert||t,Te=I===`loading`;ve.current=R.useMemo(()=>ge*x+Se,[ge,Se]),R.useEffect(()=>{P.current=z},[z]),R.useEffect(()=>{ee(!0)},[]),R.useEffect(()=>{let e=F.current;if(e){let t=e.getBoundingClientRect().height;return le(t),a(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>a(e=>e.filter(e=>e.toastId!==n.id))}},[a,n.id]),R.useLayoutEffect(()=>{if(!A)return;let e=F.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,le(r),a(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[A,n.title,n.description,a,n.id,n.jsx,n.action,n.cancel]);let De=R.useCallback(()=>{ne(!0),se(ve.current),a(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{d(n)},Ye)},[n,d,a,ve]);R.useEffect(()=>{if(n.promise&&I===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return u||i||Ce?(()=>{if(V.current<B.current){let e=new Date().getTime()-B.current;P.current-=e}V.current=new Date().getTime()})():P.current!==1/0&&(B.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),De()},P.current)),()=>clearTimeout(e)},[u,i,n,I,Ce,De]),R.useEffect(()=>{n.delete&&(De(),n.onDismiss==null||n.onDismiss.call(n,n))},[De,n.delete]);function ke(){return w?.loading?R.createElement(`div`,{className:Xe(C?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":I===`loading`},w.loading):R.createElement(Oe,{className:Xe(C?.loader,n?.classNames?.loader),visible:I===`loading`})}let Ae=n.icon||w?.[I]||Ee(I);return R.createElement(`li`,{tabIndex:0,ref:F,className:Xe(_,he,C?.toast,n?.classNames?.toast,C?.[pe],n?.classNames?.[pe]),"data-sonner-toast":``,"data-rich-colors":n.richColors??f,"data-styled":!(n.jsx||n.unstyled||r),"data-mounted":A,"data-promise":!!n.promise,"data-swiped":ie,"data-removed":te,"data-visible":fe,"data-y-position":be,"data-x-position":xe,"data-index":c,"data-front":de,"data-swiping":j,"data-dismissible":me,"data-type":I,"data-invert":we,"data-swipe-out":N,"data-swipe-direction":O,"data-expanded":!!(u||S&&A),"data-testid":n.testId,style:{"--index":c,"--toasts-before":c,"--z-index":l.length-c,"--offset":`${te?oe:ve.current}px`,"--initial-height":S?`auto`:`${ce}px`,...m,...n.style},onDragEnd:()=>{M(!1),D(null),ye.current=null},onPointerDown:e=>{e.button!==2&&!Te&&me&&(ue.current=new Date,se(ve.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(M(!0),ye.current={x:e.clientX,y:e.clientY}))},onPointerUp:()=>{if(N||!me)return;ye.current=null;let e=Number(F.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(F.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-ue.current?.getTime(),i=E===`x`?e:t,a=Math.abs(i)/r;if((E===`x`?H.includes(e>0?`right`:`left`):H.includes(t>0?`bottom`:`top`))&&(Math.abs(i)>=Je||a>.11)){se(ve.current),n.onDismiss==null||n.onDismiss.call(n,n),k(E===`x`?e>0?`right`:`left`:t>0?`down`:`up`),De(),re(!0);return}var o,s;(o=F.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=F.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`),ae(!1),M(!1),D(null)},onPointerMove:e=>{var t,n;if(!ye.current||!me||window.getSelection()?.toString().length>0)return;let r=e.clientY-ye.current.y,i=e.clientX-ye.current.x;!E&&(Math.abs(i)>1||Math.abs(r)>1)&&D(Math.abs(i)>Math.abs(r)?`x`:`y`);let a={x:0,y:0},o=e=>1/(1.5+Math.abs(e)/20);if(E===`y`){if(H.includes(`top`)||H.includes(`bottom`)){if(H.includes(`top`)&&r<0||H.includes(`bottom`)&&r>0)a.y=r;else{let e=r*o(r);a.y=Math.abs(e)<Math.abs(r)?e:r}}}else if(E===`x`&&(H.includes(`left`)||H.includes(`right`))){if(H.includes(`left`)&&i<0||H.includes(`right`)&&i>0)a.x=i;else{let e=i*o(i);a.x=Math.abs(e)<Math.abs(i)?e:i}}(Math.abs(a.x)>0||Math.abs(a.y)>0)&&ae(!0),(t=F.current)==null||t.style.setProperty(`--swipe-amount-x`,`${a.x}px`),(n=F.current)==null||n.style.setProperty(`--swipe-amount-y`,`${a.y}px`)}},_e&&!n.jsx&&I!==`loading`?R.createElement(`button`,{"aria-label":T,"data-disabled":Te,"data-close-button":!0,onClick:Te||!me?()=>{}:()=>{De(),n.onDismiss==null||n.onDismiss.call(n,n)},className:Xe(C?.closeButton,n?.classNames?.closeButton)},w?.close??Ne):null,(I||n.icon||n.promise)&&n.icon!==null&&(w?.[I]!==null||n.icon)?R.createElement(`div`,{"data-icon":``,className:Xe(C?.icon,n?.classNames?.icon)},I===`loading`?n.icon||ke():n.promise?ke():null,I===`loading`?null:Ae):null,R.createElement(`div`,{"data-content":``,className:Xe(C?.content,n?.classNames?.content)},R.createElement(`div`,{"data-title":``,className:Xe(C?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?R.createElement(`div`,{"data-description":``,className:Xe(v,L,C?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),R.isValidElement(n.cancel)?n.cancel:n.cancel&&Ve(n.cancel)?R.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||h,onClick:e=>{Ve(n.cancel)&&me&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),De())},className:Xe(C?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,R.isValidElement(n.action)?n.action:n.action&&Ve(n.action)?R.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||g,onClick:e=>{Ve(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&De())},className:Xe(C?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function $e(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function et(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?We:Ue;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var tt=R.forwardRef(function(e,t){let{id:n,invert:r,position:i=`bottom-right`,hotkey:a=[`altKey`,`KeyT`],expand:o,closeButton:s,className:c,offset:l,mobileOffset:u,theme:d=`light`,richColors:f,duration:p,style:m,visibleToasts:h=He,toastOptions:g,dir:_=$e(),gap:v=qe,icons:y,customAriaLabel:b,containerAriaLabel:x=`Notifications`}=e,[S,C]=R.useState([]),w=R.useMemo(()=>n?S.filter(e=>e.toasterId===n):S.filter(e=>!e.toasterId),[S,n]),T=R.useMemo(()=>Array.from(new Set([i].concat(w.filter(e=>e.position).map(e=>e.position)))),[w,i]),[E,D]=R.useState([]),[O,k]=R.useState(!1),[A,ee]=R.useState(!1),[te,ne]=R.useState(d===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:d),j=R.useRef(null),M=a.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),N=R.useRef(null),re=R.useRef(!1),ie=R.useCallback(e=>{C(t=>(t.find(t=>t.id===e.id)?.delete||U.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return R.useEffect(()=>U.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{C(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{we.flushSync(()=>{C(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[]),R.useEffect(()=>{if(d!==`system`){ne(d);return}if(d===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?ne(`dark`):ne(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{ne(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{ne(e?`dark`:`light`)}catch(e){console.error(e)}})}},[d]),R.useEffect(()=>{S.length<=1&&k(!1)},[S]),R.useEffect(()=>{let e=e=>{if(a.length>0&&a.every(t=>e[t]||e.code===t)){var t;k(!0),(t=j.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===j.current||j.current?.contains(document.activeElement))&&k(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[a]),R.useEffect(()=>{if(j.current)return()=>{N.current&&(N.current.focus({preventScroll:!0}),N.current=null,re.current=!1)}},[j.current]),R.createElement(`section`,{ref:t,"aria-label":b??`${x} ${M}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0,"data-react-aria-top-layer":!0},T.map((t,n)=>{let[i,a]=t.split(`-`);return w.length?R.createElement(`ol`,{key:t,dir:_===`auto`?$e():_,tabIndex:-1,ref:j,className:c,"data-sonner-toaster":!0,"data-sonner-theme":te,"data-y-position":i,"data-x-position":a,style:{"--front-toast-height":`${E[0]?.height||0}px`,"--width":`${Ke}px`,"--gap":`${v}px`,...m,...et(l,u)},onBlur:e=>{re.current&&!e.currentTarget.contains(e.relatedTarget)&&(re.current=!1,N.current&&=(N.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||re.current||(re.current=!0,N.current=e.relatedTarget)},onMouseEnter:()=>k(!0),onMouseMove:()=>k(!0),onMouseLeave:()=>{A||k(!1)},onDragEnd:()=>k(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||ee(!0)},onPointerUp:()=>ee(!1)},w.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>R.createElement(Qe,{key:n.id,icons:y,index:i,toast:n,defaultRichColors:f,duration:g?.duration??p,className:g?.className,descriptionClassName:g?.descriptionClassName,invert:r,visibleToasts:h,closeButton:g?.closeButton??s,interacting:A,position:t,style:g?.style,unstyled:g?.unstyled,classNames:g?.classNames,cancelButtonStyle:g?.cancelButtonStyle,actionButtonStyle:g?.actionButtonStyle,closeButtonAriaLabel:g?.closeButtonAriaLabel,removeToast:ie,toasts:w.filter(e=>e.position==n.position),heights:E.filter(e=>e.position==n.position),setHeights:D,expandByDefault:o,gap:v,expanded:O,swipeDirections:e.swipeDirections}))):null}))}),nt={name:`activity`,size:24,node:[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]};nt.node;var rt=j(nt),it={name:`arrow-right`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]};it.node;var at=j(it),ot={name:`book-open`,size:24,node:[[`path`,{d:`M12 5v16`,key:`1f6ucr`}],[`path`,{d:`M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z`,key:`1fyvmf`}]]};ot.node;var st=j(ot),ct={name:`bot`,size:24,node:[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]};ct.node;var lt=j(ct),ut={name:`circle-check`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m16 9-5.5 5.5L8 12`,key:`xofnsj`}]],aliases:[`check-circle-2`]};ut.node;var dt=j(ut),ft={name:`git-compare-arrows`,size:24,node:[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`M12 18H7a2 2 0 0 1-2-2V9`,key:`16sdep`}],[`path`,{d:`m9 15 3 3-3 3`,key:`1m3kbl`}]]};ft.node;var pt=j(ft),mt={name:`info`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]};mt.node;var ht=j(mt),gt={name:`loader-circle`,size:24,node:[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]],aliases:[`loader-2`]};gt.node;var _t=j(gt),vt={name:`moon`,size:24,node:[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]};vt.node;var yt=j(vt),bt={name:`octagon-x`,size:24,node:[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]],aliases:[`x-octagon`]};bt.node;var xt=j(bt),St={name:`server`,size:24,node:[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]};St.node;var Ct=j(St),wt={name:`shield-check`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]};wt.node;var Tt=j(wt),Et={name:`sun`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]};Et.node;var Dt=j(Et),Ot={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};Ot.node;var kt=j(Ot),At={name:`upload`,size:24,node:[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]};At.node;var jt=j(At),Mt={name:`workflow`,size:24,node:[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`,key:`by2w9f`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`,key:`xkn7yn`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`,key:`1cgmvn`}]]};Mt.node;var Nt=j(Mt),Pt={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};Pt.node;var Ft=j(Pt),It=({...e})=>{let{theme:t}=H();return(0,B.jsx)(tt,{theme:t,className:`toaster group`,icons:{success:(0,B.jsx)(dt,{className:`size-4`}),info:(0,B.jsx)(ht,{className:`size-4`}),warning:(0,B.jsx)(kt,{className:`size-4`}),error:(0,B.jsx)(xt,{className:`size-4`}),loading:(0,B.jsx)(_t,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},toastOptions:{classNames:{toast:`cn-toast`}},...e})};function Lt(e,t,n){switch(e.type){case`progress`:t.onProgress?.(e);break;case`app`:t.onApp?.(e.data);break;case`stage`:t.onStage?.(e.data);break;case`sql`:t.onSql?.(e.data);break;case`sqlPlan`:t.onSqlPlan?.(e.data);break;case`executor`:t.onExecutor?.(e.data);break;case`job`:t.onJob?.(e.data);break;case`runAggregates`:t.onRunAggregates?.(e.data);break;case`stageExecutorMetrics`:t.onStageExecutorMetrics?.(e.data);break;case`stageSpeculationWaste`:t.onStageSpeculationWaste?.(e.data);break;case`done`:{let{skippedLines:n}=e;t.onDone?.({skippedLines:n});break}case`error`:t.onError?.(e);break;case`taskData`:{let t=n?.get(e.reqId);t&&(t.resolve({metrics:e.metrics,fieldNames:e.fieldNames}),n.delete(e.reqId));break}}}function Rt(){let e=null,t=new Map,n=0,r={};function i(){e=new Worker(new URL(new URL(`parser-worker-Q5KCPdKT.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),e.onmessage=({data:e})=>Lt(e,r,t),e.onerror=e=>{r.onError?.(`Worker crashed: ${e.message}`),u()}}function a(t,n){r=n,i(),e.postMessage({type:`parse`,file:t})}function o(t,n){r=n,i(),e.postMessage({type:`parseFromUrl`,request:t})}function s(t,n){r=n,i(),e.postMessage({type:`parseFiles`,files:t})}function c(r){return new Promise((i,a)=>{let o=String(n++);t.set(o,{resolve:i,reject:a}),e.postMessage({type:`getTaskData`,stageId:r,reqId:o})})}async function l(e){return await Promise.all(e.map(e=>c(e).then(t=>({stageId:e,...t}))))}function u(){e?.terminate(),e=null;for(let{reject:e}of t.values())e(Error(`Worker terminated`));t.clear()}return{startParse:a,startParseFromUrl:o,startParseFiles:s,requestTaskData:c,prefetchFlaggedStages:l,terminate:u}}function zt(e,{onProgress:t,onDone:n,onError:r}){return{onProgress:t,onApp(t){e.app=t},onStage(t){let n=t;e.stages.set(n.id,n)},onSql(t){let n=t;e.sql.set(n.id,t);for(let t of n.stageIds??[]){let r=e.stages.get(t);r&&(r.sqlExecutionId=n.id)}},onSqlPlan(t){let n=t,r=e.sql.get(n.executionId);r&&(r.planTree=n.planTree)},onExecutor(t){let n=t;n.kind===`added`?e.executors.added.push(n):e.executors.removed.push(n)},onJob(t){let n=t;e.jobs.set(n.id,n)},onRunAggregates(t){e.runAggregates=t},onStageExecutorMetrics(t){if(!(t instanceof Map))return;let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.executorMetrics=r)}},onStageSpeculationWaste(t){let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.speculationWasteMs=r.speculationWasteMs,n.speculationWastedAttempts=r.speculationWastedAttempts)}},onDone:n,onError:r}}function Bt(e,t,{dedupe:n=!1}={}){if(!e)return;let r=n?new Set:null,i=[{node:e,parent:null}];for(;i.length>0;){let{node:e,parent:n}=i.pop();if(r){if(r.has(e))continue;r.add(e)}t(e,n);let a=e.children??[];for(let t=a.length-1;t>=0;t--)i.push({node:a[t],parent:e})}}function Vt(e){for(let t of e.metrics??[]){if(t.metricType===`timing`)return t.value;if(t.metricType===`nsTiming`)return t.value/1e6}for(let t of e.metrics??[])if(/time/i.test(t.name)&&typeof t.value==`number`)return t.value;return null}function Ht(e){let t=[],n=new Map,r=new Map;if(!e)return{segments:t,segOf:n,segmentTopology:r};let i=1,a=0;return Bt(e,(e,o)=>{let s;if(!o)s=0,r.set(s,{parentIndex:null,depth:0,traversalOrder:a++});else if(o.exchangeRole===`read`){let e=n.get(o);s=i++,r.set(s,{parentIndex:e,depth:r.get(e).depth+1,traversalOrder:a++})}else s=n.get(o);n.set(e,s),(t[s]??=[]).push(e)},{dedupe:!0}),{segments:t,segOf:n,segmentTopology:r}}function Ut(e,t,n,r){let i=e.filter(Boolean).map((e,t)=>({i:t,nodes:e,...r.get(t)})).sort((e,t)=>t.depth-e.depth||e.traversalOrder-t.traversalOrder),a=[...n].map(e=>({id:e,s:t.get(e)})).filter(e=>!!e.s).sort((e,t)=>e.s.submittedAt-t.s.submittedAt),o=Math.min(i.length,a.length),s=[];for(let e=0;e<o;e++)s.push({segmentIndex:i[e].i,stageId:a[e].id,nodes:i[e].nodes,stage:a[e].s});return{orderedSegments:i,orderedStages:a,pairs:s}}function Wt(e,t,n){let r=new Map,i=e,a=0;for(;i!=null;)r.set(i,a++),i=n.get(i)?.parentIndex??null;for(i=t,a=0;i!=null;){let e=r.get(i);if(e!=null)return e+a;i=n.get(i)?.parentIndex??null,a++}return 1/0}function Gt(e,t,n,r){let i=t,a=r,{orderedSegments:o,pairs:s}=Ut(e,i,n,a),c=new Map(s.map(e=>[e.segmentIndex,e.stageId])),l=s.map(e=>e.segmentIndex);if(l.length===0)return c;for(let{i:e}of o){if(c.has(e))continue;let t=l[0],n=Wt(e,t,a);for(let r of l){let i=Wt(e,r,a);i<n&&(n=i,t=r)}c.set(e,c.get(t))}return c}function Kt(e){let t=new Map;for(let{nodes:n,stage:r}of e){let{submittedAt:e,completedAt:i}=r,a=Math.max(0,i-e),o=n.map(Vt),s=o.reduce((e,t)=>e+(t??0),0);n.forEach((e,r)=>{let i=s>0?a*((o[r]??0)/s):a/n.length;t.set(e,i)})}return t}function qt(e,t,n){let r=n?.stageIds??[];if(!e||r.length===0)return new Map;let{segments:i,segmentTopology:a}=Ht(e),{pairs:o}=Ut(i,t,r,a);return Kt(o)}function Jt(e,t,n){let r=n?.stageIds??[],i=new Map;if(!e||r.length===0)return i;let{segments:a,segmentTopology:o}=Ht(e),{pairs:s}=Ut(a,t,r,o),c=Kt(s);for(let{nodes:e}of s){let t=new Set(e);for(let n of e){let e=new Set;function r(n){if(e.has(n))return 0;e.add(n);let i=c.get(n)??0;for(let e of n.children??[])t.has(e)&&(i+=r(e));return i}i.set(n,r(n))}}return i}function Yt(e,t){let n=[];for(let r of t.values())r.sqlExecutionId===e&&n.push(r.id);return n}var Xt=[`serializefromobject`,`deserializetoobject`,`mapelements`,`mappartitions`,`inputadapter`,`columnartorow`,`rowtocolumnar`,`union`];function Zt(e){let t=(e??``).toLowerCase();return t.startsWith(`scan`)?`scan`:t.includes(`exchange`)?`exchange`:t.includes(`join`)?`join`:t.includes(`aggregate`)?`aggregate`:t.startsWith(`sort`)?`sort`:t.startsWith(`filter`)?`filter`:t===`adaptivesparkplan`?`aqe`:Xt.some(e=>t.startsWith(e))||t.startsWith(`wholestagecodegen`)?`boilerplate`:`transform`}function Qt(e){return e.exchangeRole!==void 0||Zt(e.name)===`exchange`}function $t(e){return e===`BroadcastExchange`}function en(e,t){if(!t||t===e)return``;let n=(e??``).toLowerCase(),r=e=>e.replace(/#\d+/g,``);if(Xt.some(e=>n.startsWith(e))||n===`adaptivesparkplan`)return``;if(n.startsWith(`wholestagecodegen`)){let t=e.match(/\((\d+)\)/);return t?`codegen #${t[1]}`:``}if(n.includes(`exchange`)){let e=t.match(/Exchange\s+(\w+partitioning)\(([^)]+)\)/i);if(e){let t=e[1].toLowerCase().startsWith(`hash`)?`hash`:`range`,n=r(e[2]).split(`,`).map(e=>e.trim()),i=/^\d+$/.test(n[n.length-1])?n.pop():null;return`${t}(${n.map(e=>e.replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,`↑`).replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,`↓`).trim()).slice(0,3).join(`, `)}${i?`, ${i}`:``})`}let n=t.match(/Exchange\s+(\w+)/);return n?n[1]:``}if(n.startsWith(`sort`)&&!n.includes(`merge`)){let e=t.match(/Sort\s+\[([^\]]+)\]/);if(e)return r(e[1]).split(`,`).map(e=>e.trim().replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,`↑`).replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,`↓`)).slice(0,4).join(`, `)}if(n.includes(`join`)){let e=t.match(/Join\s+\[([^\]]*)\][^,]*,\s*\[[^\]]*\][^,]*,\s*(\w+)/i);if(e){let t=r(e[1]).split(`,`)[0].trim();return t?`${t} ${e[2]}`:e[2]}}if(n.includes(`aggregate`)){let e=t.match(/functions=\[([^\]]+)\]/);if(e){let t=[...new Set(e[1].split(`,`).map(e=>(e.trim().match(/^(\w+)\(/)?.[1]??``).replace(/^partial_/,``)))].filter(Boolean);return t.slice(0,5).join(`, `)+(t.length>5?` +${t.length-5}`:``)}}if(n.startsWith(`filter`)){let e=t.match(/Filter\s+(.+)/s);if(e){let t=r(e[1]).trim().replace(/^\((.+)\)$/s,`$1`);return t.length>70?t.slice(0,70)+`…`:t}}if(n.startsWith(`project`)){let e=t.match(/Project\s+\[([^\]]+)\]/);if(e){let t=r(e[1]).split(`,`).map(e=>e.trim());return t.length<=3?t.join(`, `):`${t.length} columns`}return``}if(n.startsWith(`scan`)){if(n.includes(`existingrdd`)){let t=M(e);if(t!==e)return t}let t=e.match(/Scan\s+(\S+)/);return t?t[1]:``}let i=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r(t).replace(RegExp(`^${i}\\s*`,`i`),``).trim();return a.length>80?a.slice(0,80)+`…`:a}function tn(e){let{value:t,metricType:n}=e;return typeof t==`string`?t:n===`size`?w(t):n===`timing`?g(t):n===`nsTiming`?g(t/1e6):t.toLocaleString(`en-US`)}function nn(e){return!e||e.length===0?``:tn([`number of output rows`,`size of files read`,`spill size`,`duration`].map(t=>e.find(e=>e.name===t)).find(Boolean)??e[0])}function rn(e,t,n,r,i=`exclusive`){if(!e||!n)return null;let a=Yt(r,t.stages);if(!a.length)return null;let o=new Map;for(let e of a){let n=t.stages.get(e);n&&o.set(e,{submittedAt:n.submittedAt,completedAt:n.completedAt})}return i===`inclusive`?Jt(e,o,{...n,stageIds:a}):qt(e,o,{...n,stageIds:a})}function an(e){return e.trim().replace(/#\w+$/,``)}function on(e){return e.replace(/^\[|\]$/g,``).split(`,`).map(an).filter(Boolean)}function sn(e){let t=[],n=0,r=0;for(let i=0;i<e.length;i++)e[i]===`(`?n++:e[i]===`)`?n--:e[i]===`,`&&n===0&&(t.push(e.slice(r,i).trim()),r=i+1);return t.push(e.slice(r).trim()),t.filter(Boolean)}function cn(e,t){e.warnings.push({type:`crossJoin`,detail:`${t} detected: this can cause severe data explosion.`})}function ln(e,t){e.warnings.push({type:`longFilterCondition`,detail:`Filter condition is ${t} characters: consider simplifying or pushing the filter down closer to the scan.`})}function un(e,t){let n=null,r=null,i=e.match(/^Scan\s+(parquet|orc|csv|json)\s+(spark_catalog\.\S+)$/i);if(!i&&!/FileScan/i.test(t)&&!t.includes(`JDBCRelation`))return null;if(i)n=i[1].toLowerCase(),r=i[2];else{let e=t.match(/FileScan\s+(parquet|orc|csv|json)\s+(spark_catalog\.[^[\s]+)\[/i);e&&(n=e[1].toLowerCase(),r=e[2])}if(r)return/PreparedDeltaFileIndex/i.test(t)&&(n=`delta`),`${n}:${r.replace(/^spark_catalog\./,``)}`;if(/_delta_log/.test(e)||/_delta_log/.test(t)||/DeltaLogFileIndex/i.test(e+t)||/checkpointMetadata#|sidecar#|commitInfo#/.test(e+t))return null;let a=t.match(/FileScan\s+(parquet|orc|csv|json)\b/i);if(a){let e=t.match(/Location:[^[]*\[([^\]]+)\]/);return e?`${a[1].toLowerCase()}:${M(e[1].split(`,`)[0].trim())}`:null}if(/JDBCRelation/.test(t)){let e=dn(t).match(/\bFROM\s+(\(|[A-Za-z_][\w.]*)/i);return!e||e[1]===`(`?null:`jdbc:${e[1].toLowerCase()}`}return null}function dn(e){let t=e.match(/JDBCRelation\(([\s\S]+?)\)\s*(?:SPARK_GEN_SUBQ_\d+\)?)?\s*\[numPartitions/),n=e.match(/JDBCRelation\(\(([\s\S]+?)\)\s*SPARK_GEN_SUBQ/);return(n?n[1]:t?t[1]:``).replace(/\s+/g,` `).trim()}function fn(e,t,n){let r=un(e,t);if(!r)return!1;let i=r.indexOf(`:`),a=r.slice(0,i),o=r.slice(i+1);if(a===`jdbc`)return n.scans.push({path:o,format:a,projectedColumns:[],pushedFilters:[],sql:dn(t)}),!0;let s=t.match(/FileScan\s+\w+\s+(\[[^\]]*\])/i)??t.match(/(\[[^\]]*\])/),c=t.match(/PushedFilters:\s*\[([^\]]*)\]/);return n.scans.push({path:o,format:a,projectedColumns:s?on(s[1]):[],pushedFilters:c&&c[1]?c[1].split(`,`).map(e=>e.trim()).filter(Boolean):[]}),!0}function pn(e,t,n){let r=t.match(/^(SortMergeJoin|BroadcastHashJoin|ShuffledHashJoin|BroadcastNestedLoopJoin)\s+(\[[^\]]*\]),\s*(\[[^\]]*\]),\s*(\w+)/);return r?(n.joins.push({joinType:r[1],leftKeys:on(r[2]),rightKeys:on(r[3])}),/^Cross$/i.test(r[4])&&cn(n,`Cross join`),!0):!1}function mn(e,t,n){let r=t.match(/(?:Object)?HashAggregate\(keys=(\[[^\]]*\]),\s*functions=(\[[\s\S]*\])\)/);if(!r)return!1;let i=r[2].replace(/^\[|\]$/g,``);if(/\bpartial_/.test(i))return!0;let a=sn(i).map(e=>e.replace(/#\w+/g,``).trim()).filter(Boolean).slice(0,8),o=on(r[1]);return(o.length||a.length)&&n.aggs.push({groupByKeys:o,aggregations:a}),!0}function hn(e,t){let n=e.match(/hashpartitioning\((.+?),\s*(\d+)\)/i),r=e.match(/rangepartitioning\((.+?),\s*(\d+)\)/i);if(n)t.exchanges.push({partitioning:`hash`,keys:sn(n[1]).map(e=>an(e.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,``))).filter(Boolean),numPartitions:parseInt(n[2],10)});else if(r)t.exchanges.push({partitioning:`range`,keys:sn(r[1]).map(e=>an(e.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,``))).filter(Boolean),numPartitions:parseInt(r[2],10)});else if(/RoundRobinPartitioning/i.test(e)){let n=e.match(/RoundRobinPartitioning\((\d+)\)/i);t.exchanges.push({partitioning:`roundrobin`,keys:[],numPartitions:n?parseInt(n[1],10):0})}else/SinglePartition/i.test(e)&&t.exchanges.push({partitioning:`single`,keys:[],numPartitions:1})}function gn(e){let t={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]};return e&&Bt(e,e=>{let n=e.name??``,r=e.detail??``;if(/CartesianProduct/i.test(n)||/CartesianProduct/i.test(r))cn(t,`CartesianProduct`);else if(!fn(n,r,t)&&!(/Join/i.test(n)&&pn(n,r,t))&&!(/Aggregate/i.test(n)&&mn(n,r,t))){if(e.exchangeRole===`read`)hn(r,t);else if(/^Filter/i.test(n)){let e=r.match(/^Filter\s+([\s\S]+)/);e&&e[1].trim().length>1e3&&ln(t,e[1].trim().length)}}},{dedupe:!0}),t}function _n(e){if(!e)return null;let t=e.name??``,n=e.detail??``,r={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]},i=null;if(/CartesianProduct/i.test(t)||/CartesianProduct/i.test(n))i=`cartesian`,cn(r,`CartesianProduct`);else if(fn(t,n,r))i=`scan`;else if(/Join/i.test(t)&&pn(t,n,r))i=`join`;else if(/Aggregate/i.test(t)&&mn(t,n,r))i=`agg`;else if(Qt(e))i=`exchange`,hn(n,r);else if(/^Filter/i.test(t)){i=`filter`;let e=n.match(/^Filter\s+([\s\S]+)/);e&&e[1].trim().length>1e3&&ln(r,e[1].trim().length)}let a=r.scans[0]?`scan`:r.joins[0]?`join`:r.aggs[0]?`agg`:r.exchanges[0]||i===`exchange`&&e.exchangeRole!==`write`?`exchange`:null,o=r.scans[0]??r.joins[0]??r.aggs[0]??r.exchanges[0]??null,s=r.warnings[0]??null;return!i||(i===`agg`||i===`filter`)&&!a&&!s?null:{kind:a,warning:s,...o??{}}}function vn(e,t){let n=t.reduce((e,t)=>e+(t.totalCores??0),0);if(n<=0){let r=e.resources?.executor?.cores??null;n=r==null?0:t.length*r}return n}function yn(e){let t=[...e].sort((e,t)=>e.time-t.time||e.delta-t.delta),n=0,r=0;for(let e of t)n+=e.delta,n>r&&(r=n);return r}function bn(e,t,n){let r=new Map,i=[];for(let e of t){let t=e.totalCores??0;r.set(e.executorId,t),i.push({time:e.timestamp,delta:t})}for(let e of n){let t=r.get(e.executorId)??0;i.push({time:e.timestamp,delta:-t})}let a=yn(i);if(a>0)return a;let o=xn(t,n),s=e.resources?.executor?.cores??null;return s==null?0:o*s}function xn(e,t){return yn([...e.map(e=>({time:e.timestamp,delta:1})),...t.map(e=>({time:e.timestamp,delta:-1}))])}var Sn=new Set([`RACK_LOCAL`,`ANY`]),Cn=5,wn=10,Tn={totalTasks:null,nonLocalTasks:null,ratio:null,topStages:[]};function En(e,{minTasksPerStage:t=wn,topN:n=Cn}={}){if(!Array.isArray(e)||e.length===0)return Tn;let r=0,i=0,a=[];for(let n of e){let e=n?.localityStats;if(!Array.isArray(e)||e.length===0)continue;let o=0,s=0;for(let{locality:t,count:n}of e)Number.isFinite(n)&&(o+=n,Sn.has(t)&&(s+=n));r+=o,i+=s,o>=t&&a.push({stageId:n.id,nonLocalTasks:s,taskCount:o,ratio:s/o})}if(r===0)return Tn;let o=a.sort((e,t)=>t.nonLocalTasks-e.nonLocalTasks).slice(0,n);return{totalTasks:r,nonLocalTasks:i,ratio:i/r,topStages:o}}function Dn(e){return(e.completedAt??0)-(e.submittedAt??0)}function On(e){let t=Dn(e);return t>0?(e.executorRunTime??0)/t:0}function kn(e){let t=[...e.values()].filter(e=>Dn(e)>0),n=new Map;for(let e of t)n.set(e.id,0);if(t.length===0)return n;let r=[];for(let e of t){let t=On(e);r.push({time:e.submittedAt??0,id:e.id,weight:t,isStart:!0}),r.push({time:e.completedAt??0,id:e.id,weight:t,isStart:!1})}r.sort((e,t)=>e.time-t.time);let i=new Map,a=r[0].time,o=0;for(;o<r.length;){let e=r[o].time;if(e>a&&i.size>0){let t=e-a,r=0;for(let e of i.values())r+=e;for(let[e,a]of i){let o=r>0?a/r:1/i.size;n.set(e,(n.get(e)??0)+t*o)}}for(;o<r.length&&r[o].time===e;){let e=r[o];e.isStart?i.set(e.id,e.weight):i.delete(e.id),o++}a=e}return n}function An(e){let t=kn(e),n=new Map;for(let r of e.values()){let e=Dn(r);if(e<=0)continue;let i=t.get(r.id)??0;n.set(r.id,Math.min(1,i/e))}return n}function jn(e,t){let n=e.taskDurationMax??0;if(t<=0)return n;let r=e.executorRunTime??0;return Math.max(n,r/t)}function Mn(e,t,n){let r=Math.max(0,Dn(t)-n);return Math.min(e,r)}function Nn(e,t){let n=An(e),r=new Map;for(let i of e.values()){let e=n.get(i.id);e!==void 0&&r.set(i.id,{gate:e,ceiling:jn(i,t),coreWorkFloor:t>0?(i.executorRunTime??0)/t:0})}return r}var Pn=.999;function Fn(e,t){if(e.tailReplayRecoveryMs!=null)return e.tailReplayRecoveryMs;let n=e.stragglerExcessMs??0,r=e.peakConcurrentTasks??0;return n<=0||r<=0?t:Math.max(t,n/r)}function In(e,t){return Math.max(t,e.stragglerExcessMs??0)}function Ln(e){let t=e.taskDurationP50??0;return!((e.stragglerCount??0)>0)||e.longestNonStragglerMs==null?t:Math.max(t,e.longestNonStragglerMs)}function Rn(e,t,n,r,{shortensLongestTask:i=!1,removedCoreWorkMs:a=0,longestTaskAfterFixMs:o=0}={}){let s=n.get(t),c=r.get(t);if(!s||!c)return null;let l=s.executorRunTime??0,u=a>0&&l>0?c.coreWorkFloor*Math.max(0,1-a/l):c.coreWorkFloor,d=Mn(e,s,i?Math.max((s.taskDurationMax??0)-e,o,u):c.ceiling);return c.gate>=Pn?{basis:`serial`,wallClock:{low:d,high:d}}:{basis:`contended`,wallClock:{low:d*c.gate,high:d}}}function zn(e,t,n,r){let i=[],a=[];for(let o of e){let e=Rn(t.get(o)??0,o,n,r);if(!e)continue;i.push(e);let s=n.get(o);a.push([s.submittedAt??0,s.completedAt??0])}if(i.length===0)return null;let o=i.reduce((e,t)=>e+t.wallClock.high,0),s=i.reduce((e,t)=>e+t.wallClock.low,0),c=_(a).reduce((e,[t,n])=>e+(n-t),0),l=Math.min(o,c),u=Math.min(s,c);return{basis:i.every(e=>e.basis===`serial`)?`serial`:`contended`,wallClock:{low:u,high:l}}}var Bn=.005,Vn=.02,Hn={warnPct:Bn,critPct:Vn};function Un(e){if(e?.startTime==null||e?.endTime==null)return null;let t=e.endTime-e.startTime;return t>0?t:null}function Wn(e,t,n){let r=Un(t);if(r==null)return e;for(let t of e){if(t.type===`partitionSizing`&&t.rule===`maxPartitionTooBig`)continue;let e=t.impactEstimate?.wallClock?.high;if(e==null)continue;let i=e/r,{warnPct:a,critPct:o}=n?.(t.type)??Hn;t.impactBand=i>=o?`critical`:i>=a?`warning`:`info`}return e}var Gn=125e6,Kn=2e8;function qn(e){let t=(Array.isArray(e.executorStats)?e.executorStats:[]).reduce((e,t)=>e+(t.totalDuration??0),0),n=e.taskCount??0,r=(e.completedAt??0)-(e.submittedAt??0),i=t-(e.executorRunTime??0);return t<=0||n<=0||r<=0||i<=0?null:{perTaskMs:i/n,concurrency:t/r}}function Jn(e){let t=Array.isArray(e.executorStats)?e.executorStats.length:0;return Math.max(1,t)}function Yn(e){let t=e.fetchWaitTime,n=e.executorRunTime??0,r=(e.completedAt??0)-(e.submittedAt??0);return typeof t!=`number`||n<=0||r<=0?null:t/(n/r)}function Xn(e){let t=e.retryWasteMs??0,n=e.wastedAttempts??0,r=Array.isArray(e.retryTaskSamples)?e.retryTaskSamples:[];if(t<=0||n<=0||r.length<n)return t;let i=r.reduce((e,t)=>Math.max(e,(t.attemptNumber??0)+1),1),a=Math.max(1,e.peakConcurrentTasks??1);return Math.min(t,Math.max(i*t/n,t/a))}var Zn=134217728,Qn=125e6,$n=15e3,er=125e6,tr=.01;function nr(e){let t=e.executorRunTime??0,n=x(e.executorCpuTime??0);return t<=0||n<=0||/PythonRDD/.test(e.name??``)||/org\.apache\.spark\.api\.python\./.test(e.details??``)?!1:n/t<tr}var rr={shortensLongestTask:!0};function W(e,t){return t?{basis:`resourceOnly`,wallClock:null,estimateMethod:e,rawWaste:t}:{basis:`informational`,wallClock:null,estimateMethod:e}}function ir(){return W(`none`)}function ar(e,t,n,r,i,a){let o=Rn(e,t,n.stages,n.occupancy,a);return o?{basis:o.basis,wallClock:o.wallClock,estimateMethod:r,rawWaste:i}:W(r,i)}function or(e,t,n,r,i){let a=zn(e,t,n.stages,n.occupancy);return a?{basis:a.basis,wallClock:a.wallClock,estimateMethod:r,rawWaste:i}:null}function sr(e,t,n){let r=e>0?{value:e,unit:`ms`}:void 0;if(!t||t.length===0)return W(`modeled`,r);let i=e/t.length;return or(t,new Map(t.map(e=>[e,i])),n,`modeled`,r)??W(`modeled`,r)}function cr(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t=0;t<e.length;t++){let i=e.charCodeAt(t);n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677)}return n=Math.imul(n^n>>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),(4294967296*(2097151&r)+(n>>>0)).toString(16)}var lr=`[redacted]`;function ur(e){return e.className?e.className:e.lossReason?e.reason?`${e.reason}: ${e.lossReason}`:e.lossReason:e.reason}var dr=/^\s*(?:at \S.*|\.\.\.(?: \d+ more)?)$/,fr=/^((?:Caused by: |Suppressed: )?[\w$]+(?:\.[\w$]+)+)(?::.*)?$/;function pr(e){let t=[];for(let n of e.split(`
|
|
3
|
+
`)){if(dr.test(n)){t.push(n);continue}let e=fr.exec(n.trim());e&&t.push(e[1])}return t.join(`
|
|
4
|
+
`)}function mr(e){return{...e,message:e.message==null?null:lr,stackExcerpt:e.stackExcerpt==null?null:pr(e.stackExcerpt)}}function hr(e){let t=e.className??e.reason??`Unknown failure`,n=[e.message,e.lossReason].filter(e=>e!=null).join(` · `);return n?`${t}: ${n}`:t}var G=1048576,K=1024*G,gr=1024*K;function _r(e){let[t,n]=[[`GB`,K],[`MB`,G],[`KB`,1024]].find(([,t])=>e>=t)??[`bytes`,1];return`${Math.round(e/n*10)/10} ${t}`}function vr(e,t){let{taskCount:n,spillDiskMax:r=0,spillMemMax:i=0,spillDiskP50:a=0,spillMemP50:o=0}=e;if(n===1){if(r>=t.singleTaskDiskGiB*K||i>=t.singleTaskMemGiB*K)return{magnitude:`severe`}}else{let e=n>0?r/n:0;if(r>=t.highDiskGiB*K||e>=t.highTaskDiskMB*G||i>=t.highMemGiB*K)return{magnitude:`high`};if(r>=t.medDiskMB*G||i>=t.medMemGiB*K)return{magnitude:`medium`}}if(n>=t.skewMinTasks){if(a>0&&r/a>t.skewRatio&&r>=t.skewDiskFloorMB*G)return{magnitude:`high`};if(o>0&&i/o>t.skewRatio&&i>=t.skewMemFloorMB*G)return{magnitude:`medium`}}return null}function yr(e){return!Array.isArray(e)||e.length===0?null:[...e].sort((e,t)=>t.count-e.count)[0].reason}function br(e,t){let n=new Set;for(let t of e)for(let e of t.stageIds??[])n.add(e);return n.size>0?[...n].sort((e,t)=>e-t):t}function xr(e,t={}){let{includeDetail:n=!1,normalizeDetail:r=e=>e}=t,i=new WeakMap,a=[];function o(e,t){a.push(e);let s=e.exchangeRole===`read`?e.children[0]:null,c=s?s.children:e.children??[],l=s?s.metrics:e.metrics,u=c.map(e=>o(e,!1)),d=1+u.reduce((e,t)=>e+t.size,0),f=(l??[]).map(e=>e.name).sort().join(`,`),p=u.map(e=>cr(e.fingerprint)).join(`,`),m={size:d,fingerprint:t&&n?`${e.name}[${f}]<${r(e.detail??``)}>{${p}}`:`${e.name}[${f}]{${p}}`};return i.set(e,m),m}return o(e,!0),{shapeOf:i,allNodes:a}}function Sr(e){let t=e.replace(/#\d+L?/g,``).replace(/,?\s*plan_id=\d+/g,``).replace(/\[codegen id\s*:\s*\d+\]/gi,`[codegen id]`).replace(/\bBuild(Left|Right)\b/g,`BuildSide`);return t=t.replace(/(?<![A-Za-z_])([A-Za-z_][\w.]*)\s*=\s*([A-Za-z_][\w.]*)/g,(e,t,n)=>{let[r,i]=[t,n].sort();return`${r} = ${i}`}),t}var Cr=/Join/i,wr=new WeakMap;function Tr(e){let t=wr.get(e);return t===void 0&&(t=un(e.name??``,e.detail??``),wr.set(e,t)),t}function Er(e){return Cr.test(e)?`join`:e===`Union`?`union`:null}function Dr(e){let t=[],n=[];function r(e){n.push(e);let i=(e.children??[]).map(r);n.pop();let a=(e.metrics??[]).map(e=>e.name).sort().join(`,`),o=i.map(e=>cr(e.fingerprint)).join(`,`),s=`${e.name}[${a}]{${o}}`,c=new Map,l=Tr(e);if(l){let t=(e.metrics??[]).find(e=>e.name===Ir);c.set(l,(c.get(l)??0)+(t?t.value:0))}for(let e of i)for(let[t,n]of e.leafRelationBytes)c.set(t,(c.get(t)??0)+n);let u=Er(e.name??``);return u&&t.push({node:e,operator:u,fingerprint:`${e.name}[${a}]<${Sr(e.detail??``)}>{${o}}`,leafRelationBytes:new Map(c),ancestorNodes:n.slice()}),{fingerprint:s,leafRelationBytes:c}}return r(e),t}function Or(e){let t=null;return Bt(e,e=>{t||=Tr(e)}),t}function kr(e,{minSubtreeSize:t,minOccurrences:n}){let{shapeOf:r,allNodes:i}=xr(e),a=i.filter(e=>r.get(e).size>=t&&e.exchangeRole!==`write`),o=new Map;for(let e of a){let t=r.get(e).fingerprint;o.has(t)||o.set(t,[]),o.get(t).push(e)}let s=[...o.values()].filter(e=>e.length>=n).sort((e,t)=>r.get(t[0]).size-r.get(e[0]).size),c=new WeakSet,l=e=>{c.add(e);for(let t of e.children??[])l(t)},u=[];for(let e of s){let t=e.filter(e=>!c.has(e));if(!(t.length<n)){for(let e of t)l(e);u.push({rootName:t[0].name,subtreeSize:r.get(t[0]).size,occurrences:t.length,isExchangeRoot:Qt(t[0]),sampleRelation:Or(t[0]),groupIndex:u.length,nodes:t})}}return u}function Ar(e){let t=e=>{let t=[];return Bt(e,e=>t.push(e.detail??``)),t},n=e=>Sr(e).replace(/\b(\w+QueryStage)\s+\d+/g,`$1`),r=t(e[0]),i=[];for(let a of e.slice(1)){let e=t(a);if(e.length!==r.length)return!1;for(let t=0;t<r.length;t++)if(e[t]!==r[t]&&(i[t]??=n(r[t]),n(e[t])!==i[t]))return!1}return!0}function jr(e){return e.exchangeRole!==`write`&&!e.name.startsWith(`WholeStageCodegen`)}function Mr(e){let t=new Map;for(let n of e)if(jr(n))for(let e of n.stageIds??[])t.set(e,(t.get(e)??0)+1);return t}function Nr(e,t){let n={};for(let[r,i]of Mr(e))n[r]=i/(t.get(r)??i);return n}function Pr(e,t,n){return e<=n.minSubtreeSize&&t<=n.minOccurrences?`low`:e>=n.minSubtreeSize*2||t>=n.minOccurrences+2?`high`:`medium`}var Fr=`number of files read`,Ir=`size of files read`,Lr=`number of written files`,Rr=`written output`;function zr(e){let t=(e.metrics??[]).find(e=>e.name===`data size`);if(t)return t.value;let n=0;for(let t of e.children??[])n+=zr(t);return n}function Br(e){if((e.metrics??[]).find(e=>e.name===`data size`))return[e];let t=[];for(let n of e.children??[])t.push(...Br(n));return t}function Vr(e){if(e.length<3)return null;let t=e.map(e=>e.value).sort((e,t)=>e-t),n=t[Math.floor(t.length/2)];if(n<=0)return null;let r=e.reduce((e,t)=>t.value>e.value?t:e);return{key:r.key,ratio:r.value/n,value:r.value}}function Hr(){return vi.map(e=>({type:e.type,version:e.version??1,scope:e.scope,thresholds:e.thresholds,docAnchor:e.docAnchor}))}function Ur(e,t){let{taskCount:n,taskDurationP50:r,taskDurationP95:i,taskDurationMax:a}=e;return r===0?null:(n??0)>=t?{ratio:i/r,metric:`P95/median`}:{ratio:a/r,metric:`max/median`}}function Wr(e,t,n){return t==null||e>=t*n}function Gr(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0),i=Un(t.app);return i!=null&&r>0&&r<i*n}function Kr(e,t,n){return{wasteMs:Fn(e,t),removedCoreWorkMs:In(e,t),longestTaskAfterFixMs:n}}function qr(e,t){let n=e.taskDurationP50??0;return Kr(e,Math.max(0,t?(e.taskDurationP95??0)-n:(e.taskDurationMax??0)-n),Ln(e))}function Jr(e){let t=Ln(e);return Kr(e,Math.max(0,(e.taskDurationMax??0)-t),t)}function Yr(e,t,n){return ar(e.wasteMs,t,n,`measured`,{value:e.wasteMs,unit:`ms`},{...rr,removedCoreWorkMs:e.removedCoreWorkMs,longestTaskAfterFixMs:e.longestTaskAfterFixMs})}function Xr(e,t,n){return Yr(e,t,n.impact).wallClock?.high??e.wasteMs}var Zr={rddInfo:`This ratio is a point-in-time storage snapshot from stage-submission events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`,blockUpdates:`This ratio is the RDD's peak cache residency rebuilt from block-update events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`};function Qr(e){return e<10?`low`:e>=50?`high`:`medium`}function $r(e,t,n){let r=e.name||`RDD ${e.id}`,i=Math.round(t*100),a=100-i;return{type:`cacheUtilization`,variant:`partialCache`,stageId:null,rddId:e.id,rddName:r,impactBand:n,metric:`cachedRatio`,value:i,confidence:Qr(e.numPartitions),validationRequired:Zr[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`RDD ${r} is ${a}% evicted from cache (${i}% of partitions cached). Increase executor memory or reduce the cached dataset size.`}}function ei(e,t,n){let r=e.name||`RDD ${e.id}`,i=Math.round(t*100);return{type:`cacheUtilization`,variant:`diskSpillover`,stageId:null,rddId:e.id,rddName:r,impactBand:n,metric:`diskRatio`,value:i,confidence:Qr(e.numPartitions),validationRequired:Zr[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`RDD ${r} is ${i}% spilled to disk despite requesting MEMORY_AND_DISK. Executor memory may be too small for this cached dataset.`}}function ti(e){return{type:`cacheUtilization`,variant:`storageUnobserved`,stageId:null,impactBand:`info`,metric:`persistedRdds`,value:e,dataUnavailable:!0,recommendation:`${e===1?`1 persisted RDD has`:`${e} persisted RDDs have`} no cache-storage evidence in this log, so eviction and disk spillover can't be checked: Spark 2.3+ records cached sizes only as block updates, which need spark.eventLog.logBlockUpdates.enabled=true.`}}function ni(e,t,n){for(let[r,i]of Object.entries(n)){if(!Object.hasOwn(t,r))throw Error(`Detector ${e} has no threshold "${r}".`);let n=t[r];if(!(Array.isArray(n)?Array.isArray(i)&&i.length===n.length:typeof i==`number`))throw Error(`Threshold ${e}.${r} must have the same shape as its default.`)}return Object.freeze({...t,...n})}function ri(e,t,n){let r=Object.freeze({...t.thresholds}),i=n(r);return{...t,scope:e,thresholds:r,withThresholds:e=>e&&Object.keys(e).length>0?n(ni(t.type,r,e)):i}}function q(e){return ri(`stage`,e,t=>(n,r)=>e.detect(n,r,t))}function ii(e){return ri(`sql`,e,t=>(n,r)=>e.detect(n,r,t))}function ai(e){return ri(`app`,e,t=>n=>e.detect(n,t))}function oi(e){return ri(`config`,e,t=>n=>e.detect(n,t))}function si(e,t){return e<=t*1.5?`low`:e>=t*5?`high`:`medium`}function ci(e,t,n){return n===`high`?e<=t.warnPct100*1.5?`low`:e>=t.warnPct100*3?`high`:`medium`:e>=t.lowInfoPct100*.66?`low`:e<=t.lowInfoPct100*.2?`high`:`medium`}function li(e,t,n){return e<t*1.5?`low`:e>=n?`high`:`medium`}function ui(e,t){return e<=t*1.5?`low`:e>=t*4?`high`:`medium`}function di(e,t,n){let r=t>0?e/(n*t):1/0;return r<=1.5?`low`:r>=3?`high`:`medium`}function fi(e,t,n){let r={low:0,medium:1,high:2},i=e<n.warnRatio*1.5?`low`:e>=n.critRatio?`high`:`medium`,a=t<n.minTasks*2?`low`:t>=n.minTasks*4?`high`:`medium`;return r[i]<=r[a]?i:a}function pi(e,t,n){return e<=t*1.5?`low`:e>=n?`high`:`medium`}function mi(e,t){return e<=t?`low`:e>=t*3?`high`:`medium`}function hi(e){return`${Math.round(e*1e6)/1e4}%`}function gi(e){return`This finding is gated by a ${e/1e3}-second minimum-runtime floor, our own noise floor for this metric.`}var _i=`This event log never recorded an ApplicationEnd event: the capture stopped before the run finished (an in-flight job, a rotated-away log, or a cut-short capture). Findings and metrics elsewhere on this board reflect only what was captured up to that point, not the full run.`,vi=[q({type:`skew`,order:30,fixEffort:`code`,version:1,emits:[`skew`],docAnchor:`#bottleneck-skew`,thresholds:{ratioWarn:3,minTasksForP95:20,floorPctWarn:Bn},detect(e,t,n){let r=Ur(e,n.minTasksForP95);if(r===null)return null;let{ratio:i,metric:a}=r;if(i<=n.ratioWarn||!Wr(Xr(qr(e,a===`P95/median`),e.id,t),Un(t.app),n.floorPctWarn))return null;let o=Math.round(i*10)/10;return{type:`skew`,stageId:e.id,impactBand:`warning`,metric:a,value:o,confidence:si(i,n.ratioWarn),validationRequired:`This finding is gated by a ${hi(n.floorPctWarn)} runtime-floor threshold, our own noise floor for this metric.`,recommendation:`Task duration ratio (${a}) is ${o}×: for join-driven skew, enable AQE skew-join handling (spark.sql.adaptive.skewJoin.enabled); otherwise salt the key or repartition on a better key to reduce task skew.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?Yr(qr(n,e.metric===`P95/median`),e.stageId,t):null}}),q({type:`stageShape`,order:35,fixEffort:`code`,version:1,emits:[`stageShape`],docAnchor:`#bottleneck-stage-shape`,thresholds:{pRatioMax:.5,oiRatioMax:10,skewWarn:3,lowParallelismFloorPct:.005},detect(e,t,n){let r=[],i=(e.executorStats??[]).length*(t.app?.resources?.executor?.cores??1),a=(e.completedAt??0)-(e.submittedAt??0);if(i>0&&!Gr(e,t,n.lowParallelismFloorPct)){let t=e.taskCount/i;t<n.pRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`lowParallelism`,metric:`pRatio`,value:Math.round(t*100)/100,totalCores:i,recommendation:`This stage runs ${e.taskCount} ${e.taskCount===1?`task`:`tasks`} across ~${i} cores, so it is under-parallelized and leaves cluster capacity idle.`})}if(e.inputBytes>0){let t=e.outputBytes/e.inputBytes;t>n.oiRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`dataExplosion`,metric:`oiRatio`,value:Math.round(t*10)/10,recommendation:`This stage outputs ${Math.round(t)}× its input volume: check for an exploding join or a cross product.`})}if(a>0){let t=e.taskDurationMax/a;t>n.skewWarn&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`taskStageSkew`,metric:`taskStageSkew`,value:Math.round(t*10)/10,totalCores:i,recommendation:`One task takes ${Math.round(t*10)/10}× this stage's wall-clock duration; a single straggler is gating the whole stage.`})}return r},estimate(e,t){let n=t.stages.get(e.stageId);if(!n)return null;if(e.rule===`lowParallelism`){let t=(n.completedAt??0)-(n.submittedAt??0);return W(`measured`,{value:Math.max(0,(e.totalCores??0)-(n.taskCount??0))*t,unit:`coreMs`})}if(e.rule===`dataExplosion`)return W(`measured`,{value:Math.max(0,(n.outputBytes??0)-(n.inputBytes??0)),unit:`bytes`});if(e.rule===`taskStageSkew`){let t=e.totalCores??0,r=n.taskCount??0;return W(`measured`,{value:Math.max(0,Math.min(t,r)-1)*Math.max(0,(n.taskDurationMax??0)-(n.taskDurationP50??0)),unit:`coreMs`})}return null}}),q({type:`shuffle`,order:20,fixEffort:`config`,version:1,emits:[`shuffle`],docAnchor:`#bottleneck-shuffle`,thresholds:{minBytes:50*G,stageFloorPct:.005},detect(e,t,n){let r=e.shuffleReadBytes;return r<=n.minBytes||Gr(e,t,n.stageFloorPct)?null:{type:`shuffle`,stageId:e.id,impactBand:`info`,metric:`shuffleReadBytes`,value:r,recommendation:`${w(r)} shuffled in this stage: consider increasing spark.sql.shuffle.partitions or adding a broadcast join.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.shuffleReadBytes??0,i=r/(Gn*Jn(n))*1e3,a=Yn(n);return ar(a==null?i:Math.min(i,a),e.stageId,t,a!=null&&a<i?`measured`:`modeled`,{value:r,unit:`bytes`})}}),q({type:`partitionSizing`,order:22,fixEffort:`config`,version:1,emits:[`partitionSizing`],docAnchor:`#bottleneck-partition-sizing`,thresholds:{skewRatio:5,skewFloorBytes:256*G,lowParTotalBytes:K,lowParMaxTasks:7,maxPartBytes:5*K},detect(e,t,n){let r=[],{shuffleReadP50:i,shuffleReadMax:a,shuffleReadBytes:o,taskCount:s}=e;if(a>n.skewRatio*i&&a>n.skewFloorBytes){let t=i>0?`${Math.round(a/i*10)/10}× the median (${w(i)})`:`far larger than the median (${w(i)}, effectively empty)`;r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`shufflePartitionSkew`,metric:`shuffleReadMax`,value:a,recommendation:`The largest shuffle partition (${w(a)}) is ${t}: for join skew, enable AQE skew-join handling (spark.sql.adaptive.skewJoin.enabled); otherwise salt the key or repartition on a better key.`})}return o>=n.lowParTotalBytes&&s<=n.lowParMaxTasks&&r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`lowShuffleParallelism`,metric:`taskCount`,value:s,recommendation:`${Math.round(o/K*10)/10} GB of shuffle spread over only ${s} tasks: raise spark.sql.shuffle.partitions so each partition is smaller.`}),a>=n.maxPartBytes&&r.push({type:`partitionSizing`,stageId:e.id,impactBand:`critical`,rule:`maxPartitionTooBig`,metric:`shuffleReadMax`,value:a,recommendation:`A single shuffle partition (${w(a)}) exceeds 5 GB: this will OOM or spill heavily. Repartition to break it up before this stage.`}),r},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=0;if(e.rule===`maxPartitionTooBig`)r=(n.shuffleReadMax??0)/Gn*1e3;else if(e.rule===`shufflePartitionSkew`)r=Math.max(0,(n.shuffleReadMax??0)-(n.shuffleReadP50??0))/Gn*1e3;else if(e.rule===`lowShuffleParallelism`){let e=Math.ceil((n.shuffleReadBytes??0)/Zn),t=n.taskCount??0;e>t&&t>0&&(r=Math.max(0,(n.completedAt??0)-(n.submittedAt??0))*(1-t/e))}else return null;return ar(r,e.stageId,t,`modeled`,{value:r,unit:`ms`})}}),q({type:`spill`,order:10,fixEffort:`code`,version:1,emits:[`spill`],docAnchor:`#bottleneck-spill`,thresholds:{singleTaskDiskGiB:1,singleTaskMemGiB:4,highDiskGiB:1,highTaskDiskMB:512,highMemGiB:4,medDiskMB:256,medMemGiB:1,skewRatio:5,skewDiskFloorMB:128,skewMemFloorMB:256,skewMinTasks:10,stageFloorPct:.005},detect(e,t,n){if(e.memoryBytesSpilled===0||Gr(e,t,n.stageFloorPct))return null;let r=e.spillClassification,i=r===`skew`||r===`volume`,a=vr(e,n);return{type:`spill`,stageId:e.id,impactBand:`warning`,spillMagnitude:a?.magnitude,metric:`memoryBytesSpilled`,value:e.memoryBytesSpilled,confidence:i?`medium`:`low`,validationRequired:i?`Spill cause is inferred from the share of tasks that spilled: confirm against per-task spill metrics in the Spark UI.`:`Spill cause could not be classified: inspect per-task spill metrics in the Spark UI before acting.`,recommendation:r===`skew`?`${w(e.memoryBytesSpilled)} spilled, skew-driven: fix task skew first; adding memory will not help.`:`${w(e.memoryBytesSpilled)} spilled: raise spark.sql.shuffle.partitions or increase executor memory.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.diskBytesSpilled??0;return ar(r/(Kn*Jn(n))*1e3,e.stageId,t,`modeled`,{value:r,unit:`bytes`})}}),q({type:`gc`,order:50,fixEffort:`config`,version:1,emits:[`gc`],docAnchor:`#bottleneck-gc`,thresholds:{warnPct100:10,lowInfoPct100:5,minRunTimeMs:1e4,lowInfoFloorPct:.005},detect(e,t,n){let r=e.gcPct;if((e.executorRunTime??0)>=n.minRunTimeMs&&r>n.warnPct100){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,impactBand:`warning`,metric:`gcPct`,value:t,confidence:ci(r,n,`high`),validationRequired:gi(n.minRunTimeMs),recommendation:`GC consumed ${t}% of executor run time: reduce object creation, use primitive types, avoid UDFs, increase executor memory.`}}if((e.executorRunTime??0)>=n.minRunTimeMs&&r<n.lowInfoPct100&&!Gr(e,t,n.lowInfoFloorPct)){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,direction:`low`,impactBand:`info`,metric:`gcPct`,value:t,confidence:ci(r,n,`low`),validationRequired:gi(n.minRunTimeMs),recommendation:`GC consumed only ${t}% of executor run time: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`}}return null},estimate(e,t){if(e.direction===`low`)return W(`none`);if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=(n.completedAt??0)-(n.submittedAt??0),i=n.executorRunTime??0,a=n.jvmGCTime??0,o={value:a,unit:`coreMs`};return i<=0||r<=0?W(`modeled`,o):ar(a/(i/r),e.stageId,t,`modeled`,o)}}),q({type:`slowHost`,order:60,fixEffort:`config`,version:1,emits:[`slowHost`],docAnchor:`#bottleneck-slow-host`,thresholds:{minHosts:3,minTasks:15,ratioWarn:2,minShare:.2,shareWarn:.75,taskShareWarn:.5,ratioTiers:[1.33,1.78,3.16,10],floorMs:1e3,floorBytes:64*G,stageFloorPct:.005},detect(e,t,n){let r=e.hostStats??[],i=e.executorStats??[];if(r.length<n.minHosts&&i.length<n.minHosts||e.taskCount<n.minTasks||Gr(e,t,n.stageFloorPct))return null;let a=[];if(r.length>=n.minHosts){let t=r.map(e=>({host:e.host,taskCount:e.taskCount,mean:e.totalDuration/e.taskCount})),i=[...t].map(e=>e.mean).sort((e,t)=>e-t),o=i[Math.floor(i.length/2)];if(o>0)for(let r of t){let t=r.mean/o,i=r.taskCount/e.taskCount;t<n.ratioWarn||i<n.minShare||r.mean<n.floorMs||a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,metric:`hostMeanRatio`,value:Math.round(t*10)/10,hostMeanMs:r.mean,host:r.host,hostTaskShare:Math.round(i*100)/100,recommendation:`${r.host} may just hold data locality for its tasks or carry one heavy stage, not necessarily a hardware fault: check what it was running, and consider enabling spark.speculation to relaunch a lagging task automatically.`})}let s=r.reduce((e,t)=>e+t.totalDuration,0);if(s>0)for(let t of r){let r=t.totalDuration/s,i=t.taskCount/e.taskCount;r>=n.shareWarn&&i>=n.taskShareWarn&&a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,variant:`durationShare`,metric:`hostDurationShare`,value:Math.round(r*100)/100,hostMeanMs:t.totalDuration/t.taskCount,host:t.host,hostTaskShare:Math.round(i*100)/100,recommendation:`${t.host} is doing ${Math.round(r*100)}% of this stage's total task time: check for data locality or partition assignment skewing work onto one node.`})}}let o=e.executorStats??[],s=n.ratioTiers,c=e=>e>=s[3]?`critical`:e>=s[1]?`warning`:e>=s[0]?`info`:null,l=n.floorMs,u=n.floorBytes,d=[{dimension:`taskTime`,floor:l,samples:o.filter(e=>e.taskCount>0).map(e=>({key:e.executorId,value:e.totalDuration/e.taskCount}))},{dimension:`inputBytes`,floor:u,samples:o.map(e=>({key:e.executorId,value:e.inputBytes??0}))},{dimension:`shuffleBytes`,floor:u,samples:o.map(e=>({key:e.executorId,value:(e.shuffleReadBytes??0)+(e.shuffleWriteBytes??0)}))}],f=e.executorMetrics instanceof Map?e.executorMetrics:null;f&&f.size>=3&&d.push({dimension:`storageMemory`,floor:u,samples:[...f.entries()].map(([e,t])=>({key:e,value:(t.onHeapStorageMemory??0)+(t.offHeapStorageMemory??0)}))});for(let t of d){let n=Vr(t.samples);if(!n||n.value<t.floor)continue;let r=c(n.ratio);if(!r)continue;let i=t.dimension===`taskTime`?`info`:r;a.push({type:`slowHost`,stageId:e.id,impactBand:i,variant:`multiDim`,dimension:t.dimension,metric:`execMaxMedianRatio`,value:Math.round(n.ratio*10)/10,execMaxValue:n.value,executorId:n.key,recommendation:`Executor ${n.key} deviates ${Math.round(n.ratio*10)/10}× from the median on ${t.dimension}: investigate uneven partition assignment or a degraded executor.`})}return a},estimate(e,t){let n=e.metric===`hostMeanRatio`||e.variant===`durationShare`?e.hostMeanMs:e.variant===`multiDim`&&e.dimension===`taskTime`?e.execMaxValue:null;if(n==null)return W(`none`);if(e.stageId==null)return null;let r=t.stages.get(e.stageId);if(!r)return null;let i=Math.max(0,n-(r.taskDurationP50??0));return ar(i,e.stageId,t,`measured`,{value:i,unit:`ms`})}}),q({type:`stageSlowness`,order:65,fixEffort:`code`,version:2,emits:[`stageSlowness`],docAnchor:`#bottleneck-stage-slowness`,thresholds:{infoMin:15},suppressedBy:`slowHost`,detect(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0);if(!(r>0))return null;let i=r/6e4,a=i>=n.infoMin?`info`:null;if(!a)return null;let o=Math.round(i*10)/10;return{type:`stageSlowness`,stageId:e.id,impactBand:a,metric:`stageDurationMinutes`,value:o,recommendation:`This stage ran ${o} minutes with no more specific cause flagged: often a partition-count problem, raise parallelism via spark.sql.shuffle.partitions or spark.default.parallelism, or check for a large per-task data volume driving heavy shuffle and spill.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;if(t.totalCores<=0)return W(`modeled`);let r=(n.inputBytes??0)+(n.shuffleReadBytes??0),i=typeof n.taskActiveMs==`number`?n.taskActiveMs:Math.max(0,(n.completedAt??0)-(n.submittedAt??0)),a=n.taskCount??0,o=r<=0&&nr(n)?0:i*Math.max(0,1-a/t.totalCores);return ar(o,e.stageId,t,`modeled`,{value:o,unit:`ms`},rr)}}),q({type:`stageFailed`,order:42,fixEffort:`code`,version:1,emits:[`stageFailed`],docAnchor:`#bottleneck-failures`,thresholds:{},detect(e){return e.stageFailureReason==null?null:{type:`stageFailed`,stageId:e.id,impactBand:`critical`,variant:`stageFailure`,metric:`stageFailureReason`,valueText:e.stageFailureReason,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,failedTaskDetails:e.failedTaskSamples??[],recommendation:`This stage attempt failed outright. Inspect the driver log for the failure reason and the job that triggered it.`}},estimate:ir}),q({type:`failures`,order:40,fixEffort:`code`,version:2,emits:[`failures`],docAnchor:`#bottleneck-failures`,thresholds:{minTasks:10,warnRate:.05,critRate:.2},detect(e,t,n){if(e.taskCount<n.minTasks||!e.failedTasks)return null;let r=e.failedTasks/e.taskCount;if(r<=n.warnRate)return null;let i=Math.round(r*1e3)/10,a=yr(e.failureReasons),o=e.failureGroups??[],s=o.find(e=>e.reason===a),c=(s?ur(s):null)??a,l=o.slice(0,5),u=l.reduce((e,t)=>e+t.count,0);return{type:`failures`,stageId:e.id,impactBand:r>n.critRate?`critical`:`warning`,metric:`failureRate`,value:i,failedTasks:e.failedTasks,dominantReason:a,dominantError:c,failureGroups:l,otherFailedTasks:Math.max(0,e.failedTasks-u),recommendation:`${i}% of tasks failed${c?` (dominant error: ${c})`:``}: investigate driver logs for executor instability or data-driven errors.`}},estimate:ir}),q({type:`straggler`,order:70,fixEffort:`code`,version:1,emits:[`straggler`],docAnchor:`#bottleneck-straggler`,thresholds:{minTasks:10,shareWarn:.05,shareWarnAtFloor:.025,warnPct:.1,critPct:.2,floorPctWarn:Bn,floorPctCrit:Vn},detect(e,t,n){if(e.taskCount<n.minTasks)return null;let r=Un(t.app);if(Gr(e,t,n.floorPctWarn))return null;let i=(e.stragglerCount??0)/e.taskCount,a=(e.speculativeTasks??0)>0;if(!a&&i<=n.shareWarnAtFloor)return null;let o=a?e.speculativeTasks/e.taskCount:0,s=Xr(Jr(e),e.id,t),c=Wr(s,r,n.floorPctWarn),l=Wr(s,r,n.floorPctCrit),u=i>n.shareWarn||i>n.shareWarnAtFloor&&r!=null&&c;if(!a&&!u)return null;let d=o>=n.critPct&&l?`critical`:o>=n.warnPct&&c?`warning`:`info`,f=a&&!(S[u&&c?`warning`:`info`]<S[d]),p=f?e.speculativeTasks:Math.round(i*100),m=f?`${p} speculative attempt${p===1?``:`s`} discarded`:`${p}% of tasks straggled`;return{type:`straggler`,stageId:e.id,impactBand:`info`,metric:f?`speculativeTasks`:`stragglerShare`,value:p,unit:f?`count`:`pct`,speculativeTasks:e.speculativeTasks??0,stragglerCount:e.stragglerCount??0,confidence:f?li(o,n.warnPct,n.critPct):li(i,n.shareWarn,n.critPct),validationRequired:`This finding is gated by ${hi(n.floorPctWarn)}/${hi(n.floorPctCrit)} runtime-floor thresholds, our own noise floor for this metric.`,recommendation:`${m}: rule out a GC pause or a slow shuffle fetch before assuming a hardware issue; if a skewed key is the real cause, that's a candidate for AQE's skew-join handling.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?Yr(Jr(n),e.stageId,t):null}}),q({type:`speculationWaste`,order:71,fixEffort:`config`,version:1,emits:[`speculationWaste`],docAnchor:`#bottleneck-speculation-waste`,thresholds:{minWasted:5,minWasteMs:6e4},detect(e,t,n){let r=e.speculationWastedAttempts??0,i=e.speculationWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`speculationWaste`,stageId:e.id,impactBand:`warning`,metric:`speculationWasteMs`,value:i,confidence:ui(i,n.minWasteMs),recommendation:`Speculative execution discarded ${Math.round(i/1e3)}s of executor time in this stage; if task durations are naturally variable rather than genuine stragglers, consider tuning spark.speculation.multiplier/quantile.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.speculationWasteMs??0;return ar(r,e.stageId,t,`measured`,{value:r,unit:`ms`})}}),q({type:`retryWaste`,order:45,fixEffort:`code`,version:1,emits:[`retryWaste`],docAnchor:`#bottleneck-retry-waste`,thresholds:{minWasted:3,minWasteMs:3e4},detect(e,t,n){let r=e.wastedAttempts??0,i=e.retryWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`retryWaste`,stageId:e.id,impactBand:`warning`,metric:`retryWasteMs`,value:i,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,retriedTaskDetails:e.retryTaskSamples??[],recommendation:`Retried task attempts wasted ${Math.round(i/1e3)}s of executor time (${r} attempt${r===1?``:`s`}) even though the stage completed: investigate executor loss or fetch failures.`,extended:`${r} task attempts were superseded by a later retry, wasting ${Math.round(i/1e3)}s of executor time. Common causes: executor loss (OOM-kill, node death) or shuffle FetchFailed forcing a stage-map recompute. Check driver logs for the dominant reason (see the Failures widget) even if the final failure rate looks low; retries hide the true cost.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.retryWasteMs??0,i=Xn(n);return ar(i,e.stageId,t,i===r?`measured`:`modeled`,{value:r,unit:`ms`})}}),q({type:`tinyTask`,order:80,fixEffort:`code`,version:1,emits:[`tinyTask`],docAnchor:`#bottleneck-tiny-tasks`,thresholds:{minTasks:100,maxP50:500,maxP95:1e3,stageFloorPct:.005},detect(e,t,n){if(e.taskCount<n.minTasks||Gr(e,t,n.stageFloorPct)||e.taskDurationP50>n.maxP50||e.taskDurationP95>n.maxP95)return null;let r=Math.max(1,Math.round(e.taskCount/10)),i=e.shuffleReadBytes>0?`lower spark.sql.shuffle.partitions or .coalesce(${r})`:`.coalesce(${r})`;return{type:`tinyTask`,stageId:e.id,impactBand:`info`,metric:`taskDurationP50`,value:Math.round(e.taskDurationP50),recommendation:`Many small tasks (${e.taskCount}, P50 ${Math.round(e.taskDurationP50)}ms): scheduler overhead may dominate. Try ${i}.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.taskCount??0,i=Math.max(0,r-Math.round(r/10)),a=qn(n);if(a){let n=i*a.perTaskMs/Math.max(1,a.concurrency);return ar(n,e.stageId,t,`measured`,{value:n,unit:`ms`})}let o=i*50;return ar(o,e.stageId,t,`modeled`,{value:o,unit:`ms`})}}),ai({type:`incompleteRun`,order:5,fixEffort:`code`,version:1,emits:[`incompleteRun`],thresholds:{},detect(e){return!e.app||e.app.startTime==null||e.app.endTime!=null?null:{type:`incompleteRun`,stageId:null,impactBand:`warning`,metric:`applicationEnd`,valueText:`missing`,recommendation:_i}},estimate:ir}),ai({type:`coldStart`,order:90,fixEffort:`code`,version:1,emits:[`coldStart`],docAnchor:`#bottleneck-cold-start`,thresholds:{gapSeconds:30},detect(e,t){let{app:n,stages:r,executorsAdded:i,executorsRemoved:a}=e;if(!n||n.startTime==null||r.size===0)return null;let o=1/0;for(let e of r.values())e.submittedAt>0&&e.submittedAt<o&&(o=e.submittedAt);if(!Number.isFinite(o))return null;let s=new Map;for(let e of a)s.set(e.executorId,e.timestamp);let c=1/0;for(let e of i)if(e.timestamp>0){if(e.timestamp<=o){let t=s.get(e.executorId);if(t==null||t>o)return null}else e.timestamp<c&&(c=e.timestamp)}if(!Number.isFinite(c))return null;let l=(c-o)/1e3;if(l<=t.gapSeconds)return null;let u=Math.round(l);return{type:`coldStart`,stageId:null,impactBand:`warning`,metric:`startupGapSeconds`,value:u,recommendation:`The first stage waited ${u}s for an executor to become available: keep a warm pool of idle executors, or if using dynamic allocation, raise the minimum/initial executor count so it doesn't scale up from zero.`}},estimate(e){if(typeof e.value!=`number`)return null;let t=e.value*1e3;return{basis:`serial`,wallClock:{low:t,high:t},estimateMethod:`measured`}}}),ai({type:`utilization`,order:100,fixEffort:`config`,version:1,emits:[`utilization`],docAnchor:`#bottleneck-utilization`,thresholds:{minUtil:.6},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a}=e;if(!n||r.length===0||n.startTime==null||n.endTime==null)return null;let o=n.endTime-n.startTime;if(o<=0)return null;let s=bn(n,r,i);if(s<=0)return null;let c=s*o,l=(a?.busyCoreMs??0)/c;if(l>=t.minUtil)return null;let u=null;if(s>0){let t=0;for(let n of e.stages.values())t+=x(n.executorCpuTime??0);u=Math.round(t/(o*s)*100)}let d=Math.round(l*100);return{type:`utilization`,stageId:null,impactBand:`info`,metric:`avgUtilization`,value:d,utilizationFraction:l,appDurationMs:o,totalCores:s,cpuUtilizationPct:u,recommendation:`Average executor utilization was only ${d}%: consider reducing cluster size or enabling dynamic allocation.`}},estimate(e){let t=e.utilizationFraction,n=e.appDurationMs,r=e.totalCores;return t==null||n==null||r==null?W(`measured`):W(`measured`,{value:(1-t)*n*r/36e5,unit:`coreHours`})}}),ai({type:`memoryUtilization`,order:102,fixEffort:`config`,version:1,emits:[`memoryUtilization`],docAnchor:`#bottleneck-memory-utilization`,thresholds:{idleCoreWarn:.5,bandTooSmall:.95,bandTooHigh:.7,wasteBufferMultiplier:1.5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a,stages:o}=e,s=[];if(n?.startTime==null||n?.endTime==null)return s;let c=n.endTime-n.startTime;if(c<=0)return s;let l=xn(r,i),u=bn(n,r,i),d=n.resources?.executor?.memoryMB??null,f=a?.busyCoreMs;if(f!=null&&u>0){let e=u*c,n=e>0?1-f/e:0;if(n>t.idleCoreWarn){let e=Math.round(n*100);s.push({type:`memoryUtilization`,variant:`idleCores`,stageId:null,impactBand:`warning`,metric:`idleCoreRate`,value:e,idleRateFraction:n,allocatedMB:d,peakExecutors:l,appDurationMs:c,recommendation:`${e}% of allocated core-time ran no task: reduce cluster size or enable dynamic allocation.`})}}let p=new Map;for(let e of o.values()){let t=e.executorMetrics;if(t instanceof Map)for(let[e,n]of t){let t=n?.jvmHeapMemory??0;t>(p.get(e)??0)&&p.set(e,t)}}if(p.size===0)s.push({type:`memoryUtilization`,variant:`memoryBand`,stageId:null,impactBand:`info`,metric:`memoryBand`,dataUnavailable:!0,recommendation:`Per-executor memory usage requires spark.eventLog.logStageExecutorMetrics=true: not enabled for this run.`});else if(d!=null&&d>0){let e=d*1024*1024;for(let[n,r]of p){let i=r/e;i>t.bandTooSmall?s.push({type:`memoryUtilization`,variant:`memoryBand`,rule:`heapNearCapacity`,stageId:null,executorId:n,impactBand:`warning`,metric:`heapUsedRatio`,value:Math.round(i*100),recommendation:`Executor ${n} peaked at ${Math.round(i*100)}% of allocated heap: memory may be too small; raise spark.executor.memory to avoid OOM/spill.`}):i<t.bandTooHigh&&s.push({type:`memoryUtilization`,variant:`memoryBand`,rule:`heapOverProvisioned`,stageId:null,executorId:n,impactBand:`info`,metric:`heapUsedRatio`,value:Math.round(i*100),allocatedBytes:e,heap:r,appDurationMs:c,recommendation:`Executor ${n} used only ${Math.round(i*100)}% of allocated heap: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`})}}if(d!=null&&l>0){let e=l*d*(c/1e3),n=0;for(let e of o.values())n+=e.executorRunTime??0;let r=n/1e3*d,i=e-r;if(i>t.wasteBufferMultiplier*r){let e=Math.round(i);s.push({type:`memoryUtilization`,variant:`wasteModel`,stageId:null,impactBand:`info`,metric:`wastedMBSeconds`,value:e,confidence:di(i,r,t.wasteBufferMultiplier),validationRequired:`Memory-waste estimate uses allocated-vs-used memory-time and a ${t.wasteBufferMultiplier}x buffer: confirm against the Spark UI before acting.`,recommendation:`Allocated executor memory sat largely idle over the run (~${e.toLocaleString(`en-US`)} MB-seconds wasted): review spark.executor.memory and executor count.`})}}return s},estimate(e){if(e.variant===`wasteModel`&&typeof e.value==`number`)return W(`measured`,{value:e.value,unit:`mbSeconds`});if(e.variant===`idleCores`){let t=e.idleRateFraction,n=e.allocatedMB,r=e.peakExecutors,i=e.appDurationMs;return t!=null&&n!=null&&r!=null&&i!=null?W(`modeled`,{value:t*n*r*(i/1e3),unit:`mbSeconds`}):W(`modeled`)}if(e.variant===`memoryBand`&&e.rule===`heapOverProvisioned`){let t=e.allocatedBytes,n=e.heap,r=e.appDurationMs;if(t!=null&&n!=null&&r!=null)return W(`modeled`,{value:(t-n)/1048576*(r/1e3),unit:`mbSeconds`})}return W(`modeled`)}}),ai({type:`cacheUtilization`,order:103,fixEffort:`code`,version:2,emits:[`cacheUtilization`],docAnchor:`#bottleneck-cache-utilization`,thresholds:{cachedRatioWarn:.5,cachedRatioInfo:.9,diskRatioWarn:.4,diskRatioInfo:.15},detect(e,t){let n=e.app?.rddInfo;if(!(n instanceof Map))return null;let r=[],i=0,a=String(e.app?.config?.[`spark.eventLog.logBlockUpdates.enabled`]).toLowerCase()===`true`,o=/^(\d+)\.(\d+)/.exec(e.app?.sparkVersion??``),s=o==null||Number(o[1])<2||Number(o[1])===2&&Number(o[2])<3,c=a||s||(e.app?.rddBlockUpdates??0)>0;for(let e of n.values()){let n=e.storageLevel??{};if((n.useMemory||n.useDisk)&&(i++,(e.numCachedPartitions??0)>0)){if(c=!0,(e.numPartitions??0)>0){let n=e.numCachedPartitions/e.numPartitions;n<t.cachedRatioWarn?r.push($r(e,n,`warning`)):n<t.cachedRatioInfo&&r.push($r(e,n,`info`))}if(n.useMemory&&n.useDisk){let n=(e.memorySize??0)+(e.diskSize??0);if(n>0){let i=(e.diskSize??0)/n;i>t.diskRatioWarn?r.push(ei(e,i,`warning`)):i>t.diskRatioInfo&&r.push(ei(e,i,`info`))}}}}return i>0&&!c&&r.push(ti(i)),r},estimate(e){if(e.dataUnavailable)return W(`none`);let t=e.memorySize??0,n=e.diskSize??0,r=e.numCachedPartitions??0,i=e.numPartitions??0,a=Math.max(0,i-r),o=t+n;return W(`modeled`,{value:((r>0?o/r*a:0)+n)/er*1e3,unit:`ms`})}}),ai({type:`coreLocality`,order:103,fixEffort:`config`,version:1,emits:[`coreLocality`],docAnchor:`#bottleneck-core-locality`,thresholds:{minTasks:50,warnRatio:.15,critRatio:.35},detect(e,t){let{totalTasks:n,nonLocalTasks:r,ratio:i}=En([...e.stages.values()]);if(n==null||n<t.minTasks||i<t.warnRatio)return null;let a=Math.round(i*100);return{type:`coreLocality`,stageId:null,impactBand:i>=t.critRatio?`critical`:`warning`,metric:`nonLocalRatio`,value:a,nonLocalTaskCount:r,confidence:fi(i,n,t),validationRequired:`This finding is gated by ${hi(t.warnRatio)}/${hi(t.critRatio)} non-local-ratio thresholds (and a ${t.minTasks}-task minimum), our own noise floor for this metric.`,recommendation:`${a}% of tasks (${r}) ran without process- or node-local data placement: check spark.locality.wait settings and executor/data colocation.`}},estimate(e){return W(`modeled`,{value:(e.nonLocalTaskCount??0)*20,unit:`coreMs`})}}),ai({type:`autoscalingChurn`,order:103,fixEffort:`config`,version:1,emits:[`autoscalingChurn`],docAnchor:`#bottleneck-autoscaling-churn`,thresholds:{shortLivedMs:12e4,warningPct:.3,criticalPct:.6,minExecutors:5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i}=e;if(!n||r.length===0||n.endTime==null||r.length<t.minExecutors)return null;let a=new Map;for(let e of i)a.set(e.executorId,e.timestamp);let o=0;for(let e of r)(a.has(e.executorId)?a.get(e.executorId):n.endTime)-e.timestamp<t.shortLivedMs&&o++;let s=o/r.length,c=s>t.criticalPct?`critical`:s>t.warningPct?`warning`:null;if(!c)return null;let l=Math.round(s*100);return{type:`autoscalingChurn`,stageId:null,impactBand:c,metric:`shortLivedExecutorPct`,value:l,shortLivedExecutorCount:o,confidence:pi(s,t.warningPct,t.criticalPct),recommendation:`${l}% of executors ran for under 2 minutes before being removed. This looks like wasteful re-provisioning rather than normal scale-down; consider raising spark.dynamicAllocation.executorIdleTimeout or widening the minExecutors/maxExecutors bounds to reduce flapping.`}},estimate(e){return W(`modeled`,{value:(e.shortLivedExecutorCount??0)*$n/36e5,unit:`coreHours`})}}),ai({type:`cachingOpportunity`,order:105,fixEffort:`code`,version:1,emits:[`cachingOpportunity`],docAnchor:`#bottleneck-caching-opportunity`,thresholds:{minExecutions:2},detect(e,t){let n=e.sql;if(!(n instanceof Map)||n.size===0)return null;let r=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=new Map;Bt(e.planTree,e=>{let n=Tr(e);if(!n)return;let r=(e.metrics??[]).find(e=>e.name===Ir);t.set(n,(t.get(n)??0)+(r?r.value:0))});for(let[n,i]of t){let t=r.get(n);if(!t){let e=n.indexOf(`:`);t={format:n.slice(0,e),relation:n.slice(e+1),executionIds:new Set,executionBytes:new Map},r.set(n,t)}t.executionIds.add(e.id),t.executionBytes.set(e.id,(t.executionBytes.get(e.id)??0)+i)}}let i=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=Dr(e.planTree),n=new Map(t.map(e=>[e.node,e.fingerprint])),r=new Map;for(let e of t){let t=r.get(e.fingerprint);t||(t={operator:e.operator,node:e.node,leafRelationBytes:new Map,ancestorFingerprints:new Set(e.ancestorNodes.map(e=>n.get(e)).filter(e=>!!e))},r.set(e.fingerprint,t));for(let[n,r]of e.leafRelationBytes)t.leafRelationBytes.set(n,(t.leafRelationBytes.get(n)??0)+r)}for(let[t,n]of r){let r=i.get(t);r||(r={operator:n.operator,exampleNode:n.node,executionIds:new Set,executionBytes:new Map,ancestorFingerprints:new Set,leafRelationRids:new Set},i.set(t,r)),r.executionIds.add(e.id);let a=[...n.leafRelationBytes.values()].reduce((e,t)=>e+t,0);r.executionBytes.set(e.id,(r.executionBytes.get(e.id)??0)+a);for(let e of n.ancestorFingerprints)r.ancestorFingerprints.add(e);for(let e of n.leafRelationBytes.keys())r.leafRelationRids.add(e)}}let a=e=>i.has(e)&&i.get(e).executionIds.size>=t.minExecutions,o=new Map;for(let[e,n]of i){if(!a(e)){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!0});continue}let r=[...n.ancestorFingerprints].filter(a).map(e=>i.get(e));if(r.length===0){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!1});continue}let s=new Set(r.flatMap(e=>[...e.executionIds])),c=new Set([...n.executionIds].filter(e=>!s.has(e)));c.size===0||c.size<t.minExecutions?o.set(e,{finalExecutionIds:c,suppressed:!0}):o.set(e,{finalExecutionIds:c,suppressed:!1})}let s=e=>e.slice(e.indexOf(`:`)+1),c={join:[`joined`,`join`],union:[`unioned`,`union`]},l=[],u=new Map;for(let[e,n]of i){let r=o.get(e);if(r.suppressed)continue;let i=[...r.finalExecutionIds].sort((e,t)=>e-t),a=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),d=[...n.leafRelationRids].sort();if(d.length===0)continue;let f=d.map(e=>{let t=e.indexOf(`:`);return{relation:e.slice(t+1),format:e.slice(0,t)}}),[p,m]=c[n.operator],h=d.map(s).join(` ${m} `),g=i.length,_=a>=128*G?`${p[0].toUpperCase()}${p.slice(1)} result read by ${g} queries (~${w(a)}). Cache/persist the ${p} DataFrame so it is computed once.`:`${p[0].toUpperCase()}${p.slice(1)} result read by ${g} queries. Cache the ${p} DataFrame, or reconsider whether it needs to be recomputed each time.`;l.push({type:`cachingOpportunity`,variant:`composite`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:g,format:`derived`,relations:f,operator:n.operator,relation:h,executionIds:i,totalReadBytes:a,confidence:mi(g,t.minExecutions),validationRequired:`Composite reuse is inferred from a structural plan-shape match (operator + normalized join/filter condition + child shapes) across SQL executions; confirm these executions truly compute the same join/union before caching.`,recommendation:_});for(let e of d){u.has(e)||u.set(e,new Set);for(let t of i)u.get(e).add(t)}}for(let[e,n]of r){let r=u.get(e),i=r?[...n.executionIds].filter(e=>!r.has(e)):[...n.executionIds];if(i.length<t.minExecutions)continue;let a=i.length,o=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),s=o>=128*G?`Read by ${a} queries (~${w(o)}). Cache/persist the shared DataFrame so it is scanned once.`:`Read by ${a} queries. Cache the shared DataFrame, or broadcast it if it is a small join lookup.`;l.push({type:`cachingOpportunity`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:a,relation:n.relation,format:n.format,executionIds:i.sort((e,t)=>e-t),totalReadBytes:o,confidence:mi(a,t.minExecutions),validationRequired:`Relation-reuse is inferred from the pre-AQE plan scan identity across SQL executions; confirm the reads are the same data and cacheable within one session before acting.`,recommendation:s})}return l},estimate(e){return W(`modeled`,{value:(e.totalReadBytes??0)/er*1e3,unit:`ms`})}}),ai({type:`jobFailureRate`,order:110,fixEffort:`code`,version:1,emits:[`jobFailureRate`],docAnchor:`#bottleneck-job-failure-rate`,thresholds:{infoRate:.1,warnRate:.3,critRate:.5},detect(e,t){let{jobs:n,stages:r}=e,i=(n?[...n.values()]:[]).filter(e=>e.result!=null);if(i.length===0)return null;let a=i.filter(e=>e.succeeded===!1),o=a.length,s=o/i.length;if(s<t.infoRate)return null;let c=0,l=0;for(let e of r.values())c+=e.taskCount??0,l+=e.failedTasks??0;let u=c>0?l/c:0,d=a.filter(e=>e.submissionTime!=null&&e.completionTime!=null),f=d.length>0?d.reduce((e,t)=>e+(t.completionTime-t.submissionTime),0)/d.length:0,p=i.length;return{type:`jobFailureRate`,stageId:null,impactBand:s>=t.critRate?`critical`:s>=t.warnRate?`warning`:`info`,metric:`jobFailureRate`,value:Math.round(s*1e3)/10,failedJobs:o,totalJobs:p,failedTasks:l,totalTasks:c,avgJobDurationMs:f,taskFailureRate:Math.round(u*1e3)/10,recommendation:`${o} of ${p} jobs never recovered: inspect the driver log for the failed job(s) and the stage failures that triggered them.`}},estimate(e){return W(`modeled`,{value:(e.failedJobs??0)*(e.avgJobDurationMs??0)/36e5,unit:`coreHours`})}}),oi({type:`configAudit`,order:120,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-shuffle-service`,thresholds:{},property:`spark.shuffle.service.enabled`,detect(e){let t=e.app?.resources??null;return t?.dynamicAllocationEnabled===!0&&t?.shuffleServiceEnabled===!1?{type:`configAudit`,property:`spark.shuffle.service.enabled`,impactBand:`warning`,metric:`config`,valueText:`false`,recommendation:`Dynamic allocation is on but the external shuffle service is off: set spark.shuffle.service.enabled=true so shuffle data survives executor removal.`}:null},estimate:ir}),oi({type:`configAudit`,order:121,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-autoscale-bounds`,thresholds:{},property:`spark.dynamicAllocation.maxExecutors`,detect(e){let t=e.app,n=t?.config??{};if((t?.resources??null)?.dynamicAllocationEnabled!==!0)return null;let r=n[`spark.dynamicAllocation.minExecutors`]==null?null:parseInt(n[`spark.dynamicAllocation.minExecutors`],10),i=n[`spark.dynamicAllocation.maxExecutors`]==null?null:parseInt(n[`spark.dynamicAllocation.maxExecutors`],10);return r!=null&&i!=null&&r>i?{type:`configAudit`,property:`spark.dynamicAllocation.minExecutors`,impactBand:`critical`,metric:`config`,valueText:`${r} > ${i}`,recommendation:`Autoscaling bounds are inverted: spark.dynamicAllocation.minExecutors (${r}) exceeds maxExecutors (${i}). Set min ≤ max.`}:i==null?{type:`configAudit`,property:`spark.dynamicAllocation.maxExecutors`,impactBand:`info`,metric:`config`,valueText:`(unset)`,recommendation:`Dynamic allocation is on with no upper bound: set spark.dynamicAllocation.maxExecutors to cap cluster growth.`}:null},estimate:ir}),oi({type:`configAudit`,order:122,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-serializer`,thresholds:{},property:`spark.serializer`,detect(e){let t=e.app,n=t?.config??{},r=t?.resources??null;if(Object.keys(n).length===0)return null;let i=r?.serializer??n[`spark.serializer`]??null;return typeof i==`string`&&/kryo/i.test(i)?null:{type:`configAudit`,property:`spark.serializer`,impactBand:`info`,metric:`config`,valueText:i??`(default JavaSerializer)`,recommendation:`Current serializer is ${i??`the default JavaSerializer`}: consider spark.serializer=org.apache.spark.serializer.KryoSerializer for faster, smaller buffers.`}},estimate:ir}),oi({type:`configAudit`,order:123,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-memory-overhead`,thresholds:{floorMB:384,floorPct:.1},property:`spark.executor.memoryOverhead`,detect(e,t){let n=e.app?.resources??null,r=n?.executor?.memoryMB??null,i=n?.executor?.memoryOverheadMB??null;if(r==null||i==null)return null;let a=Math.max(t.floorMB,Math.round(r*t.floorPct));return i>=a?null:{type:`configAudit`,property:`spark.executor.memoryOverhead`,impactBand:`info`,metric:`config`,valueText:`${i} MiB`,recommendation:`Executor memoryOverhead (${i} MiB) is below Spark's default floor of ${a} MiB (max of 384 MiB or 10% of executor memory): raise it to avoid off-heap OOM-kills.`}},estimate:ir}),ii({type:`duplicatePlanSubtree`,order:130,fixEffort:`code`,version:2,emits:[`duplicatePlanSubtree`],docAnchor:`#bottleneck-duplicate-plan-subtree`,thresholds:{minSubtreeSize:3,minOccurrences:2,stageFloorPct:.005},detect(e,t,n){if(!e.planTree)return null;let r=kr(e.planTree,n);if(r.length===0)return null;let i=Yt(e.id,t.stages),a=[];Bt(e.planTree,e=>a.push(e));let o=Mr(a),s=Un(t.app),c=r.map(r=>{let a=[];for(let e of r.nodes)Bt(e,e=>a.push(e));let c=br(a,i),l=0;for(let e of c){let n=t.stages.get(e);n&&(l+=Math.max(0,(n.completedAt??0)-(n.submittedAt??0)))}if(s!=null&&l>0&&l<s*n.stageFloorPct)return null;let u=Ar(r.nodes),d=Nr(a,o),f=a.map(e=>e.id).filter(Boolean),p=r.sampleRelation?` (touching ${r.sampleRelation})`:``,m=u?``:` Their filters, columns or scanned tables differ, so the repeats may compute different data.`;return{type:`duplicatePlanSubtree`,executionId:e.id,stageIds:c,planNodeIds:f,stageShares:d,occurrencesIdentical:u,impactBand:u&&Object.keys(d).length>0?`warning`:`info`,metric:`subtreeOccurrences`,value:r.occurrences,rootName:r.rootName,subtreeSize:r.subtreeSize,sampleRelation:r.sampleRelation,groupIndex:r.groupIndex,confidence:u?Pr(r.subtreeSize,r.occurrences,n):`low`,validationRequired:`Duplicate-subtree matching compares operator names and metric names only, not literal values or expr IDs: confirm the repeated work is real in the Spark SQL plan tab before acting.`,recommendation:(r.isExchangeRoot?`A ${r.subtreeSize}-node subtree rooted at ${M(r.rootName)} repeats ${r.occurrences}x in this plan${p}: this looks like a possible missed exchange reuse; check whether the same shuffle could be computed once and reused.`:`A ${r.subtreeSize}-node subtree rooted at ${M(r.rootName)} repeats ${r.occurrences}x in this plan${p}: consider caching/persisting the shared computation or check for a duplicated query branch.`)+m}}).filter(e=>e!==null);return c.length>0?c:null},estimate(e,t){let n=e.stageIds;if(!n||n.length===0)return null;let r=typeof e.value==`number`?e.value:0;if(r<2||e.occurrencesIdentical===!1)return W(`none`);let i=e.stageShares??null,a=(r-1)/r,o=new Map;for(let e of n){let n=t.stages.get(e),r=i?i[e]??0:1;if(n&&r>0){let t=n.taskActiveMs??Math.max(0,(n.completedAt??0)-(n.submittedAt??0));o.set(e,t*r*a)}}if(o.size===0)return W(`none`);let s={value:[...o.values()].reduce((e,t)=>e+t,0),unit:`ms`};return or([...o.keys()],o,t,`measured`,s)??W(`measured`,s)}}),ii({type:`smallFiles`,order:131,fixEffort:`config`,version:2,emits:[`smallFiles`],docAnchor:`#bottleneck-small-files`,thresholds:{minFiles:100,maxAvgFileSizeMB:3},detect(e,t,n){if(!e.planTree)return null;let{minFiles:r,maxAvgFileSizeMB:i}=n,a=[];if(Bt(e.planTree,e=>{let t=e.metrics??[],n=e=>t.find(t=>t.name===e),o=(t,n,o)=>{if(!t||!n||!(t.value>r))return;let s=n.value/t.value;s<i*G&&a.push({direction:o,fileCount:t.value,avgBytes:s,nodeName:e.name,node:e})};o(n(Fr),n(Ir),`read`),o(n(Lr),n(Rr),`write`)}),a.length===0)return null;let o=Yt(e.id,t.stages);return a.map(t=>{let n=br([t.node],o),r=t.node.id?[t.node.id]:[];return{type:`smallFiles`,executionId:e.id,stageIds:n,planNodeIds:r,impactBand:`warning`,metric:`avgFileSizeBytes`,value:Math.round(t.avgBytes),fileCount:t.fileCount,direction:t.direction,nodeName:t.nodeName,recommendation:t.direction===`read`?`${t.fileCount} small files were read at ${M(t.nodeName)}: consider compacting the upstream output so fewer, larger files are produced.`:`${t.fileCount} small files were written at ${M(t.nodeName)}: repartition or coalesce before writing to raise the average file size.`}})},estimate(e,t){let n=(e.fileCount??0)*10,r=e.stageIds,i=1;if(e.direction===`read`)for(let e of r??[])i=Math.max(i,t.stages.get(e)?.peakConcurrentTasks??1);return sr(n/i,r,t)}}),ii({type:`broadcastSizing`,order:132,fixEffort:`config`,version:2,emits:[`overBroadcast`,`underBroadcast`],docAnchor:`#bottleneck-broadcast-sizing`,thresholds:{broadcastTiers:[10*G,100*G,K,5*K],comparisonTiers:[10*K,300*K,gr],overBroadcastBytes:K},detect(e,t,n){if(!e.planTree)return null;let{broadcastTiers:r,comparisonTiers:i,overBroadcastBytes:a}=n,o=Yt(e.id,t.stages),s=[];return Bt(e.planTree,t=>{if(t.name===`SortMergeJoin`&&(t.children??[]).length===2){let[n,a]=t.children,c=zr(n),l=zr(a),u=Math.min(c,l),d=Math.max(c,l);if(u>0&&(u<r[0]||u<r[1]&&d>i[0]||u<r[2]&&d>i[1]||u<r[3]&&d>i[2])){let t=[...Br(n),...Br(a)];s.push({type:`underBroadcast`,executionId:e.id,stageIds:br(t,o),planNodeIds:t.map(e=>e.id).filter(Boolean),impactBand:`info`,metric:`smallerSideBytes`,value:u,largerSideBytes:d,recommendation:`The smaller input to this Sort Merge Join (${w(u)}) is well under the broadcast threshold relative to the larger side (${w(d)}): this could have been a broadcast join. Consider a broadcast() hint or raising spark.sql.autoBroadcastJoinThreshold.`})}}if($t(t.name)){let n=(t.metrics??[]).find(e=>e.name===`data size`);if(n&&n.value>a){let r=(t.children??[])[0];s.push({type:`overBroadcast`,executionId:e.id,stageIds:br(r?[r]:[],o),planNodeIds:[t.id].filter(Boolean),impactBand:`warning`,metric:`broadcastBytes`,value:n.value,recommendation:`This broadcast (${w(n.value)}) exceeds the ${_r(a)} threshold: check for a misapplied broadcast hint or a misconfigured spark.sql.autoBroadcastJoinThreshold.`})}}}),s.length?s:null},estimate(e,t){return sr((e.value??0)/Qn*1e3,e.stageIds,t)}})],yi=(()=>{let e=new Map;for(let t of vi)for(let n of t.emits)e.has(n)||e.set(n,t);return e})(),bi=vi;function xi(e,t){return t?.[e.type]}function Si(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e===t}function Ci(e,t){let n={};for(let[r,i]of Object.entries(xi(e,t)??{})){if(!Object.hasOwn(e.thresholds,r))continue;let t=e.thresholds[r];Si(i,t)||(n[r]={value:i,default:t})}return Object.keys(n).length>0?n:null}function wi(e,t){let n=Ci(e,t),r=e.suppressedBy?bi.find(t=>t.type===e.suppressedBy):void 0,i=r?Ci(r,t):null;if(!r||!i)return n;let a=Object.fromEntries(Object.entries(i).map(([e,t])=>[`${r.type}.${e}`,t]));return{...n,...a}}function Ti(e,t){let n=yi.get(e);return n?wi(n,t):null}function Ei(e){let t={};for(let n of bi){let r=Ci(n,e);r&&(t[n.type]=r)}return Object.keys(t).length>0?t:null}function Di(e,t){let n=xi(e,t);return n?{...e.thresholds,...n}:e.thresholds}function Oi(e){return Hr().map((t,n)=>{let r=bi[n],i=Ci(r,e);return i?{...t,thresholds:Di(r,e),tunedThresholds:i}:t})}function ki(e){return Array.isArray(e)?`[${e.join(`, `)}]`:String(e)}function Ai(e){return Object.entries(e).map(([e,{value:t,default:n}])=>`${e} ${ki(t)} (default ${ki(n)})`).join(`, `)}function ji(e){return`${Object.entries(e).map(([e,t])=>`${e} ${Ai(t)}`).join(`; `)}. Findings from these detectors are marked, and their impact estimates are uncalibrated: the estimates are calibrated against the default thresholds.`}function Mi(e,t){let n=`Produced with tuned thresholds: ${Ai(e)}.`;return t?`${n} Impact estimates are calibrated against the default thresholds, so this finding's estimate is unvalidated.`:n}function Ni(e){throw Error(`Unreachable case: ${JSON.stringify(e)}`)}function Pi(e,t){for(let n of e){let e=yi.get(n.type)?.estimate(n,t);e&&(n.impactEstimate=e)}return e}var Fi=vi;function Ii(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,`0`)}var Li=[`host`,`executorId`,`rule`,`variant`,`dimension`,`direction`,`nodeName`,`rootName`,`subtreeSize`,`groupIndex`,`largerSideBytes`,`rddId`,`relation`,`format`,`operator`,`executionIds`],Ri=new Map(Object.entries({skew:[],stageShape:[`rule`],shuffle:[],partitionSizing:[`rule`],spill:[],gc:[`direction`],slowHost:[`host`,`executorId`,`variant`,`dimension`],stageSlowness:[],stageFailed:[`variant`],failures:[],straggler:[],speculationWaste:[],retryWaste:[],tinyTask:[],incompleteRun:[],coldStart:[],utilization:[],memoryUtilization:[`executorId`,`variant`],cacheUtilization:[`variant`,`rddId`],coreLocality:[],autoscalingChurn:[],cachingOpportunity:[`variant`,`relation`,`format`,`operator`,`executionIds`],jobFailureRate:[],configAudit:[],duplicatePlanSubtree:[`rootName`,`subtreeSize`,`groupIndex`],smallFiles:[`direction`,`nodeName`],underBroadcast:[`largerSideBytes`],overBroadcast:[]}).map(([e,t])=>[e,new Set(t)]));function zi(e){return e.stageId==null?`executionId`in e?e.executionId:e.type===`configAudit`?e.property:``:e.stageId}function Bi(e){let t=e,n=Ri.get(e.type),r=Li.map(e=>{let r=n?.has(e)?t[e]:void 0;return Array.isArray(r)?r.join(`,`):r??``}).join(`|`);return Ii(`${e.type}|${zi(e)}|${e.metric??``}|${e.value??e.valueText??``}|${r}`)}function Vi(e){return`This overlaps with the ${e} finding on this stage: both are driven by the same dominant outlier task, so don't add their recoverable-time figures together.`}function Hi(e){let t=new Set(e.filter(e=>e.type===`skew`&&e.metric===`max/median`&&e.stageId!=null).map(e=>e.stageId));if(t.size===0)return;let n=new Set(e.filter(e=>e.type===`straggler`&&e.stageId!=null).map(e=>e.stageId)),r=new Set([...t].filter(e=>n.has(e)));if(r.size!==0)for(let t of e){if(t.stageId==null||!r.has(t.stageId))continue;let e=t.type===`skew`?Vi(`straggler`):t.type===`straggler`?Vi(`skew`):null;e&&(t.validationRequired=t.validationRequired?`${t.validationRequired} ${e}`:e)}}function Ui(e,t,n,r=null){if(!n)return;let i=t.version??1;for(let a of Array.isArray(n)?n:[n]){if(!a)continue;let n={...a,docAnchor:a.docAnchor??t.docAnchor,detectorVersion:i};r&&(n.tunedThresholds=r);let o=Bi(n);e.some(e=>e.id===o)||e.push({...n,id:o})}}function Wi(e){for(let t of e){if(!t.tunedThresholds)continue;let e=t.impactEstimate!=null&&t.impactEstimate.basis!==`informational`,n=Mi(t.tunedThresholds,e);t.validationRequired=t.validationRequired?`${t.validationRequired} ${n}`:n}}function Gi(e,t){let n=yi.get(e);if(!n)return null;let{floorPctWarn:r,floorPctCrit:i}=Di(n,t);return{warnPct:typeof r==`number`?r:Bn,critPct:typeof i==`number`?i:Vn}}function Ki(e){let t=new Map;for(let n of Fi){if(!n.suppressedBy)continue;let r=new Set(Fi.filter(e=>e.type===n.suppressedBy).flatMap(e=>e.emits));for(let i of n.emits){let n=t.get(i)??new Set;for(let t of e)r.has(t.type)&&t.stageId!=null&&n.add(t.stageId);t.set(i,n)}}return t.size===0?e:e.filter(e=>e.stageId==null||!t.get(e.type)?.has(e.stageId))}function qi(e,t,n,r,i,a=new Map,o=null,{thresholds:s}={}){let c=bn(e??{},n,r),l={stages:t,totalCores:c,occupancy:Nn(t,c)},u={app:e,jobs:i,executorsAdded:n,executorsRemoved:r,runAggregates:o,impact:l,stages:t,sql:a},d=[];for(let e of Fi){if(e.inScorecard===!1)continue;let t=xi(e,s),n=wi(e,s);switch(e.scope){case`stage`:{let r=e.withThresholds(t);for(let t of u.stages.values())Ui(d,e,r(t,u),n);break}case`sql`:{let r=e.withThresholds(t);for(let t of u.sql.values())Ui(d,e,r(t,u),n);break}case`app`:Ui(d,e,e.withThresholds(t)(u),n);break;case`config`:Ui(d,e,e.withThresholds(t)(u),n);break;default:Ni(e)}}let f=Ki(d);return Pi(f,l),Wi(f),Wn(f,e,s?e=>Gi(e,s):void 0),Hi(f),f.sort((e,t)=>S[e.impactBand]-S[t.impactBand]),f}var Ji=new WeakMap;function Yi(e){let t=[];for(let n of Fi)n.scope===`config`&&Ui(t,n,n.withThresholds()({app:e}));return Pi(t,{stages:new Map,occupancy:new Map,totalCores:0}),Wn(t,e),t.map(e=>({...e,stageId:e.stageId??null}))}function Xi(e){if(e===null)return Yi(e);let t=Ji.get(e);if(t)return t.slice();let n=Yi(e);return Ji.set(e,n),n.slice()}var Zi=`sparkforensics`,Qi=`recentFiles`,$i=10,ea=0;function ta(){let e=Date.now();return e>ea?(ea=e,e):++ea}function na(){return typeof window<`u`&&`showOpenFilePicker`in window}function ra(e){e.objectStoreNames.contains(Qi)&&e.deleteObjectStore(Qi),e.createObjectStore(Qi,{keyPath:`id`})}function ia(e,t,n){return`${e}::${t}::${n}`}function aa(){return new Promise((e,t)=>{let n=indexedDB.open(Zi,1);n.onupgradeneeded=()=>ra(n.result),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function oa(e,t){return e.transaction(Qi,t).objectStore(Qi)}function sa(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function ca({handle:e,name:t,size:n,lastModified:r,appName:i=null,issueCount:a=null}){let o=await aa();try{let s={id:ia(t,n,r),name:t,size:n,lastModified:r,handle:e,appName:i,issueCount:a,lastOpenedAt:ta()};await sa(oa(o,`readwrite`).put(s));let c=await sa(oa(o,`readonly`).getAll());if(c.length>$i){c.sort((e,t)=>e.lastOpenedAt-t.lastOpenedAt);let e=c.slice(0,c.length-$i);for(let t of e)await sa(oa(o,`readwrite`).delete(t.id))}return s}finally{o.close()}}async function la(){let e=await aa();try{return(await sa(oa(e,`readonly`).getAll())).sort((e,t)=>t.lastOpenedAt-e.lastOpenedAt)}finally{e.close()}}async function ua(e){let t=await aa();try{let n=await sa(oa(t,`readonly`).get(e));if(!n)return;n.lastOpenedAt=ta(),await sa(oa(t,`readwrite`).put(n))}finally{t.close()}}async function da(e){let t=await aa();try{await sa(oa(t,`readwrite`).delete(e))}finally{t.close()}}async function fa(e){let t=await aa();try{let n=await sa(oa(t,`readonly`).get(e));return n?n.handle:null}finally{t.close()}}async function pa(e,t=`read`){if(!e)return!1;let n=e,r={mode:t};return await n.queryPermission(r)===`granted`||await n.requestPermission(r)===`granted`}var ma=new Set([`local-server-unavailable`,`upstream-unreachable`,`application-not-found`,`access-or-upstream-failure`,`invalid-event-log`]),ha=[/^application_\d+_\d+$/,/^local-\d+$/,/^app-[A-Za-z0-9][A-Za-z0-9._-]*$/,/^spark-[A-Za-z0-9][A-Za-z0-9._~-]*$/,/^driver-\d+$/],ga=/^(?!\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._~-]*$/;function _a(e){return typeof e==`string`?e.trim():``}function va(e){let t=_a(e);if(!t||t.includes(`?`)||t.includes(`#`))return null;let n;try{n=new URL(t)}catch{return null}return n.protocol!==`http:`&&n.protocol!==`https:`||n.username||n.password||n.search||n.hash?null:(n.pathname=`${n.pathname.replace(/\/+$/,``)}/`,n.toString())}function ya(e){return ha.some(t=>t.test(e))}function ba(e){return ga.test(e)}function xa({baseUrl:e=``,appId:t=``,attemptId:n=``}={}){let r=va(e),i=_a(t),a=_a(n),o={baseUrl:r?null:`Enter an absolute HTTP(S) base URL without credentials, query, or fragment.`,appId:ya(i)?null:`Enter a supported Spark application ID.`,attemptId:!a||ba(a)?null:`Enter a URL-path-safe attempt ID.`};return o.baseUrl||o.appId||o.attemptId?{request:null,errors:o}:{request:{baseUrl:r,appId:i,attemptId:a||null},errors:o}}function Sa(e){return e?.request!=null}function Ca(e){return typeof e==`string`&&ma.has(e)}var J={current:null},wa={current:null};function Ta(e={}){let t=e.makeClient??Rt,n=(0,R.useCallback)(async e=>{let t=N.getState().taskDataCache.get(e);if(t)return t;let n=await J.current.requestTaskData(e);return N.getState().setTaskData(e,n),n},[]),r=(0,R.useCallback)(async(e=0)=>{let t=N.getState().appModel,n=D(t,{skippedLines:e}),r=qi(t.app,t.stages,t.executors.added,t.executors.removed,t.jobs,t.sql,t.runAggregates);N.getState().setFindings(r,Xi(t.app),n),N.getState().setSkippedLines(e),N.getState().setStatus(`ready`);let i=[...new Set(r.map(e=>e.stageId).filter(e=>e!=null))],a=await J.current.prefetchFlaggedStages(i);for(let{stageId:e,metrics:t,fieldNames:n}of a)N.getState().setTaskData(e,{metrics:t,fieldNames:n});let o=wa.current;if(o?.handle){let e=new Set(r.map(e=>e.stageId??`app:${e.type}`)).size;await ca({handle:o.handle,name:o.name,size:o.size,lastModified:o.lastModified,appName:t.app?.name??null,issueCount:e})}},[]),i=(0,R.useCallback)(()=>{let e=N.getState();e.activeFileId!=null&&e.appModel.app&&e.sessionCache.set(e.activeFileId,re(e.appModel,e.catalog,e.taskDataCache))},[]),a=(0,R.useCallback)(e=>(J.current?.terminate(),N.getState().resetModel(),N.getState().setStatus(`parsing`),N.getState().setActiveFile(null),wa.current=null,J.current=t(),zt(N.getState().appModel,{onProgress:e=>N.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>{r(e?.skippedLines??0)},onError:t=>{e?e(t):N.getState().setError(String(t?.message??t))}})),[t,r]),o=(0,R.useCallback)((e,t)=>{let n=a(),r=t?.id??ia(e.name,e.size,e.lastModified);N.getState().setActiveFile(r),t?.handle&&(wa.current={handle:t.handle,name:e.name,size:e.size,lastModified:e.lastModified}),J.current.startParse(e,n)},[a]),s=(0,R.useCallback)(e=>{let t=a();J.current.startParseFiles(Array.from(e),t)},[a]),c=(0,R.useCallback)((e,t)=>{let n=a(e=>{if(N.getState().setShsParsing(!1),e?.source===`shs`&&Ca(e.code)){N.getState().resetModel(),t(e);return}N.getState().setError(String(e?.message??e))});N.getState().setShsParsing(!0),J.current.startParseFromUrl(e,n)},[a]),l=(0,R.useCallback)(()=>{i(),J.current?.terminate(),N.getState().resetModel(),N.getState().setStatus(`idle`)},[i]),u=(0,R.useCallback)(()=>{J.current?.terminate(),J.current=null,wa.current=null,N.getState().resetModel(),N.getState().setActiveFile(null),N.getState().setStatus(`idle`)},[]),d=(0,R.useCallback)(async(e,t)=>{let n=N.getState();if(e===n.activeFileId)return`noop`;let r=n.sessionCache.get(e);if(r){i(),J.current?.terminate(),J.current=null;let t=ie(n.appModel,n.taskDataCache,r);return N.getState().setFindings(t,Xi(n.appModel.app)),N.getState().setActiveFile(e),N.getState().setStatus(`ready`),await ua(e),`restored`}let a=t??await fa(e);if(!a||!await pa(a))return`gone`;let s;try{s=await a.getFile()}catch(t){return t instanceof DOMException&&(t.name===`NotFoundError`||t.name===`NotAllowedError`)&&(await da(e).catch(()=>{}),n.sessionCache.delete(e)),`gone`}return i(),o(s,{handle:a,id:e}),`started`},[o,i]),f=(0,R.useCallback)((e,t)=>{let n=N.getState().sessionCache,r=n.get(e),i=n.get(t);return!r||!i?null:{baseline:{label:F(e),snapshot:r},candidate:{label:F(t),snapshot:i}}},[]),p=(0,R.useCallback)(async(e,t)=>{if(e.kind===`file`)return{start:t=>J.current.startParse(e.file,t)};if(e.kind===`folder`)return{start:t=>J.current.startParseFiles(e.files,t)};if(e.kind===`url`)return{start:t=>J.current.startParseFromUrl(e.request,t)};if(e.kind===`cached`)return null;let n=e.handle??await fa(e.id);if(!n)return N.getState().setError(`Run ${t}: this recent file is no longer available.`),null;if(!await pa(n))return N.getState().setError(`Run ${t}: permission to read this file was denied.`),null;let r;try{r=await n.getFile()}catch{return N.getState().setError(`Run ${t}: this recent file could not be read.`),null}return{start:e=>J.current.startParse(r,e)}},[]),m=(0,R.useCallback)((e,t=0)=>{let n=N.getState().appModel;N.getState().setEvidenceAvailability(D(n,{skippedLines:t}));let r=N.getState().appModel,i=qi(r.app,r.stages,r.executors.added,r.executors.removed,r.jobs,r.sql,r.runAggregates);N.getState().sessionCache.set(e,re(r,i,N.getState().taskDataCache))},[]),h=(0,R.useCallback)((e,n)=>{let r=(e,t)=>{J.current?.terminate(),N.getState().setCompareLoad(null),N.getState().setComparisonActive(!1);let n=t?.message??String(t);N.getState().setError(`Run ${e}: ${n}`)},i=async(e,n,i)=>{J.current?.terminate(),N.getState().resetModel(),N.getState().setActiveFile(e.id),N.getState().setCompareLoad({current:n===`A`?1:2}),J.current=t();let a=await p(e,n);if(!a){J.current?.terminate(),N.getState().setCompareLoad(null),N.getState().setComparisonActive(!1);return}let o=zt(N.getState().appModel,{onProgress:e=>N.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>i(e?.skippedLines??0),onError:e=>r(n,e)});a.start(o)},a=(e,t,n)=>{if(e.kind===`cached`){if(!N.getState().sessionCache.has(e.id)){N.getState().setError(`Run ${t}: this run is no longer loaded. Load its event log again.`);return}n();return}i(e,t,t=>{m(e.id,t),n()})};a(e,`A`,()=>{a(n,`B`,()=>{N.getState().setCompareLoad(null),N.getState().setActiveFile(null),N.getState().setCompareSeed(null),N.getState().openComparison(e.id,n.id)})})},[t,p,m]),g=(0,R.useCallback)(()=>{let e=N.getState(),t=e.activeFileId;t!=null&&e.appModel.app&&(l(),N.getState().setCompareSeed({id:t,label:F(t)}))},[l]);return{startLoad:o,startLoadFolder:s,startLoadFromUrl:c,resetToDropZone:l,cancelParse:u,getTaskData:n,pickRecent:d,prepareComparison:f,startCompareLoad:h,drillIntoRun:(0,R.useCallback)(e=>{let t=N.getState(),n=t.sessionCache.get(e);if(!n)return;J.current?.terminate(),J.current=null;let r=ie(t.appModel,t.taskDataCache,n);N.getState().setFindings(r,Xi(t.appModel.app)),N.getState().setActiveFile(e),N.getState().setStatus(`ready`),N.getState().setComparisonActive(!1)},[]),compareWithAnotherRun:g}}function Ea(e,t){let n=e?.startTime??0,r=[...t.values()].filter(e=>e.submittedAt!=null&&e.completedAt!=null).map(e=>[e.submittedAt,e.completedAt]),i=e?.endTime??null??(r.length>0?r.reduce((e,t)=>Math.max(e,t[1]),-1/0):n),a=Math.max(0,i-n);if(r.length===0)return{total:a,startup:a,stagesActive:0,gaps:0,idle:0};let o=_(r),s=o.reduce((e,[t,n])=>e+(n-t),0),c=o[0][0],l=Math.max(0,c-n),u=0;for(let e=1;e<o.length;e++)u+=o[e][0]-o[e-1][1];let d=o[o.length-1][1],f=Math.max(0,i-d);return{total:a,startup:l,stagesActive:s,gaps:u,idle:f}}var Da=new Set([`stageFailed`,`jobFailureRate`]);function Oa(e){let t=e.split(`
|
|
5
|
+
`)[0].trim();return t.length===0?null:t.length>240?`${t.slice(0,237).trimEnd()}...`:t}function ka(e){return typeof e==`string`?e:null}function Aa(e,t){let n=[...e.values()].filter(e=>e.result!=null),r=n.filter(e=>e.succeeded===!1).sort((e,t)=>e.id-t.id),i=new Set(r.flatMap(e=>e.stageIds)),a=t.filter(e=>e.type===`stageFailed`).sort((e,t)=>Number(i.has(t.stageId))-Number(i.has(e.stageId)))[0],o=a?.valueText??r.map(e=>ka(e.exception)).find(e=>e!=null)??null;return{failedJobs:r.length,totalJobs:n.length,failedJobStageIds:i,reason:r.length>0&&o!=null?Oa(o):null,reasonStageId:a?.stageId??null}}function ja(e,t){return t.reason==null?!1:e.type===`stageFailed`?Oa(e.valueText)===t.reason:e.type===`jobFailureRate`&&t.failedJobs===1&&(t.reasonStageId==null||t.failedJobStageIds.has(t.reasonStageId))}var Ma=`No stage in this log recorded an end, so the stage checks had nothing to measure.`,Na=`The log has no end-of-run record, so the core usage, memory and executor churn checks had no run length to measure.`;function Pa(e){return[...e.values()].some(e=>e.submittedAt!=null&&e.completedAt!=null)}function Fa(e){return`dataUnavailable`in e&&e.dataUnavailable===!0||!b(e)}var Ia=new Set([`utilization`,`memoryUtilization`,`autoscalingChurn`]),La=new Set(Hr().filter(e=>e.scope===`stage`).map(e=>e.type));function Ra(e){return e.some(e=>e.type===`incompleteRun`)}function za(e,t){let n=new Set;t&&n.add(Ma),Ra(e)&&n.add(Na);for(let t of e)Fa(t)&&t.recommendation&&n.add(t.recommendation);return[...n]}function Ba(e,t){return Aa(e.jobs,t).failedJobs>0||t.some(b)?!1:za(t,!Pa(e.stages)).length===0}function Va(e,t){let n=!Pa(e),r=Ra(t),i=new Map;for(let e of t)Fa(e)&&(i.get(e.type)||i.set(e.type,e.recommendation??null));let a=e=>i.get(e)||(n&&La.has(e)?Ma:r&&Ia.has(e)?Na:i.has(e)?`The log lacked the data this check needs.`:null);return{isNotRun:e=>a(e)!=null,notRunReason:a}}function Ha(e){let{failedJobs:t,totalJobs:n}=Aa(e.jobs,e.catalog);return{failedJobs:t,totalJobs:n,incomplete:Ra(e.catalog)}}function Ua(e){return String(e).toLowerCase().replace(/\b[0-9a-f]{8,}\b/g,`#`).replace(/\d+/g,`#`).replace(/\s+/g,` `).trim()}function Wa(e){if(!e)return null;function t(e){let n=(e.children??[]).map(t).sort();return cr(JSON.stringify([Ua(e.name??``),Sr(e.detail??``),n]))}return t(e)}function Ga(e,t){let n=e.sqlExecutionId;if(n==null)return``;let r=t.sql.get(n)?.planTree??null;if(!r)return``;let i=[];return(function t(n){n.stageIds?.includes(e.id)&&i.push(JSON.stringify([Ua(n.name??``),Sr(n.detail??``)]));for(let e of n.children??[])t(e)})(r),i.length===0?Wa(r)??``:cr(JSON.stringify(i.sort()))}function Ka(e,t){return Ua(e.name??``)+`§`+Ga(e,t)}function qa(e){let t=new Map;for(let[n,r]of e.stages){let i=Ka(r,e),a=t.get(i);a?a.push(n):t.set(i,[n])}return t}function Ja(e,t){let n=qa(e),r=qa(t),i=[],a=new Set,o=new Set;for(let e of[n,r])for(let[t,n]of e)n.length>1&&o.add(t);for(let e of[...n.keys()].sort()){let t=r.get(e);if(!t)continue;let o=n.get(e);if(o.length!==t.length)continue;let s=[...o].sort((e,t)=>e-t),c=[...t].sort((e,t)=>e-t);for(let t=0;t<s.length;t++)i.push({identity:e,baseId:s[t],candId:c[t]});a.add(e)}let s=e.stages.size+t.stages.size;return{pairs:i,matchedIdentities:a,collisionIdentities:o,coverage:s===0?1:2*i.length/s}}function Ya(e){if(e.length===0)return null;let t=[...e].sort((e,t)=>e-t),n=Math.ceil(.95*t.length)-1;return t[Math.min(t.length-1,Math.max(0,n))]}function Xa(e,t){let n=0,r=!1;for(let i of e){let e=i[t];Number.isFinite(e)&&(n+=e,r=!0)}return{sum:n,present:r}}function Za(e){let t=(e.completedAt??0)-(e.submittedAt??0);return t>0&&Number.isFinite(e.taskDurationMax)?e.taskDurationMax/t:null}function Qa(e){let t=[];for(let n of e){let e=Za(n);e!=null&&t.push(e)}return t}var $a=new Set([`inputBytes`,`outputBytes`,`taskCount`,`executorsAdded`]);function eo(e,t,n){if(t==null||n==null)return`unavailable`;if($a.has(e))return n===t?`unchanged`:`neutral`;let r=n-t;return r<0?`improvement`:r>0?`regression`:`unchanged`}function to(e,t,n,r,i={}){let a=eo(e,n,r);return{key:e,label:t,baseline:n,candidate:r,delta:n==null||r==null?null:r-n,direction:a,...i}}function no(e,t){let n=[];n.push(to(`wallClock`,`Wall-clock duration`,Ea(e.app,e.stages).total,Ea(t.app,t.stages).total));let r=Xa([...e.stages.values()],`memoryBytesSpilled`),i=Xa([...t.stages.values()],`memoryBytesSpilled`);n.push(to(`shuffleSpill`,`Shuffle spill`,r.present?r.sum:null,i.present?i.sum:null,{unavailableReason:r.present&&i.present?void 0:`No shuffle-spill data recorded for a run`}));let a=Ya(Qa([...e.stages.values()])),o=Ya(Qa([...t.stages.values()]));n.push(to(`taskSkew`,`Task skew (p95)`,a,o,{unavailableReason:a!=null&&o!=null?void 0:`No stage had measurable duration for a run`}));let s=Xa([...e.stages.values()],`taskCount`),c=Xa([...t.stages.values()],`taskCount`),l=Xa([...e.stages.values()],`failedTasks`),u=Xa([...t.stages.values()],`failedTasks`),d=s.present&&s.sum>0&&l.present?l.sum/s.sum:null,f=c.present&&c.sum>0&&u.present?u.sum/c.sum:null;n.push(to(`failedTaskRate`,`Failed-task rate`,d,f,{unavailableReason:d!=null&&f!=null?void 0:`No task or failure counts recorded for a run`}));let p=(r,i,a,o)=>{let s=Xa([...e.stages.values()],a),c=Xa([...t.stages.values()],a);n.push(to(r,i,s.present?s.sum:null,c.present?c.sum:null,{unavailableReason:s.present&&c.present?void 0:o}))};p(`diskSpill`,`Disk spill`,`diskBytesSpilled`,`No disk-spill data recorded for a run`),p(`gcTime`,`GC time`,`jvmGCTime`,`No GC-time data recorded for a run`),p(`inputBytes`,`Input read`,`inputBytes`,`No input-bytes data recorded for a run`),p(`outputBytes`,`Output written`,`outputBytes`,`No output-bytes data recorded for a run`),p(`executorRunTime`,`Executor run-time`,`executorRunTime`,`No executor run-time recorded for a run`),p(`taskCount`,`Task count`,`taskCount`,`No task counts recorded for a run`);let m=e=>Array.isArray(e.executors?.added)?e.executors.added.length:null,h=m(e),g=m(t);return n.push(to(`executorsAdded`,`Executors added`,h,g,{unavailableReason:h!=null&&g!=null?void 0:`No executor events recorded for a run`})),n}function ro(e,t){let n=e=>{let t=new Map;for(let n of e.catalog){let r=`rule`in n&&typeof n.rule==`string`?n.rule:n.type,i=n.impactBand??`unknown`,a=`${r}§${i}`,o=t.get(a)??{rule:r,type:n.type,impactBand:i,count:0,stages:new Set};o.count++;let s=n.stageId==null?null:e.stages.get(n.stageId);s?.name&&o.stages.add(s.name),t.set(a,o)}return t},r=n(e),i=n(t),a=[],o=[];for(let e of[...new Set([...r.keys(),...i.keys()])].sort()){let t=r.get(e),n=i.get(e),s=t?.count??0,c=n?.count??0;if(c===s)continue;let l=n??t,u=c>s?n:t,d={rule:l.rule,type:l.type,impactBand:l.impactBand,baseCount:s,candCount:c,delta:c-s,stages:[...u.stages].sort()};(c>s?a:o).push(d)}return{introduced:a,resolved:o}}function io(e,t){return e?.name!=null&&t?.name!=null&&e.name!==t.name}function ao(e,t,n){return n.pairs.map(n=>{let r=Za(e.stages.get(n.baseId)),i=Za(t.stages.get(n.candId));return{identity:n.identity,baseId:n.baseId,candId:n.candId,baseline:r,candidate:i,delta:r!=null&&i!=null?i-r:null}}).sort((e,t)=>e.identity<t.identity?-1:+(e.identity>t.identity))}function oo(e){let t=e=>Number.isFinite(e)?e:null,n=(e.completedAt??0)-(e.submittedAt??0);return{duration:n>0?n:null,memoryBytesSpilled:t(e.memoryBytesSpilled),diskBytesSpilled:t(e.diskBytesSpilled),jvmGCTime:t(e.jvmGCTime),inputBytes:t(e.inputBytes),outputBytes:t(e.outputBytes),executorRunTime:t(e.executorRunTime),taskCount:t(e.taskCount),failedTasks:t(e.failedTasks)}}function so(e){return[...e.stages].map(([e,t])=>({id:e,name:t.name??`Stage ${e}`,metrics:oo(t)}))}var co=.5;function lo(e,t){let n=e.snapshot,r=t.snapshot,i=Ja(n,r),a=io(n.app,r.app),o=i.coverage<co,s=a&&o?`Run names differ and only ${(i.coverage*100).toFixed(0)}% of stages matched, so deltas may compare different work.`:a?`Run names differ, so deltas may compare different work.`:o?`Only ${(i.coverage*100).toFixed(0)}% of stages matched between runs, so per-stage rows mostly compare unrelated work.`:null;return{baselineLabel:e.label,candidateLabel:t.label,confidence:a||o?`low`:`ok`,reason:s,matchedCoverage:i.coverage,metrics:no(n,r),findings:ro(n,r),stageSkew:ao(n,r,i),baseStages:so(n),candStages:so(r),jobOutcomes:{baseline:Ha(n),candidate:Ha(r)}}}function uo({entries:e,activeId:t=null,onPick:n,onRemove:r}){return e.length?(0,B.jsx)(`ul`,{className:`flex flex-col gap-0.5`,children:e.map(e=>{let i=e.appName||e.name,a=e.issueCount==null?``:` · ${e.issueCount} issue${e.issueCount===1?``:`s`}`;return(0,B.jsxs)(`li`,{className:L(`flex items-center gap-1 rounded-md`,e.id===t&&`bg-accent`),children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable flex min-w-0 flex-1 cursor-pointer flex-col items-start gap-0.5 rounded-md px-1.5 py-1 text-left hover:bg-muted`,onClick:()=>n?.(e.id),children:[(0,B.jsx)(`span`,{className:`w-full truncate text-sm font-medium`,children:i}),(0,B.jsxs)(`span`,{className:`w-full truncate text-xs text-muted-foreground`,children:[e.name,` · `,w(e.size),a]})]}),(0,B.jsx)(V,{type:`button`,variant:`ghost`,size:`icon`,className:`tap-target-comfortable`,"aria-label":`Remove from recent files`,onClick:()=>r?.(e.id),children:(0,B.jsx)(Ft,{"aria-hidden":`true`})})]},e.id)})}):(0,B.jsx)(`p`,{className:`px-1.5 py-1 text-sm text-muted-foreground`,children:`No recent files yet`})}var fo=`sample-run`;function po(e,t){let n=e=>e.match(/(\d+)|(\D+)/g)??[e],r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]??``,n=i[e]??``;if(t===n)continue;let a=Number(t),o=Number(n);return!Number.isNaN(a)&&!Number.isNaN(o)?a-o:t<n?-1:1}return 0}function mo(e){let t=e.filter(e=>!e.toLowerCase().startsWith(`appstatus`)).filter(e=>/^events_\d+_/.test(e)),n=e=>parseInt(e.match(/^events_(\d+)_/)[1],10),r=t.filter(e=>e.endsWith(`.compact`)).map(n),i=r.length>0?Math.max(...r):-1,a=t.filter(e=>{let t=n(e);return e.endsWith(`.compact`)?t===i:t>i}).sort(po),o=a.map(n);for(let e=1;e<o.length;e++)if(o[e]!==o[e-1]+1)throw Error(`Rolling event-log directory is missing file(s) between index ${o[e-1]} and ${o[e]}.`);return a}var ho={baseUrl:`shuffle-works-shs-base-url`,appId:`shuffle-works-shs-app-id`,attemptId:`shuffle-works-shs-attempt-id`};function go(e){if(typeof window>`u`)return``;try{return window.localStorage.getItem(ho[e])??``}catch{return``}}var _o=`sample-runs/sample-run.ndjson.gz`,vo=`docs/user-guide/getting-started.html#local-server-mode`,yo={"local-server-unavailable":`The local server is unavailable. Start local-server mode, then try again.`,"upstream-unreachable":`The History Server could not be reached. Check the address and try again.`,"application-not-found":`The requested application was not found. Check the application and attempt IDs.`,"access-or-upstream-failure":`The History Server could not provide this event log. Check access and try again.`,"invalid-event-log":`The response did not contain a supported event log. Choose a local file or try another application.`};async function bo(e){let t=e.createReader(),n=[];for(;;){let e=await new Promise((e,n)=>t.readEntries(e,n));if(e.length===0)break;n.push(...e)}let r=n.filter(e=>e.isFile);return Promise.all(r.map(e=>new Promise((t,n)=>e.file(t,n))))}function xo({onPick:e,compact:t=!1}={}){let{startLoad:n,startLoadFolder:r,startLoadFromUrl:i,pickRecent:a}=Ta(),o=P(e=>e.shsParsing),s=(0,R.useRef)(null),c=(0,R.useRef)(null),[l,u]=(0,R.useState)(!1),[d,f]=(0,R.useState)([]),[p,m]=(0,R.useState)(()=>go(`baseUrl`)),[h,g]=(0,R.useState)(()=>go(`appId`)),[_,v]=(0,R.useState)(()=>go(`attemptId`)),[b,x]=(0,R.useState)(!1),[S,C]=(0,R.useState)(!1),[w,T]=(0,R.useState)(!1),[E,D]=(0,R.useState)(!1),[O,k]=(0,R.useState)({baseUrl:!1,appId:!1,attemptId:!1}),[A,ee]=(0,R.useState)(null),te=(0,R.useRef)(null),[ne,j]=(0,R.useState)(!1),M=xa({baseUrl:p,appId:h,attemptId:_}),re=w||o,ie=b||o;(0,R.useEffect)(()=>{A&&te.current?.focus()},[A]),(0,R.useEffect)(()=>{if(t)return;let e=new AbortController,n=setTimeout(()=>e.abort(),800);return fetch(`/shs-proxy`,{signal:e.signal}).then(e=>{e.status===400&&D(!0)}).catch(()=>{}).finally(()=>clearTimeout(n)),()=>{clearTimeout(n),e.abort()}},[t]);let ae=(0,R.useCallback)(()=>{la().then(e=>f(e)).catch(()=>f([]))},[]);(0,R.useEffect)(()=>{ae()},[ae]);let oe=(0,R.useCallback)(async()=>{j(!0);try{let t=await fetch(_o);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.blob(),i=new File([r],`sample-run.ndjson.gz`,{type:`application/gzip`});e?e({kind:`file`,id:ia(i.name,i.size,i.lastModified),label:i.name,file:i}):n(i,{id:fo})}catch{N.getState().setError(`Could not load the sample run. Check your connection and try again, or choose a file below.`)}finally{j(!1)}},[n,e]),se=(0,R.useCallback)(async()=>{if(na()){let t;try{[t]=await window.showOpenFilePicker()}catch{return}try{let r=await t.getFile();e?e({kind:`file`,id:ia(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t})}catch{N.getState().setError(`Could not read the selected file.`)}return}s.current?.click()},[n,e]),le=(0,R.useCallback)(t=>{let n=t.map(e=>e.name);if(!n.some(e=>/^events_\d+_/.test(e))){N.getState().setError(`This isn't a Spark rolling event-log directory. Choose file to load a single event log.`);return}let i;try{i=mo(n)}catch(e){N.getState().setError(e.message);return}let a=new Map(t.map(e=>[e.name,e])),o=i.map(e=>a.get(e));if(e){let t=o[0];e({kind:`folder`,id:`folder:${t?.name??i[0]}`,label:`${o.length}-file rolling log`,files:o});return}r(o)},[r,e]),ue=(0,R.useCallback)(t=>{let r=t.target.files?.[0];r&&(e?e({kind:`file`,id:ia(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r)),t.target.value=``},[n,e]),F=(0,R.useCallback)(e=>{let t=Array.from(e.target.files??[]);t.length&&le(t),e.target.value=``},[le]),de=(0,R.useCallback)(async t=>{let r=t.dataTransfer.files[0],i=t.dataTransfer.items?.[0],a=i?.webkitGetAsEntry?.();if(a&&a.isDirectory){try{let e=await bo(a);le(e)}catch{N.getState().setError(`Could not read the dropped folder.`)}return}if(na()&&i?.getAsFileSystemHandle)try{let t=await i.getAsFileSystemHandle();if(t&&t.kind===`file`){let r=await t.getFile();e?e({kind:`file`,id:ia(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t});return}}catch{N.getState().setError(`Could not read the selected file.`);return}r&&(e?e({kind:`file`,id:ia(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r))},[n,le,e]),fe=(0,R.useCallback)(e=>{e.preventDefault(),u(!1),de(e)},[de]),I=(0,R.useCallback)(async t=>{let n=d.find(e=>e.id===t);if(e){e({kind:`recent`,id:t,label:n?.appName||n?.name||t,handle:n?.handle});return}let r=await a(t,n?.handle);(r===`restored`||r===`gone`)&&ae()},[d,a,ae,e]),me=(0,R.useCallback)(e=>{let t=d.find(t=>t.id===e);da(e).catch(()=>{}).finally(ae),t&&Be(`Removed "${t.appName||t.name}" from recent files`,{action:{label:`Undo`,onClick:()=>{ca(t).catch(()=>{}).finally(ae)}}})},[d,ae]),he=(0,R.useCallback)((e,t)=>{if(e===`baseUrl`&&m(t),e===`appId`&&g(t),e===`attemptId`&&v(t),ee(null),typeof window<`u`)try{window.localStorage.setItem(ho[e],t)}catch{}},[]),ge=(0,R.useCallback)(e=>{k(t=>({...t,[e]:!0}))},[]),_e=(0,R.useCallback)(t=>{t.preventDefault(),k({baseUrl:!0,appId:!0,attemptId:!0}),ee(null);let n=M.request;if(Sa(M)&&n){if(e){let t=n.attemptId?`${n.appId}/${n.attemptId}`:n.appId;e({kind:`url`,id:t,label:t,request:n});return}i(n,e=>{ee({code:e.code,message:e.message})})}},[M,i,e]),z=e=>O[e]?M.errors[e]:null,ve=(0,B.jsxs)(`section`,{className:`landing-history-server w-full text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable flex w-full cursor-pointer items-center justify-between rounded-md border border-border px-3 py-2 text-left text-sm font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":re,"aria-controls":`shs-fetch-panel`,onClick:()=>T(e=>!e),children:[`Fetch from Spark History Server`,re?(0,B.jsx)(ce,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(pe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),re?(0,B.jsxs)(`div`,{id:`shs-fetch-panel`,className:`mt-3 rounded-md border border-border p-4`,children:[(0,B.jsx)(`p`,{className:`mb-3 text-sm text-muted-foreground`,children:`Requires local-server mode and a History Server reachable from this machine.`}),(0,B.jsxs)(`form`,{onSubmit:_e,className:`flex flex-col gap-3`,children:[(0,B.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-3`,children:[(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Base URL`,(0,B.jsx)(`input`,{type:`text`,value:p,onChange:e=>he(`baseUrl`,e.target.value),onBlur:()=>ge(`baseUrl`),placeholder:`http://history-server:18080`,"aria-label":`Spark History Server base URL`,"aria-invalid":!!z(`baseUrl`),"aria-describedby":z(`baseUrl`)?`shs-base-url-error`:void 0,className:`tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground`}),z(`baseUrl`)?(0,B.jsx)(`span`,{id:`shs-base-url-error`,className:`text-destructive`,children:z(`baseUrl`)}):null]}),(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Application ID`,(0,B.jsx)(`input`,{type:`text`,value:h,onChange:e=>he(`appId`,e.target.value),onBlur:()=>ge(`appId`),placeholder:`application_1234567890_0001`,"aria-label":`Application ID`,"aria-invalid":!!z(`appId`),"aria-describedby":z(`appId`)?`shs-app-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground`}),z(`appId`)?(0,B.jsx)(`span`,{id:`shs-app-id-error`,className:`text-destructive`,children:z(`appId`)}):null]}),(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Attempt ID (optional)`,(0,B.jsx)(`input`,{type:`text`,value:_,onChange:e=>he(`attemptId`,e.target.value),onBlur:()=>ge(`attemptId`),placeholder:`2`,"aria-label":`Attempt ID (optional)`,"aria-invalid":!!z(`attemptId`),"aria-describedby":z(`attemptId`)?`shs-attempt-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground`}),z(`attemptId`)?(0,B.jsx)(`span`,{id:`shs-attempt-id-error`,className:`text-destructive`,children:z(`attemptId`)}):null]})]}),o?(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:`Fetching event log…`}):null,A?(0,B.jsxs)(`p`,{ref:te,role:`alert`,tabIndex:-1,className:`text-sm text-destructive`,children:[yo[A.code],` `,`Edit the fields, review `,(0,B.jsx)(`a`,{href:vo,target:`_blank`,rel:`noopener noreferrer`,className:`tap-target-comfortable text-primary underline-offset-4 hover:underline`,children:`Local-server setup`}),`, or choose a local file.`,A.message?(0,B.jsx)(`span`,{"data-testid":`shs-error-detail`,className:`mt-1 block`,children:A.message}):null]}):null,(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsx)(V,{type:`submit`,className:`tap-target-comfortable`,disabled:!Sa(M)||o,children:`Fetch`}),(0,B.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Application IDs: application_…, local-…, app-…, spark-…, or driver-…`})]})]})]}):null]});return(0,B.jsxs)(`div`,{"data-testid":`drop-zone`,role:`region`,"aria-label":`Drop Spark event log file here`,className:L(`mx-auto flex w-full flex-col items-center justify-center gap-6 rounded-xl border-2 border-dashed border-border p-6 text-center transition-colors`,t?`max-w-full`:`landing-drop-zone max-w-none p-6 sm:p-8`,l&&`border-primary bg-primary/5`),onDragOver:e=>{e.preventDefault(),u(!0)},onDragLeave:()=>u(!1),onDrop:fe,children:[(0,B.jsx)(jt,{"aria-hidden":`true`,className:`size-10 text-primary`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`font-heading text-lg font-semibold`,children:`Choose a Spark event log`}),(0,B.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Drop an event log file here, or choose a file below.`}),(0,B.jsx)(`p`,{className:`mt-1 max-w-xl text-xs text-muted-foreground`,children:`Accepts a Spark event log file: newline-delimited JSON, one event per line, optionally gzip/Zstandard/LZ4/Snappy-compressed, or the .zip a Spark History Server download returns.`})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-2`,children:[(0,B.jsx)(V,{type:`button`,className:`tap-target-comfortable`,onClick:()=>void se(),children:`Choose file`}),t?null:(0,B.jsx)(V,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>void oe(),disabled:ne,children:ne?`Loading sample…`:`Try a sample run`})]}),t?null:(0,B.jsxs)(`section`,{className:`w-full max-w-2xl text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable mx-auto flex cursor-pointer items-center gap-1 rounded-sm text-sm font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":S,"aria-controls":`find-event-log-panel`,onClick:()=>C(e=>!e),children:[`Where do I find my event log?`,S?(0,B.jsx)(ce,{"aria-hidden":`true`,className:`size-4 shrink-0`}):(0,B.jsx)(pe,{"aria-hidden":`true`,className:`size-4 shrink-0`})]}),S?(0,B.jsxs)(`div`,{id:`find-event-log-panel`,className:`mt-3 rounded-md border border-border bg-background p-4 text-sm`,children:[(0,B.jsxs)(`ol`,{className:`list-decimal space-y-2 pl-5 text-muted-foreground`,children:[(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Turn event logging on.`}),` Spark writes one log per application when `,(0,B.jsx)(`code`,{children:`spark.eventLog.enabled`}),` is `,(0,B.jsx)(`code`,{children:`true`}),`, into the directory set by`,` `,(0,B.jsx)(`code`,{children:`spark.eventLog.dir`}),` (for example `,(0,B.jsx)(`code`,{children:`/tmp/spark-events`}),`, or an HDFS or object-store path). Copy the file for your application from there.`]}),(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Or download it from a Spark History Server.`}),` Open`,` `,(0,B.jsx)(`code`,{children:`<history-server>/api/v1/applications/<app-id>/logs`}),` and drop the .zip it returns here as-is.`]}),(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Just exploring?`}),` `,(0,B.jsx)(`button`,{type:`button`,className:`cursor-pointer rounded-sm text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,onClick:()=>void oe(),disabled:ne,children:`Load the sample run`}),` `,`to see what the report looks like first.`]})]}),(0,B.jsx)(`a`,{href:y,target:`_blank`,rel:`noopener noreferrer`,className:`mt-3 inline-block text-primary underline-offset-4 hover:underline`,children:`More ways to get a log`})]}):null]}),(0,B.jsx)(`input`,{ref:s,type:`file`,className:`hidden`,"data-testid":`file-input`,"aria-label":`Choose file`,onChange:ue}),(0,B.jsx)(`input`,{ref:c,type:`file`,className:`hidden`,"data-testid":`folder-input`,"aria-label":`Choose rolling log folder`,onChange:F,webkitdirectory:`true`,directory:`true`}),t?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(V,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`}),(0,B.jsx)(`div`,{className:`w-full max-w-2xl`,children:ve})]}):(0,B.jsxs)(B.Fragment,{children:[E?(0,B.jsxs)(`div`,{className:`flex w-full max-w-2xl items-start gap-2 rounded-md border border-border p-4 text-left`,children:[(0,B.jsx)(Ct,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-muted-foreground`}),(0,B.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`If a Spark History Server is reachable, open`,` `,(0,B.jsx)(`strong`,{className:`font-medium text-foreground`,children:`Other sources`}),` below to fetch a run from it directly.`]})]}):null,(0,B.jsxs)(`section`,{className:`landing-other-sources w-full max-w-2xl text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable flex w-full cursor-pointer items-center justify-between rounded-md border border-border px-3 py-2 text-left text-sm font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":ie,"aria-controls":`other-sources-panel`,onClick:()=>x(e=>!e),children:[`Other sources`,ie?(0,B.jsx)(ce,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(pe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),ie?(0,B.jsxs)(`div`,{id:`other-sources-panel`,className:`mt-3 flex flex-col gap-3 rounded-md border border-border p-4`,children:[(0,B.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Use these for a rolling `,(0,B.jsx)(`code`,{children:`eventlog_v2_*`}),` directory or to fetch an application from a local Spark History Server.`]}),(0,B.jsx)(`div`,{children:(0,B.jsx)(V,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`})}),ve]}):null]})]}),d.length>0&&(0,B.jsxs)(`div`,{className:`w-full max-w-md text-left`,children:[(0,B.jsx)(`p`,{className:`mb-1 px-1.5 text-xs font-medium tracking-wide text-muted-foreground uppercase`,children:`Recent files`}),(0,B.jsx)(uo,{entries:d,onPick:e=>void I(e),onRemove:me})]})]})}var So=`npx sparkforensics-mcp`,Co=`{
|
|
6
|
+
"mcpServers": {
|
|
7
|
+
"sparkforensics": {
|
|
8
|
+
"command": "npx",
|
|
9
|
+
"args": ["sparkforensics-mcp"]
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}`;function wo(){return(0,B.jsxs)(ue,{className:`w-full`,children:[(0,B.jsx)(O,{className:L(ve({variant:`outline`}),`tap-target-comfortable`),children:`Use with an AI assistant (MCP)`}),(0,B.jsxs)(ae,{className:`mt-2 flex w-full flex-col gap-2 text-sm`,children:[(0,B.jsx)(`p`,{className:`text-muted-foreground`,children:`This project exposes an MCP server so an AI assistant can diagnose a run directly, without going through this web UI.`}),(0,B.jsx)(`pre`,{"data-testid":`mcp-config-snippet`,className:`overflow-x-auto rounded-md bg-muted p-2 text-xs whitespace-pre`,children:So}),(0,B.jsx)(`p`,{className:`text-muted-foreground`,children:`Or, in an MCP client config:`}),(0,B.jsx)(`pre`,{className:`overflow-x-auto rounded-md bg-muted p-2 text-xs whitespace-pre`,children:Co})]})]})}var To=`[data-shuffle-product-bar]`;function Eo(){return document.querySelector(To)}function Do({className:e,children:t}){let n=Eo();return n?(0,we.createPortal)((0,B.jsx)(`div`,{"data-shuffle-page-controls":!0,children:t}),n):(0,B.jsx)(`div`,{className:e,"data-shuffle-page-controls":!0,children:t})}function Oo({message:e,nonce:t}){let n=(0,R.useRef)(null);return(0,R.useEffect)(()=>{n.current?.focus()},[e,t]),(0,B.jsxs)(`div`,{ref:n,role:`alert`,tabIndex:-1,className:L(`mb-4 flex items-start gap-3 rounded-lg border-l-4 bg-critical/10 p-4 text-sm text-foreground`,ee.critical),children:[(0,B.jsx)(kt,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-critical`}),(0,B.jsx)(`p`,{children:e})]})}var ko=`docs/`;function Ao({label:e,onChange:t}){return(0,B.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-xl border border-border p-4`,children:[(0,B.jsxs)(`span`,{className:`min-w-0 truncate text-sm`,children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,className:`mr-2 text-clean`,children:`✓`}),e]}),(0,B.jsx)(V,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Change`})]})}function jo({testId:e,ariaLabel:t,source:n,onPick:r,onChange:i}){return(0,B.jsx)(`div`,{"data-testid":e,"aria-label":t,className:`min-w-0 flex-1`,children:n?(0,B.jsx)(Ao,{label:n.label,onChange:i}):(0,B.jsx)(xo,{onPick:r,compact:!0})})}function Mo({onClick:e}){return(0,B.jsxs)(V,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:e,children:[`Compare two runs `,(0,B.jsx)(at,{"aria-hidden":`true`})]})}function No(){return(0,B.jsxs)(`div`,{className:`landing-resources`,"aria-label":`SparkForensics resources`,children:[(0,B.jsxs)(`a`,{href:ko,target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,B.jsx)(te,{"aria-hidden":`true`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{children:`Read the docs`}),(0,B.jsx)(`span`,{children:`How to load a log, read the board, and use every finding.`})]}),(0,B.jsx)(at,{"aria-hidden":`true`,className:`landing-resource-arrow`})]}),(0,B.jsxs)(`a`,{href:se(`#intro`),target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,B.jsx)(st,{"aria-hidden":`true`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{children:`Spark optimization reference`}),(0,B.jsx)(`span`,{children:`Architecture, memory, shuffle, and tuning notes behind every finding.`})]}),(0,B.jsx)(at,{"aria-hidden":`true`,className:`landing-resource-arrow`})]})]})}function Po({onCompare:e}){return(0,B.jsxs)(`section`,{className:`landing-next-steps`,"aria-labelledby":`next-steps-title`,children:[(0,B.jsx)(`div`,{children:(0,B.jsx)(`h2`,{id:`next-steps-title`,children:`After your first run, go further with the same evidence.`})}),(0,B.jsxs)(`div`,{className:`landing-next-step-list`,children:[(0,B.jsxs)(`article`,{children:[(0,B.jsx)(pt,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Compare two runs`}),(0,B.jsx)(`p`,{children:`Use a baseline and candidate log to see which structurally matched stages changed.`}),(0,B.jsx)(Mo,{onClick:e})]})]}),(0,B.jsxs)(`article`,{children:[(0,B.jsx)(lt,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Use with an AI assistant`}),(0,B.jsx)(`p`,{children:`Connect MCP when you want an agent to inspect this evidence with you.`}),(0,B.jsx)(wo,{})]})]}),(0,B.jsxs)(`article`,{children:[(0,B.jsx)(Nt,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Automate it in Airflow`}),(0,B.jsx)(`p`,{children:`Run this analysis after every Spark job with sparkforensics-operator instead of checking runs by hand.`}),(0,B.jsxs)(V,{variant:`outline`,className:`tap-target-comfortable`,nativeButton:!1,render:(0,B.jsx)(`a`,{href:`https://github.com/shuffle-works/sparkforensics-operator`,target:`_blank`,rel:`noopener noreferrer`}),children:[`View sparkforensics-operator `,(0,B.jsx)(at,{"aria-hidden":`true`})]})]})]})]})]})}function Fo({errorMessage:e,errorNonce:t}={}){let{startCompareLoad:n,drillIntoRun:r}=Ta(),{theme:i,toggle:a}=H(),[o]=(0,R.useState)(()=>N.getState().compareSeed),[s,c]=(0,R.useState)(o!=null),[l,u]=(0,R.useState)(o?{kind:`cached`,...o}:null),[d,f]=(0,R.useState)(null),p=o!=null&&l?.kind===`cached`&&l.id===o.id;return s?(0,B.jsxs)(`div`,{className:`mx-auto flex w-full max-w-5xl flex-col gap-4`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsx)(`h2`,{className:`font-heading text-lg font-semibold`,children:`Compare two runs`}),(0,B.jsx)(V,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:()=>{if(p){N.getState().setCompareSeed(null),r(o.id);return}c(!1),u(null),f(null)},children:p?`Back to the run`:`Cancel`})]}),(0,B.jsx)(`p`,{className:`landing-compare-intro`,children:p?`Run A is the run you had open. Pick the run to compare it with, for example the same job after a change, as Run B.`:`Use Run A as the baseline and Run B as the candidate. Compare structurally matched stages to review material changes in a shared stage-level context.`}),e?(0,B.jsx)(Oo,{message:e,nonce:t}):null,(0,B.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`mb-2 text-sm font-medium text-muted-foreground`,children:`Run A (baseline)`}),(0,B.jsx)(jo,{testId:`compare-slot-a`,ariaLabel:`Run A`,source:l,onPick:u,onChange:()=>{N.getState().setCompareSeed(null),u(null)}})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`mb-2 text-sm font-medium text-muted-foreground`,children:`Run B (candidate)`}),(0,B.jsx)(jo,{testId:`compare-slot-b`,ariaLabel:`Run B`,source:d,onPick:f,onChange:()=>f(null)})]})]}),(0,B.jsx)(`div`,{className:`flex justify-end`,children:(0,B.jsx)(V,{type:`button`,className:`tap-target-comfortable`,disabled:!l||!d,onClick:()=>{l&&d&&n(l,d)},children:`Compare`})})]}):(0,B.jsxs)(`div`,{className:`landing-shell mx-auto w-full max-w-6xl`,children:[(0,B.jsxs)(`section`,{className:`landing-hero`,"aria-labelledby":`landing-title`,children:[(0,B.jsxs)(Do,{className:`landing-identity`,children:[(0,B.jsx)(rt,{"aria-hidden":`true`,className:`size-4`}),(0,B.jsx)(`span`,{children:`SparkForensics`}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-toggle tap-target-comfortable`,"aria-label":`Toggle theme`,"aria-pressed":i===`light`,title:`Toggle theme`,onClick:a,children:[(0,B.jsx)(Dt,{"aria-hidden":`true`,className:`theme-icon sun`}),(0,B.jsx)(yt,{"aria-hidden":`true`,className:`theme-icon moon`})]})]}),(0,B.jsxs)(`div`,{className:`landing-hero-copy`,children:[(0,B.jsx)(`h2`,{id:`landing-title`,children:`Analyze a Spark event log.`}),(0,B.jsx)(`p`,{children:`Load the log from one Spark run. You get a verdict on how it went, the stages worth fixing first, and the evidence behind each suggestion.`})]}),(0,B.jsxs)(`div`,{className:`landing-proof`,"aria-label":`SparkForensics guarantees`,children:[(0,B.jsxs)(`span`,{children:[(0,B.jsx)(Tt,{"aria-hidden":`true`}),` Nothing leaves your machine`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(lt,{"aria-hidden":`true`}),` Bring your AI into the investigation`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(pt,{"aria-hidden":`true`}),` Compare one run against another`]})]}),(0,B.jsx)(No,{}),(0,B.jsxs)(`div`,{className:`landing-intake`,children:[e?(0,B.jsx)(Oo,{message:e,nonce:t}):null,(0,B.jsx)(xo,{})]})]}),(0,B.jsx)(Po,{onCompare:()=>c(!0)})]})}function Io(e,t){let n=getComputedStyle(e);return t*parseFloat(n.fontSize)}function Lo(e,t){let n=getComputedStyle(e.ownerDocument.documentElement);return t*parseFloat(n.fontSize)}function Ro(e){return e/100*window.innerHeight}function zo(e){return e/100*window.innerWidth}function Bo(e){switch(typeof e){case`number`:return[e,`px`];case`string`:{let t=parseFloat(e);return e.endsWith(`%`)?[t,`%`]:e.endsWith(`px`)?[t,`px`]:e.endsWith(`rem`)?[t,`rem`]:e.endsWith(`em`)?[t,`em`]:e.endsWith(`vh`)?[t,`vh`]:e.endsWith(`vw`)?[t,`vw`]:[t,`%`]}}}function Vo({groupSize:e,panelElement:t,styleProp:n}){let r,[i,a]=Bo(n);switch(a){case`%`:r=i/100*e;break;case`px`:r=i;break;case`rem`:r=Lo(t,i);break;case`em`:r=Io(t,i);break;case`vh`:r=Ro(i);break;case`vw`:r=zo(i)}return r}function Y(e){return parseFloat(e.toFixed(3))}function Ho({group:e}){let{orientation:t,panels:n}=e;return n.reduce((e,n)=>(e+=t===`horizontal`?n.element.offsetWidth:n.element.offsetHeight,e),0)}function Uo(e){let{panels:t}=e,n=Ho({group:e});return n===0?t.map(e=>({groupResizeBehavior:e.panelConstraints.groupResizeBehavior,collapsedSize:0,collapsible:e.panelConstraints.collapsible===!0,defaultSize:void 0,disabled:e.panelConstraints.disabled,minSize:0,maxSize:100,panelId:e.id})):t.map(e=>{let{element:t,panelConstraints:r}=e,i=0;r.collapsedSize!==void 0&&(i=Y(Vo({groupSize:n,panelElement:t,styleProp:r.collapsedSize})/n*100));let a;r.collapsedThreshold!==void 0&&(a=Y(Vo({groupSize:n,panelElement:t,styleProp:r.collapsedThreshold})/n*100));let o;r.defaultSize!==void 0&&(o=Y(Vo({groupSize:n,panelElement:t,styleProp:r.defaultSize})/n*100));let s=0;r.minSize!==void 0&&(s=Y(Vo({groupSize:n,panelElement:t,styleProp:r.minSize})/n*100));let c=100;return r.maxSize!==void 0&&(c=Y(Vo({groupSize:n,panelElement:t,styleProp:r.maxSize})/n*100)),{groupResizeBehavior:r.groupResizeBehavior,collapsedSize:i,collapsedThreshold:a,collapsible:r.collapsible===!0,defaultSize:o,disabled:r.disabled,minSize:s,maxSize:c,panelId:e.id}})}var Wo=class{#e={};addListener(e,t){let n=this.#e[e];return n===void 0?this.#e[e]=[t]:n.includes(t)||n.push(t),()=>{this.removeListener(e,t)}}emit(e,t){let n=this.#e[e];if(n!==void 0){if(n.length===1)n[0].call(null,t);else{let e=!1,r=null,i=Array.from(n);for(let n=0;n<i.length;n++){let a=i[n];try{a.call(null,t)}catch(t){r===null&&(e=!0,r=t)}}if(e)throw r}}}removeAllListeners(){this.#e={}}removeListener(e,t){let n=this.#e[e];if(n!==void 0){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}},X={cursorFlags:0,state:`inactive`},Go=new Wo;function Ko(){return X}function qo(e){return Go.addListener(`change`,e)}function Jo(e,t=[],n,r=!1){let i=X,a={...X};a.cursorFlags=e,a.state===`active`&&(a.didPointerMove||=r,a.previews=t,n&&(a.previewLayoutMap=n)),X=a,Go.emit(`change`,{prev:i,next:a})}function Yo(e){let t=X;X=e,t.state===`active`&&e.state!==`active`&&t.didPointerMove&&t.hitRegions.forEach(({separator:e})=>{e&&e.element.ownerDocument.activeElement===e.element&&e.element.blur()}),Go.emit(`change`,{prev:t,next:e})}function Xo(e){X.state!==`active`||!X.previews.some(t=>t.separator===e)||Yo({...X,previews:X.previews.map(t=>t.separator===e?{...t}:t)})}function Zo(e){if(X.state===`inactive`)return!1;let t=X.hitRegions.filter(t=>t.group!==e),n=X.state===`active`&&X.previews.some(t=>t.group===e);if(t.length===X.hitRegions.length&&!n)return!1;if(t.length===0)Yo({cursorFlags:0,state:`inactive`});else if(X.state===`active`){let n=new Map(X.initialLayoutMap),r=new Map(X.previewLayoutMap);n.delete(e),r.delete(e),Yo({...X,cursorFlags:0,hitRegions:t,initialLayoutMap:n,previewLayoutMap:r,previews:X.previews.filter(t=>t.group!==e)})}else Yo({...X,hitRegions:t});return!0}var Qo=e=>e,$o=()=>{},es=1,ts=2,ns=4,rs=8,is=3,as=12,os;function ss(){return os===void 0&&(os=!1,typeof window<`u`&&(window.navigator.userAgent.includes(`Chrome`)||window.navigator.userAgent.includes(`Firefox`))&&(os=!0)),os}function cs({cursorFlags:e,groups:t,state:n}){let r=0,i=0;switch(n){case`active`:case`hover`:t.forEach(e=>{if(!e.mutableState.disableCursor)switch(e.orientation){case`horizontal`:r++;break;case`vertical`:i++}})}if(r!==0||i!==0){if(n===`active`&&e&&ss()){let t=(e&es)!==0,n=(e&ts)!==0,r=(e&ns)!==0,i=(e&rs)!==0;if(t)return r?`se-resize`:i?`ne-resize`:`e-resize`;if(n)return r?`sw-resize`:i?`nw-resize`:`w-resize`;if(r)return`s-resize`;if(i)return`n-resize`}return ss()?r>0&&i>0?`move`:r>0?`ew-resize`:`ns-resize`:r>0&&i>0?`grab`:r>0?`col-resize`:`row-resize`}}var ls=new WeakMap;function us(e){if(!e.defaultView||!e.adoptedStyleSheets)return;let{prevStyle:t,styleSheet:n}=ls.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&(Object.isExtensible(e.adoptedStyleSheets)?e.adoptedStyleSheets.push(n):e.adoptedStyleSheets=[...e.adoptedStyleSheets,n]));let r=Ko();switch(r.state){case`active`:case`hover`:{let e=cs({cursorFlags:r.cursorFlags,groups:r.hitRegions.map(e=>e.group),state:r.state}),i=`*, *:hover {cursor: ${e} !important; }`;if(t===i)return;t=i,e?n.cssRules.length===0?n.insertRule(i):n.replaceSync(i):n.cssRules.length===1&&n.deleteRule(0);break}case`inactive`:t=void 0,n.cssRules.length===1&&n.deleteRule(0)}ls.set(e,{prevStyle:t,styleSheet:n})}function Z(e,t=`Assertion error`){if(!e)throw Error(t)}function ds(e,t){return Array.from(t).sort((t,n)=>{let r=e===`horizontal`?fs(t,n):ps(t,n);if(r!==0)return r;let i=t.element.compareDocumentPosition(n.element);return i&Node.DOCUMENT_POSITION_DISCONNECTED?0:i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function fs(e,t){let n=e.element.offsetLeft-t.element.offsetLeft;return n===0?e.element.offsetWidth-t.element.offsetWidth:n}function ps(e,t){let n=e.element.offsetTop-t.element.offsetTop;return n===0?e.element.offsetHeight-t.element.offsetHeight:n}function ms(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.ELEMENT_NODE}function hs(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function gs({orientation:e,rects:t,targetRect:n}){let r={x:n.x+n.width/2,y:n.y+n.height/2},i,a=Number.MAX_VALUE;for(let n of t){let{x:t,y:o}=hs(r,n),s=e===`horizontal`?t:o;s<a&&(a=s,i=n)}return Z(i,`No rect found`),i}var _s;function vs(){return _s===void 0&&(_s=typeof matchMedia==`function`&&!!matchMedia(`(pointer:coarse)`).matches),_s}function ys({expandHitTargets:e=!0,group:t,includeDisabled:n=!1}){let{element:r,orientation:i,panels:a,separators:o}=t,s=ds(i,Array.from(r.children).filter(ms).filter(e=>!e.hasAttribute(`data-resize-preview`)).map(e=>({element:e}))).map(({element:e})=>e),c=[],l=!1,u=!1,d=-1,f,p=-1,m=0,h,g=[];{let e=-1;for(let t of s)t.hasAttribute(`data-panel`)&&(e++,t.hasAttribute(`data-disabled`)||(m++,d===-1&&(d=e),p=e))}if(n||m>1){let r=-1;for(let m of s)if(m.hasAttribute(`data-panel`)){r++;let o=a.find(e=>e.element===m);if(o){if(h){let a=h.element.getBoundingClientRect(),s=m.getBoundingClientRect(),_;if(u){let e=i===`horizontal`?new DOMRect(a.right,a.top,0,a.height):new DOMRect(a.left,a.bottom,a.width,0),t=i===`horizontal`?new DOMRect(s.left,s.top,0,s.height):new DOMRect(s.left,s.top,s.width,0);switch(g.length){case 0:_=[e,t];break;case 1:{let n=g[0];_=[n,gs({orientation:i,rects:[a,s],targetRect:n.element.getBoundingClientRect()})===a?t:e];break}default:_=g}}else _=g.length?g:[i===`horizontal`?new DOMRect(a.right,s.top,s.left-a.right,s.height):new DOMRect(s.left,a.bottom,s.width,s.top-a.bottom)];for(let i of _){let a=`width`in i?i:i.element.getBoundingClientRect(),s=e?vs()?t.resizeTargetMinimumSize.coarse:t.resizeTargetMinimumSize.fine:0;if(a.width<s){let e=s-a.width;a=new DOMRect(a.x-e/2,a.y,a.width+e,a.height)}if(a.height<s){let e=s-a.height;a=new DOMRect(a.x,a.y-e/2,a.width,a.height+e)}(n||!l&&!(r<=d||r>p))&&(f??=Ho({group:t}),c.push({group:t,groupSize:f,panels:[h,o],separator:`width`in i?void 0:i,rect:a})),l=!1}}u=!1,h=o,g=[]}}else if(m.hasAttribute(`data-separator`)){m.ariaDisabled!==null&&(l=!0);let e=o.find(e=>e.element===m);e?g.push(e):(h=void 0,g=[])}else u=!0}return c}var bs=new Map,xs=new Wo;function Ss(e){bs=new Map(bs),bs.delete(e)}function Cs(e,t){for(let[t]of bs)if(t.id===e)return t}function ws(e,t){for(let[t,n]of bs)if(t.id===e)return n;if(t)throw Error(`Could not find data for Group with id ${e}`)}function Ts(){return bs}function Es(e,t){return xs.addListener(`groupChange`,n=>{n.group.id===e&&t(n)})}function Ds(e,t,n){let r=bs.get(e);bs=new Map(bs),bs.set(e,t),xs.emit(`groupChange`,{group:e,isUserInteraction:n?.isUserInteraction===!0,prev:r,next:t})}function Os(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function Q(e,t,n=0){return Math.abs(Y(e)-Y(t))<=n}function ks(e,t){return Q(e,t)?0:e>t?1:-1}function As({overrideDisabledPanels:e,panelConstraints:t,prevSize:n,size:r}){let{collapsedSize:i=0,collapsedThreshold:a,collapsible:o,disabled:s,maxSize:c=100,minSize:l=0}=t;if(s&&!e)return n;if(ks(r,l)<0){if(o){let e=a??(l-i)/2,t=ks(n,i)<=0,o=t?i+e:l-e,s=ks(r,o);r=ks(r,i)<=0||s<0||a!==void 0&&t&&s===0?i:l}else r=l}return r=Math.min(c,r),r=Y(r),r}function js({delta:e,initialLayout:t,panelConstraints:n,pivotIndices:r,prevLayout:i,trigger:a}){if(Q(e,0))return t;let o=a===`imperative-api`,s=n.map(({panelId:e})=>t[e]),c=n.map(({panelId:e})=>i[e]),l=[...s],[u,d]=r;Z(u!=null,`Invalid first pivot index`),Z(d!=null,`Invalid second pivot index`);let f=0;switch(a){case`keyboard`:{let t=e<0?d:u,r=n[t];Z(r,`Panel constraints not found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(Z(n!=null,`Previous layout not found for panel index ${t}`),Q(n,i)){let t=o-n;ks(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}{let t=e<0?u:d,r=n[t];Z(r,`No panel constraints found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(Z(n!=null,`Previous layout not found for panel index ${t}`),Q(n,o)){let t=n-i;ks(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}break;default:{let t=e<0?d:u,r=n[t];Z(r,`Panel constraints not found for index ${t}`);let i=s[t],{collapsedSize:a,collapsedThreshold:o,collapsible:c,minSize:l}=r;if(c&&ks(i,l)<0){let t=l-a,n=o??t/2;if(ks(i+Math.abs(e),l)<0){let r=ks(Math.abs(e),n);e=r>0||r===0&&o===void 0&&e<0?e<0?-t:t:0}}break}}{let t=e<0?1:-1,r=e<0?d:u,i=0;for(;;){let e=s[r];Z(e!=null,`Previous layout not found for panel index ${r}`);let a=As({overrideDisabledPanels:o,panelConstraints:n[r],prevSize:e,size:100})-e;if(i+=a,r+=t,r<0||r>=n.length)break}let a=Math.min(Math.abs(e),Math.abs(i));e=e<0?0-a:a}{let t=e<0?u:d;for(;t>=0&&t<n.length;){let r=Math.abs(e)-Math.abs(f),i=s[t];Z(i!=null,`Previous layout not found for panel index ${t}`);let a=i-r,c=As({overrideDisabledPanels:o,panelConstraints:n[t],prevSize:i,size:a});if(!Q(i,c)&&(f+=i-c,l[t]=c,f.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?t--:t++}}if(Os(c,l))return i;{let t=e<0?d:u,r=s[t];Z(r!=null,`Previous layout not found for panel index ${t}`);let i=r+f,a=As({overrideDisabledPanels:o,panelConstraints:n[t],prevSize:r,size:i});if(l[t]=a,!Q(a,i)){let t=i-a,r=e<0?d:u;for(;r>=0&&r<n.length;){let i=l[r];Z(i!=null,`Previous layout not found for panel index ${r}`);let a=i+t,s=As({overrideDisabledPanels:o,panelConstraints:n[r],prevSize:i,size:a});if(Q(i,s)||(t-=s-i,l[r]=s),Q(t,0))break;e>0?r--:r++}}}return Q(Object.values(l).reduce((e,t)=>t+e,0),100,.1)?l.reduce((e,t,r)=>(e[n[r].panelId]=t,e),{}):i}function Ms(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(t[n]===void 0||ks(e[n],t[n])!==0)return!1;return!0}function Ns({commit:e,document:t,event:n,hitRegions:r,initialLayoutMap:i,mountedGroups:a,pointerDownAtPoint:o,prevCursorFlags:s}){let c=0,l=Ko(),u=l.state===`active`?l.previews:[],d=new Map(l.state===`active`?l.previewLayoutMap:void 0);r.forEach(t=>{let{group:r,groupSize:s}=t,{orientation:l,panels:f}=r;if(e&&r.resizePreviewMode!==`separator`)return;let{disableCursor:p}=r.mutableState,m=0;m=o?l===`horizontal`?(n.clientX-o.x)/s*100:(n.clientY-o.y)/s*100:l===`horizontal`?n.clientX<0?-100:100:n.clientY<0?-100:100;let h=i.get(r),g=a.get(r);if(!h||!g)return;let{defaultLayoutDeferred:_,derivedPanelConstraints:v,groupSize:y,layout:b,separatorToPanels:x}=g;if(v&&b&&x){let n=r.resizePreviewMode===`separator`?d.get(r)??b:b,i=js({delta:m,initialLayout:h,panelConstraints:v,pivotIndices:t.panels.map(e=>f.indexOf(e)),prevLayout:n,trigger:`mouse-or-touch`});if(r.resizePreviewMode===`separator`&&!e&&!Ms(i,n)){d.set(r,i);let e=0,t=f.map(t=>(e+=i[t.id]-h[t.id],s/100*e));u=u.map(e=>{if(e.group!==r)return e;let n=t[e.panelIndex];return n===e.offset?e:{...e,offset:n}})}if(Ms(i,n)&&m!==0&&!p)switch(l){case`horizontal`:c|=m<0?es:ts;break;case`vertical`:c|=m<0?ns:rs}(r.resizePreviewMode!==`separator`||e)&&!Ms(i,b)&&Ds(t.group,{defaultLayoutDeferred:_,derivedPanelConstraints:v,groupSize:y,layout:i,separatorToPanels:x})}});let f=0;n.movementX===0?f|=s&is:f|=c&is,n.movementY===0?f|=s&as:f|=c&as;let p=l.state===`active`&&(n.clientX!==l.pointerDownAtPoint.x||n.clientY!==l.pointerDownAtPoint.y);Jo(f,u,d,p),us(t)}function Ps(e,t){let n=Ko(),r=Ts(),i=!1;return n.state===`active`&&(Ns({commit:!0,document:e,event:t,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:r,pointerDownAtPoint:n.pointerDownAtPoint,prevCursorFlags:n.cursorFlags}),Yo({cursorFlags:0,state:`inactive`}),n.hitRegions.length>0&&(us(e),i=!0,n.hitRegions.forEach(e=>{if(!r.has(e.group))return;let t=ws(e.group.id,!0);Ds(e.group,t,{isUserInteraction:!0})}))),i}function Fs(e){e.defaultPrevented||Ps(e.currentTarget,e)}function Is(e,t,n){let r,i={x:1/0,y:1/0};for(let a of t){let t=hs(n,a.rect);switch(e){case`horizontal`:t.x<=i.x&&(r=a,i=t);break;case`vertical`:t.y<=i.y&&(r=a,i=t)}}return r?{distance:i,hitRegion:r}:void 0}function Ls(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function Rs(e,t){if(e===t)throw Error(`Cannot compare node with itself`);let n={a:Ws(e),b:Ws(t)},r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();Z(r,`Stacking order can only be calculated for elements with a common ancestor`);let i={a:Us(Hs(n.a)),b:Us(Hs(n.b))};if(i.a===i.b){let e=r.childNodes,t={a:n.a.at(-1),b:n.b.at(-1)},i=e.length;for(;i--;){let n=e[i];if(n===t.a)return 1;if(n===t.b)return-1}}return Math.sign(i.a-i.b)}var zs=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function Bs(e){let t=getComputedStyle(Gs(e)??e).display;return t===`flex`||t===`inline-flex`}function Vs(e){let t=getComputedStyle(e);return!!(t.position===`fixed`||t.zIndex!==`auto`&&(t.position!==`static`||Bs(e))||+t.opacity<1||`transform`in t&&t.transform!==`none`||`webkitTransform`in t&&t.webkitTransform!==`none`||`mixBlendMode`in t&&t.mixBlendMode!==`normal`||`filter`in t&&t.filter!==`none`||`webkitFilter`in t&&t.webkitFilter!==`none`||`isolation`in t&&t.isolation===`isolate`||zs.test(t.willChange)||t.webkitOverflowScrolling===`touch`)}function Hs(e){let t=e.length;for(;t--;){let n=e[t];if(Z(n,`Missing node`),Vs(n))return n}return null}function Us(e){return e&&Number(getComputedStyle(e).zIndex)||0}function Ws(e){let t=[];for(;e;)t.push(e),e=Gs(e);return t}function Gs(e){let{parentNode:t}=e;return Ls(t)?t.host:t}function Ks(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function qs({groupElement:e,hitRegion:t,pointerEventTarget:n}){if(!ms(n)||n.contains(e)||e.contains(n))return!0;if(Rs(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(Ks(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function Js(e,t){let n=[];return t.forEach((t,r)=>{if(r.disabled)return;let i=ys({group:r}),a=Is(r.orientation,i,{x:e.clientX,y:e.clientY});a&&a.distance.x<=0&&a.distance.y<=0&&qs({groupElement:r.element,hitRegion:a.hitRegion.rect,pointerEventTarget:e.target})&&n.push(a.hitRegion)}),n}function Ys({layout:e,panelConstraints:t}){let n=t.map(({panelId:t})=>e[t]),r=[...n],i=r.reduce((e,t)=>e+t,0);if(Object.keys(e).length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${Object.values(e).map(e=>`${e}%`).join(`, `)}`);if(!Q(i,100)&&r.length>0)for(let e=0;e<t.length;e++){let t=r[e];Z(t!=null,`No layout data found for index ${e}`);let n=100/i*t;r[e]=n}let a=0;for(let e=0;e<t.length;e++){let i=n[e];Z(i!=null,`No layout data found for index ${e}`);let o=r[e];Z(o!=null,`No layout data found for index ${e}`);let s=As({overrideDisabledPanels:!0,panelConstraints:t[e],prevSize:i,size:o});o!=s&&(a+=o-s,r[e]=s)}if(!Q(a,0))for(let e=0;e<t.length;e++){let n=r[e];Z(n!=null,`No layout data found for index ${e}`);let i=n+a,o=As({overrideDisabledPanels:!0,panelConstraints:t[e],prevSize:n,size:i});if(n!==o&&(a-=o-n,r[e]=o,Q(a,0)))break}return r.reduce((e,n,r)=>(e[t[r].panelId]=n,e),{})}function Xs({groupId:e,panelId:t}){let n=()=>{let t=Ts();for(let[n,{defaultLayoutDeferred:r,derivedPanelConstraints:i,layout:a,groupSize:o,separatorToPanels:s}]of t)if(n.id===e)return{defaultLayoutDeferred:r,derivedPanelConstraints:i,group:n,groupSize:o,layout:a,separatorToPanels:s};throw Error(`Group ${e} not found`)},r=()=>{let e=n().derivedPanelConstraints.find(e=>e.panelId===t);if(e!==void 0)return e;throw Error(`Panel constraints not found for Panel ${t}`)},i=()=>{let e=n().group.panels.find(e=>e.id===t);if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},a=()=>{let e=n().layout[t];if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},o=({nextSize:e,panels:n,prevLayout:r,derivedPanelConstraints:i})=>{let o=a(),s=n.findIndex(e=>e.id===t),c=s===0,l=s===n.length-1;if(l&&e<o&&(c||n.slice(0,s).every((e,t)=>{let n=i[t];return n?.collapsible&&Q(n.collapsedSize,r[n.panelId])}))){let e=n.slice(0,s).reduce((e,t)=>e+r[t.id],0);return{...r,[t]:Y(100-e)}}return js({delta:l?o-e:e-o,initialLayout:r,panelConstraints:i,pivotIndices:l?[s-1,s]:[s,s+1],prevLayout:r,trigger:`imperative-api`})},s=e=>{if(e===a())return;let{defaultLayoutDeferred:t,derivedPanelConstraints:r,group:i,groupSize:s,layout:c,separatorToPanels:l}=n(),u=Ys({layout:o({nextSize:e,panels:i.panels,prevLayout:c,derivedPanelConstraints:r}),panelConstraints:r});Ms(c,u)||Ds(i,{defaultLayoutDeferred:t,derivedPanelConstraints:r,groupSize:s,layout:u,separatorToPanels:l})};return{collapse:()=>{let{collapsible:e,collapsedSize:t}=r(),{mutableValues:n}=i(),o=a();e&&o!==t&&(n.expandToSize=o,s(t))},expand:()=>{let{collapsible:e,collapsedSize:t,minSize:n}=r(),{mutableValues:o}=i(),c=a();if(e&&c===t){let e=o.expandToSize??n;e===0&&(e=1),s(e)}},getSize:()=>{let{group:e}=n(),t=a(),{element:r}=i();return{asPercentage:t,inPixels:e.orientation===`horizontal`?r.offsetWidth:r.offsetHeight}},isCollapsed:()=>{let{collapsible:e,collapsedSize:t}=r(),n=a();return e&&Q(t,n)},resize:e=>{let{group:t}=n(),{element:r}=i(),a=Ho({group:t}),o=Y(Vo({groupSize:a,panelElement:r,styleProp:e})/a*100);s(o)}}}function Zs(e){e.defaultPrevented||Js(e,Ts()).forEach(t=>{if(t.separator&&!t.separator.disableDoubleClick){let n=t.panels.find(e=>e.panelConstraints.defaultSize!==void 0);if(n){let r=n.panelConstraints.defaultSize,i=Xs({groupId:t.group.id,panelId:n.id});i&&r!==void 0&&(i.resize(r),e.preventDefault())}}})}function Qs(e){let t=Ts();for(let[n]of t)if(n.separators.some(t=>t.element===e))return n;throw Error(`Could not find parent Group for separator element`)}function $s({groupId:e}){let t=()=>{let t=Ts();for(let[n,r]of t)if(n.id===e)return{group:n,...r};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){let{defaultLayoutDeferred:e,layout:n}=t();return e?{}:n},setLayout(e){let{defaultLayoutDeferred:n,derivedPanelConstraints:r,group:i,groupSize:a,layout:o,separatorToPanels:s}=t(),c=Ys({layout:e,panelConstraints:r});return n?o:(Ms(o,c)||Ds(i,{defaultLayoutDeferred:n,derivedPanelConstraints:r,groupSize:a,layout:c,separatorToPanels:s}),c)}}}function ec(e,t){let n=Qs(e),r=ws(n.id,!0),i=n.separators.find(t=>t.element===e);Z(i,`Matching separator not found`);let a=r.separatorToPanels.get(i);Z(a,`Matching panels not found`);let o=a.map(e=>n.panels.indexOf(e)),s=$s({groupId:n.id}).getLayout(),c=Ys({layout:js({delta:t,initialLayout:s,panelConstraints:r.derivedPanelConstraints,pivotIndices:o,prevLayout:s,trigger:`keyboard`}),panelConstraints:r.derivedPanelConstraints});Ms(s,c)||Ds(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedPanelConstraints:r.derivedPanelConstraints,groupSize:r.groupSize,layout:c,separatorToPanels:r.separatorToPanels},{isUserInteraction:!0})}function tc(e){if(e.defaultPrevented)return;let t=e.currentTarget,n=Qs(t);if(!(n.disabled||n.separators.find(e=>e.element===t)?.disabled))switch(e.key){case`ArrowDown`:e.preventDefault(),n.orientation===`vertical`&&ec(t,5);break;case`ArrowLeft`:e.preventDefault(),n.orientation===`horizontal`&&ec(t,-5);break;case`ArrowRight`:e.preventDefault(),n.orientation===`horizontal`&&ec(t,5);break;case`ArrowUp`:e.preventDefault(),n.orientation===`vertical`&&ec(t,-5);break;case`End`:e.preventDefault(),ec(t,100);break;case`Enter`:{e.preventDefault();let n=Qs(t),{derivedPanelConstraints:r,layout:i,separatorToPanels:a}=ws(n.id,!0),o=n.separators.find(e=>e.element===t);Z(o,`Matching separator not found`);let s=a.get(o);Z(s,`Matching panels not found`);let c=s[0],l=r.find(e=>e.panelId===c.id);if(Z(l,`Panel metadata not found`),l.collapsible){let e=i[c.id];ec(t,(l.collapsedSize===e?n.mutableState.expandedPanelSizes[c.id]??l.minSize:l.collapsedSize)-e)}break}case`F6`:{e.preventDefault();let n=Qs(t).separators.map(e=>e.element),r=Array.from(n).findIndex(t=>t===e.currentTarget);Z(r!==null,`Index not found`),n[e.shiftKey?r>0?r-1:n.length-1:r+1<n.length?r+1:0].focus({preventScroll:!0});break}case`Home`:e.preventDefault(),ec(t,-100)}}function nc(e,t){let{element:n,orientation:r,panels:i}=e,a=n.getBoundingClientRect(),o=r===`horizontal`;return ys({expandHitTargets:!1,group:e,includeDisabled:!0}).map(({panels:r,rect:s,separator:c},l)=>{let u=i.indexOf(r[0]),d=o?s.left+s.width/2:s.top+s.height/2;return{active:t.some(t=>{if(t.group!==e||t.panels[0]!==r[0])return!1;if(c||t.separator)return t.separator===c;let n=o?t.rect.left+t.rect.width/2:t.rect.top+t.rect.height/2;return Q(d,n)}),group:e,key:c?`separator-${c.id}`:`panel-${r[0].id}-${l}`,offset:0,panelIndex:u,rect:new DOMRect((o&&!c?d:s.left)-a.left-n.clientLeft+n.scrollLeft,(!o&&!c?d:s.top)-a.top-n.clientTop+n.scrollTop,o&&!c?0:s.width,!o&&!c?0:s.height),separator:c}})}function rc(e){if(e.defaultPrevented||e.pointerType===`mouse`&&e.button>0)return;let t=Ts(),n=Js(e,t);if(n.length===0)return;let r=new Map,i=!1;n.forEach(e=>{e.separator&&(i||(i=!0,e.separator.element.focus({focusVisible:!1,preventScroll:!0})));let n=t.get(e.group);n&&r.set(e.group,n.layout)});let a=Array.from(r.keys()).flatMap(e=>e.resizePreviewMode===`separator`?nc(e,n):[]);Yo({cursorFlags:0,didPointerMove:!1,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},previewLayoutMap:new Map(r),previews:a,state:`active`}),e.preventDefault()}function ic(e){let t=Ts(),n=Ko();n.state===`active`&&Ns({commit:!1,document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:t,prevCursorFlags:n.cursorFlags})}function ac(e){if(e.defaultPrevented)return;let t=Ko(),n=Ts();switch(t.state){case`active`:if(e.buttons===0){t.previewLayoutMap.forEach((e,t)=>{let r=n.get(t);t.resizePreviewMode===`separator`&&r&&!Ms(e,r.layout)&&Ds(t,{...r,layout:e})}),Yo({cursorFlags:0,state:`inactive`}),t.hitRegions.forEach(e=>{if(!n.has(e.group))return;let t=ws(e.group.id,!0);Ds(e.group,t,{isUserInteraction:!0})}),us(e.currentTarget);return}for(let n of t.hitRegions)if(n.separator){let{element:t}=n.separator;t.isConnected&&!t.hasPointerCapture?.(e.pointerId)&&t.setPointerCapture?.(e.pointerId)}Ns({commit:!1,document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedGroups:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break;default:{let r=Js(e,n);r.length===0?t.state!==`inactive`&&Yo({cursorFlags:0,state:`inactive`}):Yo({cursorFlags:0,hitRegions:r,state:`hover`}),us(e.currentTarget);break}}}function oc(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(Ko().state){case`hover`:Yo({cursorFlags:0,state:`inactive`})}}function sc(e){e.defaultPrevented||e.pointerType===`mouse`&&e.button>0||Ps(e.currentTarget,e)&&e.preventDefault()}function cc(e){let t=0,n=0,r={};for(let i of e)if(i.defaultSize!==void 0){t++;let e=Y(i.defaultSize);n+=e,r[i.panelId]=e}else r[i.panelId]=void 0;let i=e.length-t;if(i!==0){let t=Y((100-n)/i);for(let n of e)n.defaultSize===void 0&&(r[n.panelId]=t)}return r}function lc(e,t){let n=e.map(e=>e.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function uc({group:e,panelConstraints:t}){let n=e.panels.map(({id:e})=>e).join(`,`),r=e.mutableState.defaultLayout;return e.mutableState.layouts[n]??(r&&lc(e.panels,r)?r:cc(t))}function dc(e,t,n){if(!n[0])return;let r=e.panels.find(e=>e.element===t);if(!r||!r.onResize)return;let i=Ho({group:e}),a=e.orientation===`horizontal`?r.element.offsetWidth:r.element.offsetHeight,o=r.mutableValues.prevSize,s={asPercentage:Y(a/i*100),inPixels:a};r.mutableValues.prevSize=s,r.onResize(s,r.id,o)}function fc(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function pc(e,t){return e.length===t.length&&e.every((e,n)=>fc(e,t[n]))}function mc({group:e,nextGroupSize:t,prevGroupSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let i=0,a=0,o=!1,s=new Map,c=[];for(let l of e.panels){let e=r[l.id]??0;switch(l.panelConstraints.groupResizeBehavior){case`preserve-pixel-size`:{o=!0;let r=Y(e/100*n/t*100);s.set(l.id,r),i+=r;break}default:c.push(l.id),a+=e}}if(!o||c.length===0)return r;let l=100-i,u={...r};if(s.forEach((e,t)=>{u[t]=e}),a>0)for(let e of c)u[e]=Y((r[e]??0)/a*l);else{let e=Y(l/c.length);for(let t of c)u[t]=e}return u}var hc=new Map;function gc(e){let t=!0;Z(e.element.ownerDocument.defaultView,`Cannot register an unmounted Group`);let n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,i=new Set,a=new n(n=>{for(let r of n){let{borderBoxSize:n,target:i}=r;if(i===e.element){if(t){let t=Ho({group:e});if(t===0)return;let n=ws(e.id);if(!n)return;let r=Uo(e),i=n.defaultLayoutDeferred?uc({group:e,panelConstraints:r}):n.layout,a=Ys({layout:mc({group:e,nextGroupSize:t,prevGroupSize:n.groupSize,prevLayout:i}),panelConstraints:r});if(!n.defaultLayoutDeferred&&Ms(n.layout,a)&&pc(n.derivedPanelConstraints,r)&&n.groupSize===t)continue;Ds(e,{defaultLayoutDeferred:!1,derivedPanelConstraints:r,groupSize:t,layout:a,separatorToPanels:n.separatorToPanels})}}else dc(e,i,n)}});a.observe(e.element),e.panels.forEach(e=>{Z(!r.has(e.id),`Panel ids must be unique; id "${e.id}" was used more than once`),r.add(e.id),e.onResize&&a.observe(e.element)});let o=Ho({group:e}),s=Uo(e),c=Ys({layout:uc({group:e,panelConstraints:s}),panelConstraints:s}),l=e.element.ownerDocument;hc.set(l,(hc.get(l)??0)+1);let u=new Map;return ys({group:e,includeDisabled:!0}).forEach(e=>{e.separator&&u.set(e.separator,e.panels)}),Ds(e,{defaultLayoutDeferred:o===0,derivedPanelConstraints:s,groupSize:o,layout:c,separatorToPanels:u}),e.separators.forEach(e=>{Z(!i.has(e.id),`Separator ids must be unique; id "${e.id}" was used more than once`),i.add(e.id),e.element.addEventListener(`keydown`,tc)}),hc.get(l)===1&&(l.addEventListener(`contextmenu`,Fs,!0),l.addEventListener(`dblclick`,Zs,!0),l.addEventListener(`pointerdown`,rc,!0),l.addEventListener(`pointerleave`,ic),l.addEventListener(`pointermove`,ac),l.addEventListener(`pointerout`,oc),l.addEventListener(`pointerup`,sc,!0)),function(){t=!1,hc.set(l,Math.max(0,(hc.get(l)??0)-1)),Ss(e),Zo(e)&&us(l),e.separators.forEach(e=>{e.element.removeEventListener(`keydown`,tc)}),hc.get(l)||(l.removeEventListener(`contextmenu`,Fs,!0),l.removeEventListener(`dblclick`,Zs,!0),l.removeEventListener(`pointerdown`,rc,!0),l.removeEventListener(`pointerleave`,ic),l.removeEventListener(`pointermove`,ac),l.removeEventListener(`pointerout`,oc),l.removeEventListener(`pointerup`,sc,!0)),a.disconnect()}}function _c(){let[e,t]=(0,R.useState)({});return[e,(0,R.useCallback)(()=>t({}),[])]}function vc(e){let t=(0,R.useId)();return`${e??t}`}var yc=typeof window<`u`?R.useLayoutEffect:R.useEffect;function bc(e){let t=(0,R.useRef)(e);return yc(()=>{t.current=e},[e]),(0,R.useCallback)((...e)=>t.current?.(...e),[t])}function xc(...e){return bc(t=>{e.forEach(e=>{if(e)switch(typeof e){case`function`:e(t);break;case`object`:e.current=t}})})}function Sc(e){let t=(0,R.useRef)({...e});return yc(()=>{for(let n in e)t.current[n]=e[n]},[e]),t.current}var Cc=(0,R.createContext)(null);function wc({separator:e}){let{element:t}=e,n=(0,R.useRef)(null);return yc(()=>{let e=t.cloneNode(!0),r=[t,...t.querySelectorAll(`*`)],i=[e,...e.querySelectorAll(`*`)],a=t.ownerDocument.defaultView;return r.forEach((e,t)=>{let n=i[t];if(n instanceof a.HTMLElement||n instanceof a.SVGElement){let t=a.getComputedStyle(e);for(let e=0;e<t.length;e++){let r=t.item(e);n.style.setProperty(r,t.getPropertyValue(r))}}n.removeAttribute(`data-testid`),n.removeAttribute(`id`)}),Object.assign(e.style,{boxSizing:`border-box`,height:`100%`,margin:`0`,position:`static`,transform:`none`,width:`100%`}),n.current.appendChild(e),()=>e.remove()},[t]),(0,B.jsx)(`div`,{ref:n,style:{height:`100%`,opacity:.65,pointerEvents:`none`,width:`100%`}})}function Tc(){let e=(0,R.useContext)(Cc);return Z(e,`Group Context not found; did you render a Panel or Separator outside of a Group?`),e}function Ec(e){let{registerOverlay:t}=Tc(),n=(0,R.useRef)(e);fc(n.current,e)||(n.current=e);let r=n.current;return yc(()=>t(r),[t,r]),null}Ec.displayName=`SeparatorOverlay`;function Dc({active:e,orientation:t,style:n,...r}){let i;switch(t){case`horizontal`:i={height:`100%`,minWidth:`1px`};break;case`vertical`:i={minHeight:`1px`,width:`100%`}}return(0,B.jsx)(`div`,{...r,"data-separator-overlay":e?`active`:`inactive`,style:{...i,...n,flexShrink:0,pointerEvents:`none`}})}function Oc({overlay:e,preview:t}){let{group:n,offset:r,rect:i,separator:a}=t,o=n.orientation===`horizontal`,s=a?.preview,c=e;return(0,R.isValidElement)(s)&&s.type===Ec&&(c=s.props,s=void 0),s??(c?s=(0,B.jsx)(Dc,{...c,active:t.active,orientation:n.orientation}):a&&(s=(0,B.jsx)(wc,{separator:a}))),(0,B.jsx)(`div`,{"aria-hidden":`true`,"data-resize-preview":!0,inert:!0,style:{height:i.height,left:i.left,pointerEvents:`none`,position:`absolute`,top:i.top,transform:o?`translateX(${r}px)`:`translateY(${r}px)`,width:i.width},children:s})}function kc(e,t){let n=(0,R.useRef)({getLayout:()=>({}),setLayout:Qo});(0,R.useImperativeHandle)(t,()=>n.current,[]),yc(()=>{Object.assign(n.current,$s({groupId:e}))})}function Ac({groupId:e,resizePreviewMode:t}){let[n,r]=(0,R.useState)([]),i=(0,R.useRef)(n);return yc(()=>{let n=n=>{let a=Cs(e),o=t===`separator`&&n.state===`active`?n.previews.filter(e=>e.group===a&&(e.active||!Q(e.offset,0))):[],s=i.current;s.length===o.length&&o.every((e,t)=>e===s[t])||(i.current=o,r(o))};if(t!==`separator`){n(Ko());return}let a=qo(({next:e})=>n(e));return n(Ko()),a},[e,t]),n}function jc({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:i,elementRef:a,groupRef:o,id:s,onLayoutChange:c,onLayoutChanged:l,orientation:u=`horizontal`,resizePreviewMode:d=`panel`,resizeTargetMinimumSize:f={coarse:20,fine:10},style:p,...m}){let h=(0,R.useRef)({onLayoutChange:{},onLayoutChanged:{}}),g=bc(e=>{Ms(h.current.onLayoutChange,e)||(h.current.onLayoutChange=e,c?.(e))}),_=bc((e,t)=>{Ms(h.current.onLayoutChanged,e)||(h.current.onLayoutChanged=e,l?.(e,{isUserInteraction:t}))}),v=vc(s),[y,b]=(0,R.useState)(),x=Ac({groupId:v,resizePreviewMode:d}),S=(0,R.useRef)(null),[C,w]=_c(),T=(0,R.useRef)({lastExpandedPanelSizes:{},layouts:{},panels:[],separators:[]}),E=xc(S,a);kc(v,o);let D=bc((e,t)=>{let r=ws(e);if(r)return{flexGrow:r.layout[t]??1};if(n?.[t])return{flexGrow:n?.[t]}}),O=Sc({defaultLayout:n,disableCursor:r,resizeTargetMinimumSize:f}),k=(0,R.useMemo)(()=>({get disableCursor(){return!!O.disableCursor},getPanelStyles:D,id:v,orientation:u,registerPanel:e=>{let t=T.current;return t.panels=ds(u,[...t.panels,e]),w(),()=>{t.panels=t.panels.filter(t=>t!==e),w()}},registerOverlay:e=>(b(e),()=>{b(void 0)}),registerSeparator:e=>{let t=T.current;return t.separators=ds(u,[...t.separators,e]),w(),()=>{t.separators=t.separators.filter(t=>t!==e),w()}},updatePanelProps:(e,{disabled:t})=>{let n=T.current.panels.find(t=>t.id===e);n&&(n.panelConstraints.disabled=t);let r=Cs(v),i=ws(v);r&&i&&Ds(r,{...i,derivedPanelConstraints:Uo(r)})},updateSeparatorProps:(e,{disabled:t,disableDoubleClick:n})=>{let r=T.current.separators.find(t=>t.id===e);r&&(r.disabled=t,r.disableDoubleClick=n)}}),[D,v,w,u,O]),A=(0,R.useRef)(null);return yc(()=>{let e=S.current;if(e===null)return;let t=T.current,n;if(O.defaultLayout!==void 0&&Object.keys(O.defaultLayout).length===t.panels.length){n={};for(let e of t.panels){let t=O.defaultLayout[e.id];t!==void 0&&(n[e.id]=t)}}let r={disabled:!!i,element:e,id:v,mutableState:{defaultLayout:n,disableCursor:!!O.disableCursor,expandedPanelSizes:T.current.lastExpandedPanelSizes,layouts:T.current.layouts},orientation:u,panels:t.panels,resizePreviewMode:d,get resizeTargetMinimumSize(){return O.resizeTargetMinimumSize},separators:t.separators};A.current=r;let a=gc(r),{defaultLayoutDeferred:o,derivedPanelConstraints:s,layout:c}=ws(r.id,!0);!o&&s.length>0&&(g(c),_(c,!1));let l=Es(v,e=>{let{defaultLayoutDeferred:t,derivedPanelConstraints:n,layout:i}=e.next;if(t||n.length===0)return;let a=r.panels.map(({id:e})=>e).join(`,`);r.mutableState.layouts[a]=i,n.forEach(t=>{if(t.collapsible){let{layout:n}=e.prev??{};if(n){let e=Q(t.collapsedSize,i[t.panelId]),a=Q(t.collapsedSize,n[t.panelId]);e&&!a&&(r.mutableState.expandedPanelSizes[t.panelId]=n[t.panelId])}}});let o=Ko(),s=o.state!==`active`||!o.hitRegions.some(e=>e.group===r);g(i),s&&_(i,e.isUserInteraction)});return()=>{A.current=null,a(),l()}},[i,v,_,g,u,C,d,O]),(0,R.useEffect)(()=>{let e=A.current;e&&(e.mutableState.defaultLayout=n,e.mutableState.disableCursor=!!r)}),(0,B.jsx)(Cc.Provider,{value:k,children:(0,B.jsxs)(`div`,{...m,className:t,"data-group":!0,"data-testid":v,id:v,ref:E,style:{height:`100%`,width:`100%`,overflow:`hidden`,position:d===`separator`?`relative`:void 0,...p,display:`flex`,flexDirection:u===`horizontal`?`row`:`column`,flexWrap:`nowrap`,touchAction:u===`horizontal`?`pan-y`:`pan-x`},children:[e,x.map(e=>(0,B.jsx)(Oc,{overlay:y,preview:e},e.key))]})})}jc.displayName=`Group`;function Mc(e,t){let{id:n}=Tc(),r=(0,R.useRef)({collapse:$o,expand:$o,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:$o});(0,R.useImperativeHandle)(t,()=>r.current,[]),yc(()=>{Object.assign(r.current,Xs({groupId:n,panelId:e}))})}function Nc({children:e,className:t,collapsedSize:n=`0%`,collapsedThreshold:r,collapsible:i=!1,defaultSize:a,disabled:o,elementRef:s,groupResizeBehavior:c=`preserve-relative-size`,id:l,maxSize:u=`100%`,minSize:d=`0%`,onResize:f,panelRef:p,style:m,...h}){let g=!!l,_=vc(l),v=Sc({disabled:o}),y=(0,R.useRef)(null),b=xc(y,s),{getPanelStyles:x,id:S,orientation:C,registerPanel:w,updatePanelProps:T}=Tc(),E=f!==null,D=bc((e,t,n)=>{f?.(e,l,n)});yc(()=>{let e=y.current;if(e!==null){let t={element:e,id:_,idIsStable:g,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:E?D:void 0,panelConstraints:{groupResizeBehavior:c,collapsedSize:n,collapsedThreshold:r,collapsible:i,defaultSize:a,disabled:v.disabled,maxSize:u,minSize:d}};return w(t)}},[c,n,r,i,a,E,_,g,u,d,D,w,v]),(0,R.useEffect)(()=>{T(_,{disabled:o})},[o,_,T]),Mc(_,p);let O=()=>{let e=x(S,_);if(e)return JSON.stringify(e)},k=(0,R.useSyncExternalStore)(e=>Es(S,e),O,O),A;return A=k?JSON.parse(k):a===void 0?{flexGrow:1}:{flexGrow:void 0,flexShrink:void 0,flexBasis:a},(0,B.jsx)(`div`,{...h,"data-disabled":o||void 0,"data-panel":!0,"data-testid":_,id:_,ref:b,style:{...Pc,display:`flex`,flexBasis:0,flexShrink:1,overflow:`visible`,...A},children:(0,B.jsx)(`div`,{className:t,style:{maxHeight:`100%`,maxWidth:`100%`,flexGrow:1,overflow:`auto`,...m,touchAction:C===`horizontal`?`pan-y`:`pan-x`},children:e})})}Nc.displayName=`Panel`;var Pc={minHeight:0,maxHeight:`100%`,height:`auto`,minWidth:0,maxWidth:`100%`,width:`auto`,border:`none`,borderWidth:0,padding:0,margin:0};function Fc({layout:e,panelConstraints:t,panelId:n,panelIndex:r}){let i,a,o=e[n],s=t.find(e=>e.panelId===n);if(s){let c=s.maxSize,l=s.collapsible?s.collapsedSize:s.minSize,u=[r,r+1];a=Ys({layout:js({delta:l-o,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n],i=Ys({layout:js({delta:c-o,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n]}return{valueControls:n,valueMax:i,valueMin:a,valueNow:o}}function Ic({children:e,className:t,disabled:n,disableDoubleClick:r,elementRef:i,id:a,preview:o,style:s,...c}){let l=vc(a),u=Sc({disabled:n,disableDoubleClick:r,children:e,className:t,preview:o,style:s}),[d,f]=(0,R.useState)({}),[p,m]=(0,R.useState)(`inactive`),[h,g]=(0,R.useState)(!1),_=(0,R.useRef)(null),v=(0,R.useRef)(null),y=xc(_,i),{disableCursor:b,id:x,orientation:S,registerSeparator:C,updateSeparatorProps:w}=Tc(),T=S===`horizontal`?`vertical`:`horizontal`;yc(()=>{let e=_.current;if(e!==null){let t={disabled:u.disabled,disableDoubleClick:u.disableDoubleClick,element:e,id:l,get children(){return u.children},get className(){return u.className},get preview(){return u.preview},get style(){return u.style}};v.current=t;let n=C(t),r=qo(e=>{m(e.next.state!==`inactive`&&e.next.hitRegions.some(e=>e.separator===t)?e.next.state:`inactive`)}),i=Es(x,e=>{let{derivedPanelConstraints:n,layout:r,separatorToPanels:i}=e.next,a=i.get(t);if(a){let e=a[0],t=n.findIndex(t=>t.panelId===e.id);f(Fc({layout:r,panelConstraints:n,panelId:e.id,panelIndex:t}))}});return()=>{v.current=null,r(),i(),n()}}},[x,l,C,u]),yc(()=>{let e=v.current;e&&Xo(e)},[o]),(0,R.useEffect)(()=>{w(l,{disabled:n,disableDoubleClick:r})},[n,r,l,w]);let E;n&&!b&&(E=`not-allowed`);let D;if(n)D=`disabled`;else switch(p){case`active`:D=`active`;break;default:D=h?`focus`:p}return(0,B.jsx)(`div`,{...c,"aria-controls":d.valueControls,"aria-disabled":n||void 0,"aria-orientation":T,"aria-valuemax":d.valueMax,"aria-valuemin":d.valueMin,"aria-valuenow":d.valueNow,children:e,className:t,"data-separator":D,"data-testid":l,id:l,onBlur:()=>g(!1),onFocus:()=>g(!0),ref:y,role:`separator`,style:{flexBasis:`auto`,cursor:E,...s,flexGrow:0,flexShrink:0,touchAction:`none`},tabIndex:n?void 0:0})}Ic.displayName=`Separator`;var Lc=6,Rc=320,zc=.9;function Bc(e){return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)}function Vc(){return Math.min(Rc,Math.floor(window.innerWidth*zc))}function Hc(e,t){let n=e.indexOf(`#`),r=n===-1?e:e.slice(0,n),i=n===-1?``:e.slice(n);return`${r}${r.includes(`?`)?`&`:`?`}t=${t}${i}`}function Uc(e,t){let n=null;try{n=e.contentDocument}catch{return}n&&n.addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||n.querySelector(`.VPLocalSearchBox, [role="dialog"][aria-modal="true"]`)||t()})}function Wc(){let{isOpen:e,target:t,close:n}=me(),{theme:s}=H(),c=(0,R.useSyncExternalStore)(Bc,Vc),l=(0,R.useRef)(null),[u,f]=(0,R.useState)(null),p=(0,R.useRef)(null),m=(0,R.useCallback)(e=>{if(p.current?.disconnect(),p.current=null,!e){document.documentElement.style.setProperty(`--docs-inset`,`0px`);return}let t=()=>document.documentElement.style.setProperty(`--docs-inset`,`${e.getBoundingClientRect().width+Lc}px`),n=new ResizeObserver(t);n.observe(e),t(),p.current=n},[]);(0,R.useEffect)(()=>{if(!e){l.current=null,f(null);return}let n=t.path,r=l.current;r&&r.path===n&&r.theme===s||(l.current={kind:`site`,path:n,theme:s},f(Hc(n,s)))},[e,t,s]);let h=t.source===`reference`?`Reference`:`Guide`;return(0,B.jsx)(r,{open:e,modal:!1,disablePointerDismissal:!0,onOpenChange:e=>{e||n()},children:(0,B.jsx)(o,{children:(0,B.jsx)(a,{"data-slot":`docs-panel`,className:`pointer-events-none fixed inset-0 z-[60]`,children:(0,B.jsxs)(jc,{orientation:`horizontal`,className:`h-full w-full`,children:[(0,B.jsx)(Nc,{minSize:`10%`,className:`pointer-events-none`}),(0,B.jsx)(Ic,{"aria-label":`Resize docs panel`,className:`pointer-events-auto w-1.5 cursor-col-resize bg-border/60 transition-colors hover:bg-primary/50 data-dragging:bg-primary/50`}),(0,B.jsx)(Nc,{defaultSize:576,minSize:c,maxSize:`90vw`,className:`pointer-events-auto`,children:(0,B.jsxs)(`div`,{ref:m,className:`flex h-full flex-col border-l border-border bg-popover text-sm text-popover-foreground shadow-lg`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border p-4`,children:[(0,B.jsx)(d,{className:`font-heading text-base font-medium text-foreground`,children:h}),(0,B.jsxs)(i,{render:(0,B.jsx)(V,{variant:`ghost`,size:`icon-sm`}),children:[(0,B.jsx)(Ft,{"aria-hidden":`true`}),(0,B.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]}),(0,B.jsx)(`iframe`,{src:u??void 0,title:h,className:`w-full flex-1 border-0`,onLoad:e=>Uc(e.currentTarget,n)})]})})]})})})})}function Gc({className:e,...t}){return(0,B.jsx)(`div`,{"data-slot":`table-container`,className:`relative w-full overflow-x-auto`,tabIndex:0,children:(0,B.jsx)(`table`,{"data-slot":`table`,className:L(`w-full caption-bottom text-sm`,e),...t})})}function Kc({className:e,...t}){return(0,B.jsx)(`thead`,{"data-slot":`table-header`,className:L(`[&_tr]:border-b`,e),...t})}function qc({className:e,...t}){return(0,B.jsx)(`tbody`,{"data-slot":`table-body`,className:L(`[&_tr:last-child]:border-0`,e),...t})}function Jc({className:e,...t}){return(0,B.jsx)(`tr`,{"data-slot":`table-row`,className:L(`border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted`,e),...t})}function $({className:e,...t}){return(0,B.jsx)(`th`,{"data-slot":`table-head`,className:L(`h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0`,e),...t})}function Yc({className:e,...t}){return(0,B.jsx)(`td`,{"data-slot":`table-cell`,className:L(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0`,e),...t})}function Xc({className:e,...t}){return(0,B.jsx)(`caption`,{"data-slot":`table-caption`,className:L(`mt-4 text-sm text-muted-foreground`,e),...t})}function Zc({className:e,size:t=`default`,...n}){return(0,B.jsx)(`div`,{"data-slot":`card`,"data-size":t,className:L(`group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl`,e),...n})}function Qc({className:e,...t}){return(0,B.jsx)(`div`,{"data-slot":`card-content`,className:L(`px-(--card-spacing)`,e),...t})}var $c=(0,R.createContext)(null),el=(0,R.createContext)(null),tl=(0,R.createContext)(null),nl=(0,R.createContext)(null);function rl({children:e,registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i,focusedWidgetId:a,activeRouteTarget:o,flashedFinding:s}){let c=(0,R.useMemo)(()=>({registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i}),[t,n,r,i]);return(0,B.jsx)($c.Provider,{value:c,children:(0,B.jsx)(el.Provider,{value:a,children:(0,B.jsx)(tl.Provider,{value:o,children:(0,B.jsx)(nl.Provider,{value:s,children:e})})})})}function il(){return(0,R.useContext)($c)}function al(){return(0,R.useContext)(el)}function ol(){return(0,R.useContext)(tl)}function sl(){return(0,R.useContext)(nl)}var cl=(0,R.createContext)(null);function ll(){return(0,R.useContext)(cl)}function ul({children:e,className:t}){return(0,B.jsx)(`div`,{className:L(`grid grid-cols-[repeat(auto-fit,minmax(320px,1fr))] items-start gap-4`,t),children:e})}function dl({cardId:e,widgetId:t,children:n,className:r,collapsedTile:i=!1}){let a=il(),o=al(),[s,c]=(0,R.useState)(0),[l,u]=(0,R.useState)(!1),d=(0,R.useRef)(null),f=(0,R.useRef)(null),p=(0,R.useMemo)(()=>({openRequestGeneration:s,reportOpen:e=>{u(e),t&&a?.reportWidgetOpen(t,e)},setDisclosureButton:e=>{f.current=e},onDisclosureBlur:()=>{t&&a?.clearRouteFocus(t)},routeFocused:t?o===t:!1,collapsedTile:i}),[a,s,t,o,i]);return(0,R.useLayoutEffect)(()=>{if(a&&t&&d.current)return a.registerWidget(t,{wrapperElement:d.current,open:()=>{c(e=>e+1)},getDisclosureButton:()=>f.current})},[a,t]),(0,B.jsx)(cl.Provider,{value:p,children:(0,B.jsx)(`div`,{ref:d,"data-testid":`widget-grid-item-${e}`,className:L(`empty:hidden`,t&&`scroll-mt-20`,l&&`col-span-full`,r),children:n})})}function fl({children:e}){return(0,B.jsx)(cl.Provider,{value:null,children:e})}function pl({title:e,impactBand:t,badges:n,statusBadge:r,summary:i,defaultCollapsed:a=!1,collapsible:o=!0,open:s,onOpenChange:c,compact:l=!1,routeFocused:u,disclosureButtonRef:d,children:f,id:p}){let m=ll(),h=(0,R.useRef)(null),g=m?.collapsedTile??!1,[_,v]=(0,R.useState)(!g&&!a),y=s??_,b=u??m?.routeFocused??!1,[x,S]=(0,R.useState)(b),C=(0,R.useRef)(0);(0,R.useLayoutEffect)(()=>{m?.reportOpen(y)},[m,y]),(0,R.useLayoutEffect)(()=>{let e=m?.openRequestGeneration??0;e!==0&&e!==C.current&&(C.current=e,y||(s===void 0?v(!0):c?.(!0)))},[s,m?.openRequestGeneration,c,y]),(0,R.useLayoutEffect)(()=>{S(b)},[b]);let w=e=>{s===void 0?v(e):c?.(e)},T=(0,B.jsxs)(`div`,{className:`flex flex-col gap-2 px-(--card-spacing) sm:flex-row sm:flex-wrap sm:items-center sm:justify-between`,children:[o?(0,B.jsxs)(O,{ref:e=>{m?.setDisclosureButton(e),typeof d==`function`?d(e):d&&(d.current=e)},"aria-expanded":String(y),"data-route-focused":x?``:void 0,className:L(`tap-target-comfortable tap-target-comfortable--sm flex min-w-0 cursor-pointer items-center gap-2 bg-transparent text-left sm:flex-1`,x&&`border-ring ring-[3px] ring-ring/50 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`),onBlur:e=>{e.relatedTarget&&h.current?.contains(e.relatedTarget)||(S(!1),m?.onDisclosureBlur())},children:[(0,B.jsx)(`h3`,{className:`font-heading text-base leading-snug font-bold`,children:e}),y?(0,B.jsx)(ce,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(pe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}):(0,B.jsx)(`h3`,{className:`min-w-0 font-heading text-base leading-snug font-bold sm:flex-1`,children:e}),n||y&&r?(0,B.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-1`,children:[n,y?r:null]}):null]}),E=(0,B.jsx)(fl,{children:(0,B.jsx)(Qc,{children:f})});return(0,B.jsx)(Zc,{ref:h,id:p,size:l?`sm`:`default`,className:L(`border-l-4`,t?ee[t]:`border-transparent`,g&&!y&&`min-h-[6.5rem]`),children:o?(0,B.jsxs)(ue,{open:y,onOpenChange:w,children:[T,i&&!y?(0,B.jsx)(`div`,{className:`px-(--card-spacing) pb-(--card-spacing)`,children:i}):null,(0,B.jsx)(fl,{children:(0,B.jsx)(ae,{keepMounted:!0,children:(0,B.jsx)(fe.Provider,{value:y,children:(0,B.jsx)(Qc,{children:f})})})})]}):(0,B.jsxs)(B.Fragment,{children:[T,E]})})}function ml(){return(0,B.jsx)(Zc,{className:`border-l-4 border-transparent`,"aria-hidden":`true`,children:(0,B.jsx)(Qc,{children:(0,B.jsx)(`div`,{className:`h-5 w-1/3 animate-pulse rounded-md bg-muted motion-reduce:animate-none`})})})}var hl=.02;function gl(e){return e.baseline!=null&&e.candidate!=null}function _l(e){return e.baseline===0?e.candidate!==0:Math.abs(e.candidate-e.baseline)/Math.abs(e.baseline)>=hl}function vl(e){let t=oe(e);return he[t]?.expansion??t}function yl(e){let t=new Map;for(let n of[...e.introduced,...e.resolved]){let e=vl(n.type);t.set(e,(t.get(e)??0)+n.candCount-n.baseCount)}return t}function bl(e,t){return[...e].filter(([,e])=>t(e)).map(([e])=>e)}function xl(e,{failedJobs:t,totalJobs:n}){return t<n?`Run ${e} had ${t} of ${n} jobs fail`:n===1?`Run ${e}'s only job failed`:`All ${n} of run ${e}'s jobs failed`}function Sl({failedJobs:e,totalJobs:t}){return e===0?`none`:e<t?`${e} of ${t}`:t===1?`its only job failed`:`all ${t} failed`}function Cl(e,t){if(e.failedJobs===0&&t.failedJobs===0)return null;let n=t.failedJobs>e.failedJobs?`worse`:t.failedJobs<e.failedJobs?`better`:`same`;return t.failedJobs===0?{title:`${xl(`A`,e)}; run B completed`,tone:n}:{title:`${xl(`B`,t)} (run A: ${Sl(e)})`,tone:n}}function wl(e,t,n){let r=e.find(e=>e.key===`wallClock`),i=`Run time could not be compared between run A and run B`,a=`unknown`,o=n?[`A`,`B`].filter(e=>(e===`A`?n.baseline:n.candidate).incomplete):[];if(r&&r.baseline!=null&&r.baseline>0&&r.candidate!=null&&o.length>0){let e=r.candidate-r.baseline;i=Math.abs(e/r.baseline)<.02?`Run B's log covers about as much run time as run A's`:`Run B's log covers ${g(Math.abs(e))} ${e<0?`less`:`more`} run time than run A's`}else if(r&&r.baseline!=null&&r.baseline>0&&r.candidate!=null){let e=r.candidate-r.baseline,t=e/r.baseline;if(Math.abs(t)<.02)i=`Run B took about as long as run A`,a=`same`;else{let n=e<0;i=`Run B finished ${g(Math.abs(e))} ${n?`faster`:`slower`} than run A (${Math.round(Math.abs(t)*100)}%)`,a=n?`better`:`worse`}}let s=e.filter(e=>e.key!==`wallClock`&&!$a.has(e.key)).filter(gl),c=s.filter(_l),l=c.filter(e=>e.direction===`regression`).map(e=>e.label),u=c.filter(e=>e.direction===`improvement`).map(e=>e.label),d=[],f=n?Cl(n.baseline,n.candidate):null;f&&(d.push(`${i}.`),i=f.title,a=f.tone),o.length===2?d.push(`Neither log has an end-of-run record, so their times cover only what each log captured, not how long the runs took.`):o.length===1&&d.push(`Run ${o[0]}'s log has no end-of-run record, so its time covers only what the log captured, not how long the run took.`),l.length>0&&d.push(`Worse in run B: ${l.join(`, `)}.`),u.length>0&&d.push(`Better in run B: ${u.join(`, `)}.`),s.length>0&&l.length===0&&u.length===0&&d.push(`Other measured cost metrics look about the same.`);let p=yl(t),m=bl(p,e=>e>0),h=bl(p,e=>e<0);return m.length>0&&d.push(`New or more frequent in run B: ${m.join(`, `)}.`),h.length>0&&d.push(`Less frequent in run B: ${h.join(`, `)}.`),{title:i,tone:a,sentences:d}}var Tl=e=>String(e),El=[{key:`duration`,label:`Duration`,fmt:g},{key:`executorRunTime`,label:`Executor run-time`,fmt:g},{key:`jvmGCTime`,label:`GC time`,fmt:g},{key:`memoryBytesSpilled`,label:`Memory spill`,fmt:w},{key:`diskBytesSpilled`,label:`Disk spill`,fmt:w},{key:`inputBytes`,label:`Input read`,fmt:w},{key:`outputBytes`,label:`Output written`,fmt:w},{key:`taskCount`,label:`Task count`,fmt:Tl},{key:`failedTasks`,label:`Failed tasks`,fmt:Tl}];function Dl(e,t){return e==null?`—`:t(e)}function Ol({base:e,cand:t,fmt:n}){if(e==null||t==null)return(0,B.jsx)(Yc,{className:`text-muted-foreground`,children:`—`});let r=t-e,i=r===0?`unchanged`:(r<0?`-`:`+`)+n(Math.abs(r));return(0,B.jsx)(Yc,{className:L(`font-medium`,r===0?`text-muted-foreground`:r<0?`text-clean`:`text-critical`),children:i})}function kl({base:e,cand:t}){return(0,B.jsxs)(Gc,{children:[(0,B.jsx)(Kc,{children:(0,B.jsxs)(Jc,{children:[(0,B.jsx)($,{className:`text-left`,children:`Metric`}),(0,B.jsx)($,{children:`Baseline`}),(0,B.jsx)($,{children:`Candidate`}),(0,B.jsx)($,{children:`Δ`})]})}),(0,B.jsx)(qc,{children:El.map(n=>(0,B.jsxs)(Jc,{"aria-label":n.label,children:[(0,B.jsx)($,{scope:`row`,className:`text-left`,children:n.label}),(0,B.jsx)(Yc,{children:Dl(e.metrics[n.key],n.fmt)}),(0,B.jsx)(Yc,{children:Dl(t.metrics[n.key],n.fmt)}),(0,B.jsx)(Ol,{base:e.metrics[n.key],cand:t.metrics[n.key],fmt:n.fmt})]},n.key))})]})}function Al({baseStages:e,candStages:t}){let[n,r]=(0,R.useState)(``),[i,a]=(0,R.useState)(``),[o,s]=(0,R.useState)([]);if(e.length===0||t.length===0)return null;let c=t=>e.find(e=>e.id===t),l=e=>t.find(t=>t.id===e),u=()=>{n!==``&&i!==``&&s(e=>[...e,{baseId:Number(n),candId:Number(i)}])},d=e=>s(t=>t.filter((t,n)=>n!==e));return(0,B.jsxs)(pl,{title:`Pinned per-stage deltas`,children:[(0,B.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Pick one stage from each run to compare directly. Pairs are chosen by you: no automatic matching.`}),(0,B.jsxs)(`div`,{className:`mb-4 flex flex-wrap items-end gap-3`,children:[(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Baseline stage`,(0,B.jsxs)(`select`,{className:`rounded border border-border bg-background px-2 py-1 text-sm text-foreground`,value:n,onChange:e=>r(e.target.value),children:[(0,B.jsx)(`option`,{value:``,children:`Select…`}),e.map(e=>(0,B.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Candidate stage`,(0,B.jsxs)(`select`,{className:`rounded border border-border bg-background px-2 py-1 text-sm text-foreground`,value:i,onChange:e=>a(e.target.value),children:[(0,B.jsx)(`option`,{value:``,children:`Select…`}),t.map(e=>(0,B.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,B.jsx)(V,{type:`button`,size:`sm`,disabled:n===``||i===``,onClick:u,children:`Pin pair`})]}),(0,B.jsx)(`div`,{className:`flex flex-col gap-4`,children:o.map((e,t)=>{let n=c(e.baseId),r=l(e.candId);return!n||!r?null:(0,B.jsxs)(`div`,{className:`rounded border border-border p-3`,children:[(0,B.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,B.jsxs)(`span`,{className:`text-sm font-medium`,children:[n.name,` → `,r.name]}),(0,B.jsx)(V,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>d(t),children:`Remove`})]}),(0,B.jsx)(kl,{base:n,cand:r})]},t)})})]})}var jl=`bg-plan-aggregate/8 text-plan-aggregate`,Ml=e=>`${e.toFixed(2)}×`,Nl={wallClock:g,shuffleSpill:w,taskSkew:Ml,failedTaskRate:e=>`${(e*100).toFixed(1)}%`,diskSpill:w,gcTime:g,inputBytes:w,outputBytes:w,executorRunTime:g},Pl=e=>Nl[e]??(e=>Intl.NumberFormat().format(e)),Fl={regression:`text-critical`,improvement:`text-clean`,unchanged:`text-muted-foreground`,neutral:`text-muted-foreground`,unavailable:`text-muted-foreground`};function Il({m:e}){if(e.direction===`unavailable`)return(0,B.jsxs)(Jc,{"aria-label":e.label,"data-direction":`unavailable`,children:[(0,B.jsx)($,{scope:`row`,className:`text-left`,children:e.label}),(0,B.jsxs)(Yc,{colSpan:3,className:`text-muted-foreground`,children:[`Unavailable: `,e.unavailableReason]})]});let t=Pl(e.key),n=e=>e==null?`—`:t(e),r=e=>e==null?`—`:e===0?`unchanged`:(e<0?`-`:`+`)+t(Math.abs(e)),i=$a.has(e.key)?`text-muted-foreground`:Fl[e.direction];return(0,B.jsxs)(Jc,{"aria-label":e.label,"data-direction":e.direction,children:[(0,B.jsx)($,{scope:`row`,className:`text-left`,children:e.label}),(0,B.jsx)(Yc,{children:n(e.baseline)}),(0,B.jsx)(Yc,{children:n(e.candidate)}),(0,B.jsx)(Yc,{className:L(`font-medium`,i),children:r(e.delta)})]})}var Ll=[`critical`,`warning`,`info`],Rl=e=>Ll.includes(e)?e:`info`;function zl({stages:e}){return e.length===0?null:(0,B.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:e.map(e=>(0,B.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground`,children:e},e))})}function Bl({items:e}){return(0,B.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.map(e=>(0,B.jsxs)(`li`,{className:`flex flex-col gap-1 border-b border-border pb-2 last:border-0 last:pb-0`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(ne,{type:e.type,impactBand:Rl(e.impactBand),className:oe(e.type)===`PLAN`?jl:void 0}),(0,B.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[e.baseCount,` → `,e.candCount]})]}),(0,B.jsx)(zl,{stages:e.stages})]},`${e.rule}§${e.impactBand}`))})}function Vl({reason:e}){let[t,n]=(0,R.useState)(!1);return t?null:(0,B.jsxs)(`div`,{role:`alert`,className:`mb-4 flex items-start justify-between gap-3 rounded border border-warning/40 bg-warning/10 px-3 py-2 text-sm text-warning`,children:[(0,B.jsx)(`span`,{children:e}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>n(!0),"aria-label":`Dismiss warning`,className:`shrink-0 cursor-pointer rounded px-1 text-muted-foreground hover:text-foreground`,children:`Dismiss`})]})}var Hl={better:`border-clean/40`,worse:`border-critical/40`,same:`border-border`,unknown:`border-border`};function Ul({model:e,onDrillIn:t}){let n=wl(e.metrics,e.findings,e.jobOutcomes);return(0,B.jsxs)(`section`,{"aria-labelledby":`comparison-verdict-title`,"data-testid":`comparison-verdict`,className:L(`space-y-3 rounded-xl border bg-card p-4 sm:p-5`,Hl[n.tone]),children:[(0,B.jsx)(`h2`,{id:`comparison-verdict-title`,className:`font-heading text-lg font-semibold`,children:n.title}),(0,B.jsxs)(`p`,{className:`max-w-prose text-sm text-muted-foreground`,children:[`Run A is the baseline and run B the candidate. `,n.sentences.join(` `)]}),t?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,B.jsxs)(V,{size:`sm`,onClick:()=>t(`candidate`),children:[`See where to start in run B`,(0,B.jsx)(at,{"aria-hidden":`true`})]}),(0,B.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Opens run B's own verdict and next steps.`})]}):null]})}function Wl({model:e,onClose:t,onDrillIn:n}){let r=Math.round(e.matchedCoverage*100);(0,R.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]);let i=(0,B.jsxs)(`header`,{className:`mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,B.jsxs)(`div`,{className:`min-w-0`,children:[(0,B.jsx)(`h1`,{className:`font-heading text-lg font-semibold`,children:`Run comparison`}),(0,B.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Baseline `,(0,B.jsx)(`strong`,{children:e.baselineLabel}),` vs candidate `,(0,B.jsx)(`strong`,{children:e.candidateLabel})]})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 sm:shrink-0`,children:[n?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(V,{variant:`outline`,size:`sm`,onClick:()=>n(`baseline`),children:`View run A dashboard`}),(0,B.jsx)(V,{variant:`outline`,size:`sm`,onClick:()=>n(`candidate`),children:`View run B dashboard`})]}):null,(0,B.jsx)(V,{variant:`ghost`,size:`sm`,onClick:t,children:`Close`})]})]});return(0,B.jsxs)(`div`,{"data-testid":`dashboard`,className:`mx-auto flex max-w-4xl flex-col gap-6 p-6`,children:[i,(0,B.jsxs)(`main`,{className:`contents`,children:[e.confidence===`low`&&e.reason?(0,B.jsx)(Vl,{reason:e.reason}):null,(0,B.jsx)(Ul,{model:e,onDrillIn:n}),(0,B.jsxs)(pl,{title:`Metrics`,children:[(0,B.jsxs)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:[`Metrics and finding categories cover the whole run. Per-stage skew below covers only the `,r,`% of stages that matched by unique identity.`]}),(0,B.jsxs)(Gc,{children:[(0,B.jsx)(Kc,{children:(0,B.jsxs)(Jc,{children:[(0,B.jsx)($,{className:`text-left`,children:`Metric`}),(0,B.jsxs)($,{children:[`Baseline (`,e.baselineLabel,`)`]}),(0,B.jsxs)($,{children:[`Candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)($,{children:`Change`})]})}),(0,B.jsx)(qc,{children:e.metrics.map(e=>(0,B.jsx)(Il,{m:e},e.key))})]})]}),e.findings.introduced.length>0||e.findings.resolved.length>0?(0,B.jsxs)(pl,{title:`Findings by category`,children:[e.findings.introduced.length>0?(0,B.jsxs)(`div`,{className:`mb-4`,children:[(0,B.jsxs)(`h3`,{className:`mb-2 text-xs font-semibold text-muted-foreground`,children:[`More in candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)(Bl,{items:e.findings.introduced})]}):null,e.findings.resolved.length>0?(0,B.jsxs)(`div`,{children:[(0,B.jsxs)(`h3`,{className:`mb-2 text-xs font-semibold text-muted-foreground`,children:[`Fewer in candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)(Bl,{items:e.findings.resolved})]}):null]}):null,e.stageSkew.length>0?(0,B.jsx)(pl,{title:`Per-stage task skew (matched stages only)`,children:(0,B.jsxs)(Gc,{children:[(0,B.jsx)(Kc,{children:(0,B.jsxs)(Jc,{children:[(0,B.jsx)($,{className:`text-left`,children:`Stage`}),(0,B.jsx)($,{children:`Baseline`}),(0,B.jsx)($,{children:`Candidate`})]})}),(0,B.jsx)(qc,{children:[...e.stageSkew].sort((e,t)=>Math.abs(t.delta??0)-Math.abs(e.delta??0)).map(e=>(0,B.jsxs)(Jc,{children:[(0,B.jsx)($,{scope:`row`,className:`text-left`,children:e.identity.split(`§`)[0]}),(0,B.jsx)(Yc,{children:e.baseline==null?`—`:Ml(e.baseline)}),(0,B.jsx)(Yc,{children:e.candidate==null?`—`:Ml(e.candidate)})]},`${e.baseId}-${e.candId}`))})]})}):null,(0,B.jsx)(Al,{baseStages:e.baseStages??[],candStages:e.candStages??[]})]})]})}var Gl=(0,R.createContext)(null);function Kl({children:e}){let[t,n]=(0,R.useState)(null),r=(0,R.useCallback)(e=>n(e),[]),i=(0,R.useCallback)(()=>n(null),[]),a=(0,R.useMemo)(()=>({stageId:t,openStage:r,close:i}),[t,r,i]);return(0,B.jsx)(Gl.Provider,{value:a,children:e})}function ql(){let e=(0,R.useContext)(Gl);if(!e)throw Error(`useStageDetail outside StageDetailProvider`);return e}function Jl(){let e=P(e=>e.planGraph.stageId),t=P(e=>e.planGraph.initialScope),n=P(e=>e.appModel),r=P(e=>e.catalog),i=P(e=>e.activeFileId),a=P(e=>e.closePlanGraph);return e==null?null:{stageId:e,initialScope:t,appModel:n,findings:r,activeFileId:i,onClose:a}}var Yl=`modulepreload`,Xl=function(e,t){return new URL(e,t).href},Zl={},Ql=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Xl(t,n),t=s(t),t in Zl)return;Zl[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Yl,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},$l=(0,R.lazy)(()=>Ql(async()=>{let{PlanGraphRoute:e}=await import(`./PlanGraphRoute-C-BGmC6j.js`);return{PlanGraphRoute:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url).then(({PlanGraphRoute:e})=>({default:e}))),eu=(0,R.lazy)(()=>Ql(async()=>{let{Dashboard:e}=await import(`./Dashboard-Bo_1jGqH.js`);return{Dashboard:e}},__vite__mapDeps([9,1,2,3,4,5,6,7]),import.meta.url).then(({Dashboard:e})=>({default:e})));function tu(){let e=P(e=>e.comparison),t=P(e=>e.closeComparison),{prepareComparison:n,drillIntoRun:r}=Ta(),i=(0,R.useMemo)(()=>{let t=e.baselineId&&e.candidateId?n(e.baselineId,e.candidateId):null;return t?lo(t.baseline,t.candidate):null},[e.baselineId,e.candidateId,n]),a=!i;return(0,R.useEffect)(()=>{a&&t()},[a,t]),i?(0,B.jsx)(Wl,{model:i,onClose:t,onDrillIn:t=>{let n=t===`baseline`?e.baselineId:e.candidateId;n&&r(n)}}):null}function nu(){let e=Jl();return e?(0,B.jsx)(R.Suspense,{fallback:(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading plan graph`,className:`p-6 text-sm text-muted-foreground`,children:`Loading plan graph…`}),children:(0,B.jsx)($l,{...e},e.stageId)}):null}function ru({label:e,onCancel:t}){let n=P(e=>e.parse),r=Math.round(n.pct*100),i=n.lines>0?` · ${n.lines.toLocaleString()} lines`:``,a=n.etaMs!=null&&n.etaMs>0?`About ${g(n.etaMs)} left. `:``;return(0,B.jsx)(`main`,{className:`flex min-h-screen flex-col items-center justify-center p-10`,children:(0,B.jsxs)(`div`,{className:`flex w-full max-w-md flex-col items-center gap-3 text-center`,children:[(0,B.jsx)(`p`,{className:`font-heading text-lg font-semibold`,children:`Reading the event log`}),(0,B.jsxs)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:[e,`… `,r,`%`,i]}),(0,B.jsx)(ye,{value:n.pct*100,className:`w-full`}),(0,B.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[a,`Parsing runs in your browser, so the log stays on this machine.`]}),t?(0,B.jsx)(V,{variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Cancel`}):null]})})}function iu(){let e=P(e=>e.status),t=P(e=>e.errorMessage),n=P(e=>e.errorNonce),r=P(e=>e.shsParsing),{cancelParse:i}=Ta(),a=P(e=>e.planGraph.active),o=P(e=>e.comparison.active),s=P(e=>e.compareLoad);return s?(0,B.jsx)(ru,{label:`Parsing run ${s.current} of 2`}):a?(0,B.jsx)(nu,{}):o?(0,B.jsx)(tu,{}):e===`ready`?(0,B.jsx)(R.Suspense,{fallback:(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading dashboard`,className:`p-6 text-sm text-muted-foreground`,children:`Loading dashboard…`}),children:(0,B.jsx)(eu,{})}):e===`parsing`&&!r?(0,B.jsx)(ru,{label:`Parsing`,onCancel:i}):(0,B.jsx)(`main`,{className:`min-h-screen p-6 sm:p-10`,children:(0,B.jsx)(Fo,{errorMessage:e===`error`?t:null,errorNonce:n})})}function au(){let e=P(e=>e.status),t=P(e=>e.planGraph.active),n=P(e=>e.comparison.active);return(0,B.jsx)(Ce,{children:(0,B.jsx)(m,{children:(0,B.jsxs)(Kl,{children:[e===`ready`||t||n?null:(0,B.jsx)(`header`,{children:(0,B.jsx)(`h1`,{className:`sr-only`,children:`SparkForensics`})}),(0,B.jsx)(iu,{}),(0,B.jsx)(Wc,{}),(0,B.jsx)(It,{})]})})})}var ou=[`PROCESS_LOCAL`,`NODE_LOCAL`,`RACK_LOCAL`,`NO_PREF`,`ANY`];function su(e,{bucketWidthMs:t=6e4,tiers:n=ou}={}){let r=e.filter(e=>(e.completedAt??0)>(e.submittedAt??0)&&(e.executorRunTime??0)>0);if(r.length===0)return{labels:[],series:{},endTime:0};let i=r.reduce((e,t)=>Math.min(e,t.submittedAt??e),1/0),a=r.reduce((e,t)=>Math.max(e,t.completedAt??e),-1/0),o=Math.max(1,Math.ceil((a-i)/t)),s={};for(let e of n)s[e]=Array(o).fill(0);let c=Array(o).fill(0);for(let e of r){let n=e.completedAt??0,r=e.submittedAt??0,a=n-r,l=(e.executorRunTime??0)/a,u=(e.localityStats??[]).reduce((e,t)=>e+t.count,0)||1,d=new Map((e.localityStats??[]).map(e=>[e.locality,e.count/u]));for(let e=0;e<o;e++){let a=i+e*t,o=a+t,u=Math.min(n,o)-Math.max(r,a);if(u<=0)continue;let f=u/t;for(let[t,n]of d){let r=l*n*f;s[t]?s[t][e]+=r:c[e]+=r}}}c.some(e=>e>0)&&(s.OTHER=c);let l=Array(o).fill(0);for(let e of Object.keys(s))for(let t=0;t<o;t++)l[t]+=s[e][t];let u=l.reduce((e,t)=>Math.max(e,t),0);s.idle=l.map(e=>Math.max(0,u-e));let d=[];for(let e=0;e<o;e++)d.push(i+e*t);return{labels:d,series:s,endTime:a}}function cu(e,t,n=60){if(!e.some(e=>(e.executorRunTime??0)>0&&(e.completedAt??0)>(e.submittedAt??0)))return{hasActivity:!1};let r=t?.startTime??0,i=t?.endTime??r,a=Math.max(6e4,Math.ceil(Math.max(1,i-r)/n)),{labels:o,series:s,endTime:c}=su(e,{bucketWidthMs:a}),l=[...ou.filter(e=>s[e]),...s.OTHER?[`OTHER`]:[],`idle`],u=o.map((e,t)=>{let n={t:Math.round((e-r)/1e3)},i=Math.min(a,c-e),o=a/i;for(let e of l)e!==`idle`&&(n[e]=(s[e]?.[t]??0)*o);return n}),d=l.filter(e=>e!==`idle`),f=e=>d.reduce((t,n)=>t+e[n],0),p=u.reduce((e,t)=>Math.max(e,f(t)),0);for(let e of u)e.idle=Math.max(0,p-f(e));return{hasActivity:!0,order:l,points:u,peakCores:p}}function lu(e,t){let n=de(e),r=yi.get(e);return!n||!r?`criteria not met`:n.thresholdSummary(Di(r,t))}var uu;function du(){if(!uu){uu=new Map;for(let e of vi)for(let t of e.emits){let n=uu.get(t)??new Set;n.add(e.docAnchor),uu.set(t,n)}}return uu}function fu(e){let t=du().get(e)??new Set;if(t.size!==1)return;let[n]=t;return n&&p(n)?n:void 0}function pu(){let e={};for(let[t,{order:n,scope:r}]of yi)e[t]={order:n,docAnchor:fu(t)??null,thresholdSummary:lu(t),scope:r};return e}function mu({app:e,stages:t,executorsAdded:n,runAggregates:r}){let i=vn(e??{},n),a=(e?.endTime??0)-(e?.startTime??0),o=Ea(e,t),s=a/36e5*i,c=i*((o.startup+o.gaps+o.idle)/36e5),l=i*o.stagesActive,u=r?.busyCoreMs??0,d=Math.max(0,l-u)/36e5,f=c+d,p=s>0?Math.round(f/s*100):null,m=0,h=r?.perStage??{};for(let e of Object.keys(h))m+=h[e].totalTaskDurationSum;let g=i>0?m/i:0,_=null;return(c>0||d>0)&&(_=c>=d?`driver`:`executor`),{availableComputeHours:s,driverWasteHours:c,executorWasteHours:d,wastagePct:p,floorZeroSkewMs:g,dominantWaste:_}}function hu(e){let t={extract:0,transform:0,load:0};for(let n of e.values()){let e=Math.max(0,(n.completedAt??0)-(n.submittedAt??0));if(e===0)continue;let r=(n.shuffleReadBytes??0)>0||(n.shuffleWriteBytes??0)>0;(n.inputBytes??0)>0&&(n.shuffleReadBytes??0)===0&&(t.extract+=e),r&&(t.transform+=e),(n.outputBytes??0)>0&&(t.load+=e)}return t}function gu(e){let t=e.impactEstimate;if(!t)return null;if(t.wallClock)return E(t.wallClock.low,t.wallClock.high);if(t.rawWaste){let e=T(t.rawWaste);return I(e)?null:e}return null}function _u(e){switch(e){case`mbSeconds`:return`of unused executor memory`;case`coreHours`:case`coreMs`:return`of core time`;case`bytes`:return`of extra data written`;case`ms`:return`of task time`;default:return null}}function vu(e){let t=e.impactEstimate;return t?t.wallClock?`of run time`:_u(t.rawWaste?.unit):null}function yu(e){if(!e)return null;let t=e.wallClock&&e.wallClock.high>0?C(e.wallClock.high):null;if(t&&!I(t))return{text:E(e.wallClock.low,e.wallClock.high),meaning:`of run time`};let n=e.rawWaste&&e.rawWaste.value>0?T(e.rawWaste):null;return n&&!I(n)?{text:n,meaning:_u(e.rawWaste.unit)}:null}function bu(e){if(!e)return null;if(e.wallClock){if(e.wallClock.high<=0)return null;let t=C(e.wallClock.high);return I(t)?null:t}if(e.rawWaste){if(e.rawWaste.value<=0)return null;let t=T(e.rawWaste);return I(t)?null:t}return null}function xu(e){let t=e.impactEstimate;if(!t||t.estimateMethod===`none`)return null;let n=t.estimateMethod,r=t.rawWaste&&t.rawWaste.value>0?t.rawWaste:null,i=r&&!I(T(r))?T(r):null,a=t.wallClock;if(t.basis===`resourceOnly`)return i?`No run-time claim, ${n}. ${i} was wasted, but it may not shorten the run.`:null;if(!a||a.high<=0)return null;let o=E(a.high,a.high);if(I(o))return null;let s=``;if(i&&r.unit!==`ms`?s=` Resource waste measured: ${i}.`:i&&r.value>a.high&&i!==o&&(s=` Raw waste before the floor clipped it: ${i}.`),t.basis===`serial`)return`${o}, ${n}. The stage ran effectively alone, so this is close to a point estimate.${s}`;if(t.basis===`contended`){let e=E(a.low,a.low);return`${E(a.low,a.high)}, ${n}. The stage shared the cluster with others: ${e===o?`its floor and optimistic high agree`:`${e} is the floor, ${o} assumes the fix fully lands`}.${s}`}return null}function Su(e){return typeof e?.startTime==`number`&&Number.isFinite(e.startTime)&&typeof e?.endTime==`number`&&Number.isFinite(e.endTime)&&e.endTime>e.startTime}function Cu(e){if(!Su(e.app))return{efficiency:{value:null,unavailableReason:`application-timing`},wastage:{value:null,unavailableReason:`application-timing`}};let t=Ea(e.app,e.stages),n=Math.min(100,Math.round(t.stagesActive/t.total*100));if(!e.runAggregates)return{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`core-usage-summary`}};let r=mu({app:e.app,stages:e.stages,executorsAdded:e.executors.added,runAggregates:e.runAggregates});return!Number.isFinite(r.availableComputeHours)||r.availableComputeHours<=0?{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`executor-capacity`}}:{efficiency:{value:n,unavailableReason:null},wastage:{value:r.wastagePct,unavailableReason:null}}}function wu(e){let t=Su(e.app),n=Cu(e),r=hu(e.stages),i=cu([...e.stages.values()],e.app);return{wallClockMs:t?Ea(e.app,e.stages).total:null,efficiencyPct:Pa(e.stages)?n.efficiency.value:null,unusedCoreTimePct:n.wastage.value,etlPhasesMs:r.extract+r.transform+r.load>0?r:null,peakBusyCores:i.hasActivity?i.peakCores:null}}Object.fromEntries(Object.keys(le).map(e=>[e,le[e].name]));function Tu(e){return de(e)?.name??e}function Eu(e){return e.replace(/\b\w/g,e=>e.toUpperCase())}function Du(e){return(typeof e.recommendation==`string`?e.recommendation.trim():``)||Tu(e.type)}function Ou(e){return de(e.type)?.actionLabel(e)??Tu(e.type)}function ku(e){return e!=null&&(Array.isArray(e)?e.length:e.size)>0}function Au(e,t){return Array.isArray(e)?e.includes(t):e.has(t)}function ju(e){return typeof e.stageId==`number`?e.stageId:e.stageIds&&e.stageIds.length===1?e.stageIds[0]:null}function Mu(e,t){if(ku(t.impactBand)&&!Au(t.impactBand,e.impactBand)||ku(t.type)&&!Au(t.type,e.type))return!1;let{stageId:n}=t;if(typeof n==`number`){if(e.stageId!==n)return!1}else if(ku(n)&&(e.stageId==null||!Au(n,e.stageId)))return!1;return!0}var Nu=new Set([`memoryUtilization`,`utilization`,`coreLocality`,`cacheUtilization`]),Pu=(()=>{let e=e=>+!!Nu.has(e);return[...yi.entries()].sort(([t,n],[r,i])=>e(t)-e(r)||n.order-i.order).map(([e])=>e)})(),Fu=new Map(Pu.map((e,t)=>[e,t]));function Iu(e){return e.impactEstimate?.wallClock?.high??null}function Lu(e){let t=typeof e.recommendation==`string`?e.recommendation.trim():``;return Fu.has(e.type)&&t.length>0}function Ru(e){let t=e.map((e,t)=>({finding:e,index:t})).filter(({finding:e})=>Lu(e));return t.sort((e,t)=>{let n=Iu(e.finding),r=Iu(t.finding);return n!==null&&r!==null&&n!==r?r-n:n!==null==(r!==null)?(S[e.finding.impactBand]??9)-(S[t.finding.impactBand]??9)||(Fu.get(e.finding.type)??2**53-1)-(Fu.get(t.finding.type)??2**53-1)||e.index-t.index:n===null?1:-1}),t.map(({finding:e})=>e)}function zu(e){let t=ju(e);if(t!=null)return{key:`stage:${t}`,stageId:t};if(`stageIds`in e&&e.stageIds.length>1)return{key:`stages:${e.type}:${[...e.stageIds].sort((e,t)=>e-t).join(`,`)}`,stageId:null};let n=`variant`in e?e.variant:void 0;return{key:n?`app:${e.type}:${n}`:`app:${e.type}`,stageId:null}}function Bu(e,t){return Da.has(e.type)?typeof e.stageId==`number`&&t.has(e.stageId)?0:1:2}function Vu(e,{failedJobStageIds:t}={}){let n=Ru(e),r=t?[...n].sort((e,n)=>Bu(e,t)-Bu(n,t)):n,i=new Map;for(let e of r){let{key:t,stageId:n}=zu(e),r=i.get(t);if(!r){i.set(t,{key:t,lead:e,related:[],stageId:n});continue}new Set([r.lead.type,...r.related.map(e=>e.type)]).has(e.type)||r.related.push(e)}return[...i.values()]}function Hu(e){return e.type===`utilization`||e.type===`memoryUtilization`&&e.variant===`idleCores`}function Uu(e){return Hu(e.lead)}function Wu(e){return typeof e.value==`number`?e.type===`memoryUtilization`&&e.variant===`idleCores`?e.value:e.type===`utilization`?100-e.value:null:null}function Gu(e,t){let n=e.find(Uu);return(n?Wu(n.lead):null)??t}function Ku(e,t){return`${e} ${t}${e===1?``:`s`}`}function qu(e){return e.outcome.failedJobs>0}function Ju({failedJobs:e,totalJobs:t}){return e<t?`${e} of ${t} jobs failed in this run`:t===1?`This run failed: its job did not finish`:`This run failed: all ${t} jobs did not finish`}function Yu(e){return/^[A-Z]{2}/.test(e)?e:e.charAt(0).toLowerCase()+e.slice(1)}function Xu(e,t,n){if(qu(n))return Ju(n.outcome);if(e.length===0&&n.incomplete)return`This log looks incomplete, so results cover only part of the run`;if(e.length===0&&n.noFinishedStages)return`This log has no finished stages to check`;if(e.length===0&&!n.clean)return`Nothing to fix, but some checks could not run on this log`;if(e.length===0)return`No findings to fix right now.`;if(t.length===0)return`${Ku(e.length,`finding`)} to review`;let r=t[0];return Uu(r)&&n.idlePct!=null?`Start with cluster size: ${n.idlePct}% of executor capacity sat idle`:r.stageId==null?`Start here: ${Yu(Ou(r.lead))}`:`Start with Stage ${r.stageId}`}function Zu(e,t,n){let r=[],{failedJobs:i,totalJobs:a}=n.outcome;if(i>0?e.some(e=>!Da.has(e.type))&&r.push(`Fix the failure before tuning: the other findings cover only the work that ran.`):a>0&&!n.incomplete&&r.push(a===1?`Its one job succeeded.`:`All ${a} jobs succeeded.`),e.length===0){if(i>0)return r;n.clean&&r.push(`Every check passed for this run.`)}else if(t.length===0)r.push(`They are listed by impact under Findings.`);else{r.push(`${Ku(e.length,`finding`)} in ${Ku(t.length,`place`)}.`);let i=t[0].lead.impactEstimate?.wallClock;Uu(t[0])?r.push(`A smaller cluster or dynamic allocation would free the idle cores for other jobs.`):i&&n.runMs!=null&&r.push(`The first fix could save up to ${g(i.high)} of this ${g(n.runMs)} run.`),t.some(e=>e.related.length>0)&&r.push(`Findings in the same stage usually share one cause, so they are grouped together and their savings overlap rather than add up.`)}return n.incomplete&&r.push(`The log has no end-of-run record, so these figures cover only the part of the run it captured.`),!(t.length>0&&Uu(t[0]))&&n.idlePct!=null&&n.idlePct>=40&&r.push(t.some(Uu)?`${n.idlePct}% of the executor capacity sat idle, so the cluster may be larger than this job needs.`:`${n.idlePct}% of the run's core time went unused, so the cluster may be larger than this job needs.`),r}var Qu=`Open the driver log only if you need the full stack trace.`;function $u(e){let t=/[.!?]$/.test(e)?e:`${e}.`;return{shown:`Spark's recorded reason is quoted above. ${Qu}`,copied:`Spark's recorded reason: ${t} ${Qu}`}}function ed(e,t,n=null){let r=gu(e),i=vu(e),a=r&&i?`${r} ${i}`:r,o=n==null?``:` in Stage ${n}`,s=`${Ou(e)}${o}: ${t}`;return[/[.!?]$/.test(s)?s:`${s}.`,a?`Potential savings: ${a}`:null].filter(Boolean).join(` `)}function td(e){let t=[e.runName?`Spark run ${e.runName}: ${e.title}`:e.title,``];return e.steps.forEach(({step:e,recommendation:n},r)=>{t.push(`${r+1}. ${ed(e.lead,n,e.stageId)}`)}),e.remaining>0&&t.push(``,`${Ku(e.remaining,`more place`)} to look at in the full findings list.`),t.join(`
|
|
13
|
+
`)}function nd(e,t){return ja(e.lead,t)&&t.reason?$u(t.reason).copied:Du(e.lead)}function rd(e,t){let n=t.filter(e=>v(e)&&Fu.has(e.type)),r=Aa(e.jobs,t),i=Vu(n,r.failedJobs>0?{failedJobStageIds:r.failedJobStageIds}:{}),a={runMs:Su(e.app)?Ea(e.app,e.stages).total:null,idlePct:Gu(i,Cu(e).wastage.value),incomplete:t.some(e=>e.type===`incompleteRun`),clean:Ba(e,t),outcome:r,noFinishedStages:!Pa(e.stages)},o=Xu(n,i,a),s=i.slice(0,3),c=i.length-s.length,l=s.length>0?td({runName:e.app?.name??null,title:o,steps:s.map(e=>({step:e,recommendation:nd(e,r)})),remaining:c}):null;return{eligible:n,outcome:r,steps:i,facts:a,title:o,summary:Zu(n,i,a),shown:s,remaining:c,copyText:l}}function id(e){let t=e?[...e.values()]:[],n=new Map,r=0;for(let e of t){if(e.submissionTime==null||e.completionTime==null)continue;let t=e.sqlExecutionId==null?`job:${e.id??r++}`:`sql:${e.sqlExecutionId}`,i=n.get(t);i?(i.start=Math.min(i.start,e.submissionTime),i.end=Math.max(i.end,e.completionTime)):n.set(t,{start:e.submissionTime,end:e.completionTime})}let i=[...n.entries()].sort((e,t)=>e[1].start-t[1].start),a=[];for(let e=1;e<i.length;e++)for(let t=0;t<e;t++){let[n,r]=i[t],[o,s]=i[e];s.start<r.end&&r.start<s.end&&a.push([n,o])}return{wallClockReliable:a.length===0,overlappingGroupIds:a}}var ad=5,od={totalCoreHours:null,usefulCoreHours:null,wastedCoreHours:null,totalCores:null,topStages:[]};function sd(e,t=[],n){if(!n||e?.startTime==null||e?.endTime==null)return od;let r=e.endTime-e.startTime;if(r<=0)return od;let i=vn(e,t);if(i<=0)return od;let a=i*r/ge,o=(n.busyCoreMs??0)/ge;return{totalCoreHours:a,usefulCoreHours:o,wastedCoreHours:Math.max(0,a-o),totalCores:i,topStages:Object.entries(n.perStage??{}).map(([e,t])=>({stageId:Number(e),coreMs:t?.totalTaskDurationSum??0})).sort((e,t)=>t.coreMs-e.coreMs).slice(0,ad)}}function cd(e){return{figure:gu(e),meaning:vu(e),board:yu(e.impactEstimate)?.text??null,compact:bu(e.impactEstimate),provenance:xu(e)}}function ld(e){return e==null?null:e<75?`critical`:e<90?`warning`:null}function ud(e){return e==null?null:e>=70?`critical`:e>=40?`warning`:null}function dd(e){let{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r}=wu(e),i=Cu(e);return{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r,efficiencyFlag:ld(n),unusedCoreTimeFlag:ud(r),unusedCoreTimeUnavailableReason:i.wastage.unavailableReason}}function fd(e){return e.runAggregates?mu({app:e.app,stages:e.stages,executorsAdded:e.executors.added,runAggregates:e.runAggregates}):null}function pd(e,t){let n=!Pa(e.stages),{notRunReason:r}=Va(e.stages,t),i={};for(let e of Pu){let t=r(e);t!=null&&(i[e]=t)}return{noFinishedStages:n,notRunReasons:i,gaps:za(t,n)}}function md(e,t,n){let r=new Map;for(let t of e){let{stageId:e}=zu(t);if(e==null)continue;let n=r.get(e)??[];n.push(t),r.set(e,n)}let i={};for(let[e,a]of r){let[r]=Vu(a,n?{failedJobStageIds:n}:{}),o=r?[r.lead.type,...r.related.map(e=>e.type)]:[],s=e=>S[k(a.filter(t=>t.type===e))],c=[...new Set(a.map(e=>e.type))].filter(e=>!o.includes(e)).sort((e,t)=>s(e)-s(t));i[String(e)]={findingIndexes:a.map(e=>t.get(e)),typeOrder:[...o,...c]}}return i}var hd=new Set(Pu);function gd(e,t,n){let r=[...t,...n],i=new Map(r.map((e,t)=>[e,t])),a=rd(e,r),{outcome:o}=a,s=o.failedJobs>0,c=r.filter(e=>v(e)&&hd.has(e.type)),l=a.shown.map(e=>{let t=ja(e.lead,o)&&o.reason?$u(o.reason):null;return{key:e.key,leadIndex:i.get(e.lead),stageId:e.stageId,relatedTypes:e.related.map(e=>e.type),recommendation:t?.shown??Du(e.lead),copyText:ed(e.lead,t?.copied??Du(e.lead))}});return{savings:r.map(cd),verdict:{title:a.title,summary:a.summary,failed:s,clean:a.facts.clean,failureReason:o.reason,steps:l,remaining:a.remaining,copyText:a.copyText},coverage:pd(e,r),runShape:dd(e),wallClock:Ea(e.app,e.stages),wastedCoreHours:sd(e.app,e.executors.added,e.runAggregates),efficiency:fd(e),wallClockReliable:id(e.jobs).wallClockReliable,etlPhases:hu(e.stages),coreLocality:{chart:cu([...e.stages.values()],e.app),ratio:En([...e.stages.values()],{topN:1/0})},detectors:pu(),savingsRank:Ru(r).map(e=>i.get(e)),stages:md(t,i,s?o.failedJobStageIds:null),rollup:{eligibleIndexes:c.map(e=>i.get(e)),groups:h(c,e.stages).map(({members:e,...t})=>({...t,memberIndexes:e.map(e=>i.get(e))}))}}}function _d(e,t){return e.appModel!==t.appModel||e.catalog!==t.catalog||e.configFindings!==t.configFindings}function vd(e){if(e.exportMode)return;let{appModel:t,catalog:n,configFindings:r}=e;N.getState().setInterpretation({data:gd(t,n,r),findings:[...n,...r]})}function yd(){return vd(N.getState()),N.subscribe((e,t)=>{_d(e,t)&&vd(e)})}yd(),(0,z.createRoot)(document.getElementById(`root`)).render((0,B.jsx)(R.StrictMode,{children:(0,B.jsx)(au,{})}));export{hr as $,Zc as A,Va as B,ml as C,V as Ct,ol as D,rl as E,$ as F,da as G,Ta as H,Kc as I,Ai as J,qi as K,Jc as L,qc as M,Xc as N,sl as O,Yc as P,Ti as Q,fo as R,pl as S,H as St,dl as T,ca as U,Ba as V,la as W,Ei as X,Oi as Y,ji as Z,pu as _,ht as _t,Mu as a,Zt as at,ql as b,at as bt,Tu as c,en as ct,wu as d,Gt as dt,mr as et,xu as f,Bt as ft,vu as g,yt as gt,_u as h,Dt as ht,ed as i,rn as it,Gc as j,il as k,Du as l,Yt as lt,gu as m,Nt as mt,rd as n,_n as nt,ju as o,tn as ot,yu as p,Ft as pt,Xi as q,nd as r,gn as rt,Ou as s,nn as st,gd as t,vn as tt,Eu as u,Ht as ut,lu as v,pt as vt,ul as w,ve as wt,jl as x,Be as xt,Ql as y,dt as yt,uo as z};
|