
{"id":719,"date":"2026-04-27T11:50:23","date_gmt":"2026-04-27T11:50:23","guid":{"rendered":"https:\/\/obexanalytica.com\/ar\/?p=719"},"modified":"2026-04-27T12:28:23","modified_gmt":"2026-04-27T12:28:23","slug":"the-hormuz-shock-how-a-closed-strait-is-redrawing-the-worlds-energy-map","status":"publish","type":"post","link":"https:\/\/obexanalytica.com\/ar\/blog\/2026\/04\/27\/the-hormuz-shock-how-a-closed-strait-is-redrawing-the-worlds-energy-map\/","title":{"rendered":"The Hormuz Shock: How a Closed Strait Is Redrawing the World&#8217;s Energy Map"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<div id=\"obex-article-hormuz-energy-inversion-body-v2\" class=\"obex-article\" lang=\"en\" dir=\"ltr\">\n  <style>\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&display=swap');\n\n    #obex-article-hormuz-energy-inversion-body-v2,\n    #obex-article-hormuz-energy-inversion-body-v2 * {\n      box-sizing: border-box;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 {\n      --obex-primary: #0F1C5C;\n      --obex-accent: #E60000;\n      --obex-white: #FFFFFF;\n      --obex-soft-bg: #F7F8FC;\n      --obex-grid: rgba(15, 28, 92, 0.14);\n      --obex-border: rgba(15, 28, 92, 0.24);\n      --obex-muted: rgba(15, 28, 92, 0.68);\n      --obex-shadow: 0 18px 40px rgba(15, 28, 92, 0.08);\n      --obex-radius: 18px;\n      width: 100%;\n      color: var(--obex-primary);\n      font-family: 'IBM Plex Sans', 'IBM Plex Sans Arabic', Arial, sans-serif;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-article-shell {\n      width: 100%;\n      max-width: 980px;\n      margin: 0 auto;\n      padding: 0 0 30px;\n      color: var(--obex-primary);\n      font-family: inherit;\n      direction: ltr;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-text {\n      margin: 0 0 18px;\n      color: var(--obex-primary);\n      font-family: inherit;\n      font-size: clamp(1rem, 1.3vw, 1.1rem);\n      line-height: 1.58;\n      font-weight: 400;\n      text-align: justify;\n      overflow-wrap: break-word;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-heading {\n      display: inline-block;\n      margin: 40px 0 18px;\n      padding-bottom: 9px;\n      color: var(--obex-primary);\n      border-bottom: 3px solid var(--obex-accent);\n      font-family: inherit;\n      font-size: clamp(1.25rem, 2.3vw, 1.62rem);\n      line-height: 1.35;\n      font-weight: 700;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-card {\n      width: 100%;\n      max-width: 820px;\n      margin: 30px auto;\n      padding: 20px 24px;\n      background: var(--obex-white);\n      border: 2px solid var(--obex-primary);\n      border-radius: var(--obex-radius);\n      box-shadow: var(--obex-shadow);\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-title {\n      margin: 0 0 14px;\n      text-align: center;\n      color: var(--obex-accent);\n      font-size: clamp(1rem, 1.75vw, 1.22rem);\n      line-height: 1.35;\n      font-weight: 700;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-wrapper {\n      position: relative;\n      width: 100%;\n      min-height: 270px;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-wrapper.is-tall {\n      min-height: 305px;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-source {\n      margin: 11px 0 0;\n      color: var(--obex-muted);\n      font-size: 0.78rem;\n      line-height: 1.4;\n      text-align: center;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 canvas {\n      display: block;\n      width: 100% !important;\n      height: 100% !important;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-table-wrap {\n      width: 100%;\n      overflow-x: auto;\n      margin: 32px 0;\n      border: 2px solid var(--obex-primary);\n      border-radius: var(--obex-radius);\n      background: var(--obex-white);\n      box-shadow: var(--obex-shadow);\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table {\n      width: 100%;\n      min-width: 680px;\n      border-collapse: collapse;\n      color: var(--obex-primary);\n      font-size: 0.94rem;\n      line-height: 1.45;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table caption {\n      caption-side: top;\n      padding: 15px;\n      color: var(--obex-accent);\n      font-weight: 700;\n      font-size: 1.1rem;\n      line-height: 1.3;\n      text-align: center;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table th,\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table td {\n      padding: 11px 13px;\n      border-bottom: 1px solid var(--obex-grid);\n      vertical-align: top;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table thead th {\n      background: var(--obex-primary);\n      color: var(--obex-white);\n      font-weight: 700;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table tbody tr:last-child td {\n      border-bottom: 0;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 a {\n      color: var(--obex-accent);\n      text-decoration: none;\n      overflow-wrap: anywhere;\n    }\n\n    #obex-article-hormuz-energy-inversion-body-v2 a:hover {\n      color: var(--obex-primary);\n      text-decoration: none;\n    }\n\n    @media (max-width: 768px) {\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-article-shell {\n        padding: 0 0 24px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-text {\n        font-size: 1rem;\n        line-height: 1.52;\n        margin-bottom: 16px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-heading {\n        display: block;\n        width: fit-content;\n        margin-top: 32px;\n        margin-bottom: 16px;\n        font-size: 1.2rem;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-card {\n        max-width: 100%;\n        margin: 26px auto;\n        padding: 16px 12px;\n        border-radius: 14px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-wrapper {\n        min-height: 240px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-wrapper.is-tall {\n        min-height: 260px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-chart-title {\n        font-size: 0.98rem;\n        margin-bottom: 12px;\n      }\n\n      #obex-article-hormuz-energy-inversion-body-v2 .obex-data-table {\n        min-width: 620px;\n        font-size: 0.86rem;\n      }\n    }\n  <\/style>\n\n  <article class=\"obex-article-shell\">\n    <p class=\"obex-text\">On February 28, 2026, the detonation of the first confirmed sea mine in the navigable shipping lane of the Strait of Hormuz set in motion the largest supply disruption in the recorded history of global oil markets. The 21-mile-wide chokepoint \u2014 through which approximately 21 million barrels of petroleum and the equivalent of nearly 20 percent of the world&#8217;s entire LNG exports transited daily \u2014 was effectively closed to commercial shipping within weeks, as the Islamic Revolutionary Guard Corps launched at least 21 confirmed attacks on merchant vessels, and maritime traffic plummeted by over 70 percent before falling to absolute zero by late March. The International Energy Agency categorized the shock as historically unprecedented, and the numbers validate that characterization: global crude oil prices surged by as much as 57 percent within the first weeks of sustained disruption, retail diesel prices in Sydney breached $3.22 per litre, and Australia&#8217;s national consumption cover for jet fuel collapsed to a critically exposed 21 days, with diesel cover at 26 days and petrol at 28 days. Approximately 30 percent of the global fertilizer trade \u2014 transiting the same waters \u2014 was simultaneously blocked, threatening harvest yields across sub-Saharan Africa where households already allocate nearly 50 percent of income to food.<\/p>\n\n    <p class=\"obex-text\">These are not the consequences of a localized military engagement. They are the logical output of a global energy architecture that concentrated an estimated 25 percent of all seaborne petroleum trade, 20 percent of global LNG exports, and vast flows of industrial metals through a single maritime corridor \u2014 a vulnerability that decades of market-driven optimization consistently chose to treat as manageable rather than existential. What the 2026 crisis exposed, with stark and irreversible clarity, is that the era of petro-centric globalization has reached a structural limit. But what it also triggered is equally significant: an irreversible acceleration of the global pivot toward sovereign, technology-anchored energy systems \u2014 a pivot that is rapidly rewriting the roles of the world&#8217;s established energy players.<\/p>\n\n    <p class=\"obex-text\">This analysis examines the cascading effects of the Hormuz shock across three interlocking dimensions. First, it traces the immediate and structural disruption to global fossil fuel markets. Second, it analyzes how the energy security crisis has acted as an accelerant for the renewable energy transition and the emergence of what strategic analysts now term the &#8216;electrostate&#8217; model of geopolitical power. Third, it evaluates the profound inversion this transition is engineering in the traditional hierarchy of energy importers and exporters \u2014 one in which China, historically the world&#8217;s largest crude oil importer with a dependency ratio of 72.4 percent as recently as 2024, is systematically repositioning itself as the world&#8217;s dominant clean energy exporter, while fossil fuel exporters like Australia \u2014 which generated $238.7 billion in resource export earnings in 2022\u201323 \u2014 face a structural collapse of their traditional revenue base and a growing dependency on imported clean energy technology. All scenarios quantified in this analysis and all outcome trajectories modeled by Obex Analytica are accessible in full through the interactive dashboard attached at the close of this report.<\/p>\n\n    <h2 class=\"obex-heading\">The Chokepoint: Anatomy of an Energy System Failure<\/h2>\n\n    <p class=\"obex-text\">The Strait of Hormuz has long been identified as the critical vulnerability of the global fossil fuel system, but its abstract status as a risk factor was never translated into structural mitigation at the system level. The 2026 closure converted that abstraction into operational reality. With three narrow shipping lanes \u2014 two outbound, one inbound \u2014 and a maximum Very Large Crude Carrier draft of 15.5 meters, the strait&#8217;s physical geometry offered no redundancy. When IRGC forces mined the navigable channels and imposed a formal closure on vessels associated with the United States, Israel, and allied nations, the bypass architecture that existed \u2014 overland pipeline capacity rated at between 3.5 and 5.5 million barrels per day \u2014 could offset only a fraction of the 20 to 21 million barrels stranded daily. Spare production capacity held by Saudi Arabia, running at over four million barrels per day in late 2025, was rendered entirely inaccessible, eliminating the geopolitical buffer that importing nations had relied upon for decades.<\/p>\n\n    <p class=\"obex-text\">The disruption extended well beyond crude oil. Qatar and the UAE together account for nearly 20 percent of global LNG exports, and both were effectively frozen out of global spot markets, placing intense upward pressure on Asian and European gas prices and forcing governments to mandate demand reductions across industrial and residential sectors. Simultaneously, the same waterway carried roughly 30 percent of the global fertilizer trade \u2014 methanol, urea, and sulfur \u2014 whose blockage threatened to cascade into food production crises across developing economies by the 2026 harvest season. Aluminum from Bahrain and the UAE, a critical input for the solar panels and power lines of the very clean energy transition meant to replace fossil dependency, was similarly constrained, granting alternative suppliers sudden and immense pricing leverage.<\/p>\n\n    <figure class=\"obex-chart-card\">\n      <figcaption class=\"obex-chart-title\">Daily Maritime Transit Volume Through the Strait of Hormuz \u2014 January to April 2026<\/figcaption>\n      <div class=\"obex-chart-wrapper is-tall\">\n        <canvas id=\"obex-hormuz-transit-volume\" role=\"img\" aria-label=\"Line chart showing indexed Strait of Hormuz maritime traffic and petroleum transit equivalent from January to April 2026.\"><\/canvas>\n      <\/div>\n      <p class=\"obex-chart-source\">Source: Obex Analytica forecast.<\/p>\n    <\/figure>\n\n    <div class=\"obex-table-wrap\">\n      <table class=\"obex-data-table\">\n        <caption>Global Trade Disruption Through the Strait of Hormuz<\/caption>\n        <thead>\n          <tr>\n            <th scope=\"col\">Commodity Category<\/th>\n            <th scope=\"col\">Global Trade Share Disrupted<\/th>\n            <th scope=\"col\">Primary Downstream Impact<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td>Crude Oil<\/td>\n            <td>~25% of global seaborne trade<\/td>\n            <td>Transport, manufacturing, diesel logistics, +57% price surge<\/td>\n          <\/tr>\n          <tr>\n            <td>LNG<\/td>\n            <td>~20% of global exports (Qatar + UAE)<\/td>\n            <td>Asian\/European power generation, industrial heating, spot inflation<\/td>\n          <\/tr>\n          <tr>\n            <td>Fertilizers<\/td>\n            <td>~30% of global transit trade<\/td>\n            <td>Food security, harvest yields, inflation in African economies<\/td>\n          <\/tr>\n          <tr>\n            <td>Industrial Metals (Aluminum)<\/td>\n            <td>Significant GCC regional output<\/td>\n            <td>Renewable infrastructure, EVs, aerospace, power line construction<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <p class=\"obex-text\">Australia&#8217;s exposure to this shock illustrated precisely why geographic proximity to Asia does not equate to supply chain resilience. As a nation that imports between 80 and 90 percent of its daily refined fuel requirements \u2014 despite exporting 96 percent of its own crude oil production \u2014 Australia sits two steps upstream from the disruption. Its refined petroleum does not arrive from the Persian Gulf directly; it arrives from South Korean and Singaporean mega-refineries, which themselves are overwhelmingly dependent on Middle Eastern feedstock. In 2024 alone, Australia spent $9.18 billion on refined petroleum imports from South Korea and $6.44 billion from Singapore. When those refineries faced constrained crude supply and prioritized domestic mandates, Australia \u2014 with the lowest strategic petroleum reserves of any IEA member nation at approximately 49 days of net import coverage \u2014 found itself effectively starved of supply. This layered vulnerability, this &#8216;two-steps-upstream&#8217; exposure, is the defining structural fragility of the petro-globalization model.<\/p>\n\n    <h2 class=\"obex-heading\">The Accelerant: Fear as a Driver of the Clean Energy Pivot<\/h2>\n\n    <p class=\"obex-text\">Historical precedent established that oil shocks typically produce short-term stabilization responses \u2014 subsidy programs, strategic reserve releases, emergency diplomatic negotiations \u2014 followed by a return to structural dependence once the immediate pressure subsides. The 2026 crisis departed from that pattern. The magnitude and speed of the disruption, combined with the now-demonstrable inadequacy of the fossil-supply buffer, catalyzed a qualitatively different response: an acceleration of sovereign energy infrastructure that deliberately removes the dependence on imported combustible fuels.<\/p>\n\n    <p class=\"obex-text\">The empirical data from March 2026 \u2014 the first full month of the Hormuz closure \u2014 documented a result that confounded consensus forecasts. Global power generation from fossil fuels fell by one percent year-on-year, even as a major supply shock was actively unfolding. This occurred because the record global build-out of solar and wind capacity throughout 2024 and 2025 had structurally reduced the underlying demand for thermal generation. In regions where near-real-time generation data was available, solar output grew by 14 percent and wind by eight percent against the same month a year prior, while gas-fired generation contracted by four percent and coal-fired generation fell by 3.5 percent. Seaborne coal transport volumes simultaneously fell to their lowest levels since 2021. Rather than reverting to coal \u2014 as occurred during the 2022 European energy crisis \u2014 the economies most advanced in renewable deployment used existing clean capacity as an effective geopolitical buffer.<\/p>\n\n    <figure class=\"obex-chart-card\">\n      <figcaption class=\"obex-chart-title\">Global Power Generation Mix \u2014 March 2026 vs. March 2025 (Year-on-Year % Change)<\/figcaption>\n      <div class=\"obex-chart-wrapper\">\n        <canvas id=\"obex-global-power-generation-mix\" role=\"img\" aria-label=\"Horizontal bar chart showing year-on-year percentage changes in global power generation mix for March 2026 versus March 2025.\"><\/canvas>\n      <\/div>\n      <p class=\"obex-chart-source\">Source: Obex Analytica forecast.<\/p>\n    <\/figure>\n\n    <p class=\"obex-text\">The policy response hardened this structural trajectory. In Europe, where energy prices had already run at roughly double the levels of the United States and 50 percent above China for years, the shock forced a strategic reckoning. Nations that had previously diversified aggressively \u2014 Denmark&#8217;s offshore wind links to Germany via HVDC cable, Spain&#8217;s domestic green hydrogen buildout for industrial feedstocks \u2014 demonstrated measurable insulation from the worst effects of the price surge. The lesson was absorbed immediately at the policy level: the most durable defense against maritime chokepoint vulnerability is an energy system architecturally incapable of being disrupted by maritime chokepoints.<\/p>\n\n    <p class=\"obex-text\">The nuclear dimension of this pivot requires particular attention. At the March 2026 Nuclear Energy Summit in Paris, the European Commission President formally characterized the continent&#8217;s prior retreat from nuclear power as a &#8216;strategic mistake,&#8217; announcing state-backed investment frameworks to reinstate nuclear as a dispatchable, low-emission complement to variable renewables. Nuclear&#8217;s share in the European energy mix had fallen from approximately one-third in the 1990s to just 15 percent by 2026; the political and economic consensus for its revival had, until the Hormuz crisis, remained contested. Asia amplified this momentum: South Korea moved to increase nuclear output, Taiwan formally debated restarting mothballed reactors, and emerging economies across sub-Saharan Africa \u2014 Kenya, Rwanda, South Africa \u2014 accelerated long-term reactor planning, recognizing that industrialization on volatile fossil fuel imports is existentially unsustainable.<\/p>\n\n    <h2 class=\"obex-heading\">China&#8217;s Manufactured Advantage: The Anatomy of an Electrostate<\/h2>\n\n    <p class=\"obex-text\">No nation has benefited more from the structural realignment triggered by the Hormuz closure than the People&#8217;s Republic of China \u2014 and no nation was more strategically prepared for it. The paradox is that China enters this new order as a nation that, as recently as 2024, imported a record 11.1 million barrels of crude oil per day, representing 23 percent of all global crude imports and sustaining a dependency ratio of 71.9 percent. By any conventional measure, China should be among the most exposed nations to a Middle Eastern supply disruption. Instead, it has positioned itself as the architect and primary beneficiary of the world that emerges from that disruption.<\/p>\n\n    <p class=\"obex-text\">The mechanism of this positioning is the deliberate, state-directed construction of industrial dominance across the entire clean energy value chain. In 2025, China&#8217;s domestic investments in clean energy reached 7.2 trillion yuan \u2014 approximately one trillion US dollars \u2014 roughly four times the capital still allocated to fossil fuel extraction. The clean technology sector contributed more than 10 percent of China&#8217;s total GDP in 2024, anchored by what President Xi Jinping has termed the &#8216;new trio&#8217;: solar photovoltaics, lithium-ion batteries, and electric vehicles. In the first half of 2025 alone, China added 210 GW of solar capacity and 50 GW of wind \u2014 a pace without precedent in the history of energy infrastructure deployment. For the full year 2025, China added an estimated 300 GW of solar and 100 GW of wind, the largest single-year renewable energy build in any country&#8217;s recorded history.<\/p>\n\n    <figure class=\"obex-chart-card\">\n      <figcaption class=\"obex-chart-title\">China&#8217;s Annual Clean Energy Investment vs. Fossil Fuel Investment \u2014 2020 to 2025 (Trillion Yuan)<\/figcaption>\n      <div class=\"obex-chart-wrapper\">\n        <canvas id=\"obex-china-clean-vs-fossil-investment\" role=\"img\" aria-label=\"Grouped bar chart comparing China's clean energy investment and fossil fuel investment from 2020 to 2025 in trillion yuan.\"><\/canvas>\n      <\/div>\n      <p class=\"obex-chart-source\">Source: Obex Analytica forecast.<\/p>\n    <\/figure>\n\n    <p class=\"obex-text\">The strategic leverage embedded in this scale of deployment is compounded by China&#8217;s control of the upstream mineral inputs that the entire global energy transition depends upon. China currently processes approximately 60 percent of the world&#8217;s lithium and cobalt, refines more than 90 percent of the rare earth elements critical for the specialized magnets in wind turbine generators and EV motors, and produces approximately 60 percent of the world&#8217;s aluminum \u2014 the metal fundamental to power lines, turbine blades, drone airframes, and solar module structures. With Middle Eastern aluminum exports from Bahrain and the UAE simultaneously constrained by the Hormuz blockade, China&#8217;s leverage as the industrial supplier of last resort was exponentially amplified at precisely the moment the world needed it most.<\/p>\n\n    <p class=\"obex-text\">China&#8217;s export reach extends beyond generation components to the macro-architecture of electrified economies. In 2025, China exported a record 64.6 billion yuan \u2014 approximately $9.3 billion \u2014 worth of power transformers, a 36 percent increase year-on-year, as global grid upgrade demand surged against a chronic 30 percent supply shortage in the United States alone. Chinese state-owned firms are now supplying the software for grid operators, building and operating entire regional electricity networks in South America and Southern Europe. By exporting not only the generation hardware \u2014 solar panels, wind turbines \u2014 but the transmission infrastructure \u2014 HVDC cables, transformers \u2014 and the operational software, China is embedding its technological standards and economic dependency deep within the critical energy architectures of foreign nations. On the nuclear dimension, the Hualong One reactor platform has become the world&#8217;s most widely deployed third-generation pressurized water reactor, with successful overseas deliveries in Pakistan generating over 48 billion kilowatt-hours and saving nearly 15 million tons of coal consumption annually \u2014 a proven track record of on-time delivery that Western and Russian nuclear vendors have been unable to match.<\/p>\n\n    <div class=\"obex-table-wrap\">\n      <table class=\"obex-data-table\">\n        <caption>China&#8217;s Clean Energy Market Position and Strategic Implications<\/caption>\n        <thead>\n          <tr>\n            <th scope=\"col\">Clean Energy Sector<\/th>\n            <th scope=\"col\">China&#8217;s Global Market Position<\/th>\n            <th scope=\"col\">Strategic Implication<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td>Solar Photovoltaics<\/td>\n            <td>Modules priced $0.09\u2013$0.11\/W; ~99% of Australia&#8217;s installed solar imported from China<\/td>\n            <td>Price-based lock-in of importing nations; replaces oil revenues with tech dependency<\/td>\n          <\/tr>\n          <tr>\n            <td>Lithium-ion Batteries<\/td>\n            <td>~60% global lithium &amp; cobalt processing; majority of battery cell manufacturing<\/td>\n            <td>Controls cost and availability of grid storage for renewable transition<\/td>\n          <\/tr>\n          <tr>\n            <td>Power Transformers<\/td>\n            <td>$9.3B in exports in 2025 (+36% YoY); 30% US supply gap persists<\/td>\n            <td>Embeds Chinese grid standards; controls timeline of grid modernization<\/td>\n          <\/tr>\n          <tr>\n            <td>Nuclear (Hualong One)<\/td>\n            <td>World&#8217;s most deployed Gen III reactor; exports to Pakistan, Argentina, Algeria<\/td>\n            <td>Long-term strategic partnership; fuel &amp; technology dependency for 60-year asset life<\/td>\n          <\/tr>\n          <tr>\n            <td>Rare Earths &amp; Aluminum<\/td>\n            <td>&gt;90% rare earth refining; ~60% aluminum production<\/td>\n            <td>Chokehold on inputs to wind turbines, EVs, and power lines globally<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h2 class=\"obex-heading\">The Fossil Exporter Paradox: From Revenue Engine to Import Dependency<\/h2>\n\n    <p class=\"obex-text\">The inversion that the Hormuz crisis has accelerated is perhaps most starkly illustrated in the case of Australia. For decades, Australia has defined its macroeconomic identity by the extraordinary scale of its resource exports: in 2022\u201323, total energy export earnings reached $238.7 billion, the nation exported 9,606 petajoules of black coal \u2014 of which 88 percent went directly to foreign markets \u2014 along with 4,541 petajoules of LNG, cementing its status as the world&#8217;s second-largest coal exporter and third-largest LNG exporter. Simultaneously and paradoxically, the country imports between 80 and 90 percent of its daily refined petroleum requirements, having dismantled its domestic refining capacity from eight operational refineries to just two government-underwritten legacy facilities \u2014 Viva Energy&#8217;s Geelong plant and Ampol&#8217;s Lytton facility \u2014 through a cascade of closures driven by the scale economics of Asian mega-refineries.<\/p>\n\n    <p class=\"obex-text\">This paradox \u2014 exporting enormous volumes of raw energy while importing the processed fuel that powers domestic transport and logistics \u2014 becomes structurally untenable as both legs of it deteriorate simultaneously. On the export side, Treasury modeling projects that Australian fossil fuel export revenues, estimated at approximately $130 billion in 2025, will decline by over $60 billion by 2030 and plunge below $30 billion by 2050, driven by the inexorable decommissioning of coal-fired power stations across Australia&#8217;s primary trading partners in Asia and the structural transition away from LNG as the region&#8217;s transition fuel. Coal output is projected to fall between 42 and 51 percent by 2035. LNG production is expected to contract by up to 27 percent over the same period.<\/p>\n\n    <figure class=\"obex-chart-card\">\n      <figcaption class=\"obex-chart-title\">Australia&#8217;s Projected Fossil Fuel vs. Green Commodity Export Revenue \u2014 2025 to 2050 (USD Billion)<\/figcaption>\n      <div class=\"obex-chart-wrapper\">\n        <canvas id=\"obex-australia-export-revenue-shift\" role=\"img\" aria-label=\"Grouped bar chart showing Australia's projected fossil fuel and green commodity export revenue from 2025 to 2050 in US dollars billions.\"><\/canvas>\n      <\/div>\n      <p class=\"obex-chart-source\">Source: Obex Analytica forecast.<\/p>\n    <\/figure>\n\n    <div class=\"obex-table-wrap\">\n      <table class=\"obex-data-table\">\n        <caption>Australia&#8217;s Projected Fossil Fuel vs. Green Commodity Export Revenue<\/caption>\n        <thead>\n          <tr>\n            <th scope=\"col\">Export Category<\/th>\n            <th scope=\"col\">Est. Value 2025<\/th>\n            <th scope=\"col\">Projected Value 2035<\/th>\n            <th scope=\"col\">Projected Value 2050<\/th>\n            <th scope=\"col\">Trajectory<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td>Fossil Fuels (Coal &amp; LNG)<\/td>\n            <td>~$130 Billion<\/td>\n            <td>~$70\u2013$80 Billion<\/td>\n            <td>&lt;$30 Billion<\/td>\n            <td>Structural decline \u2014 global decarbonization mandates<\/td>\n          <\/tr>\n          <tr>\n            <td>Green Commodities (Critical Minerals &amp; Green Metals)<\/td>\n            <td>~$30 Billion<\/td>\n            <td>~$80 Billion<\/td>\n            <td>$109\u2013$178 Billion<\/td>\n            <td>Growth contingent on onshore processing via renewable energy<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <p class=\"obex-text\">The import side of Australia&#8217;s structural exposure is equally deteriorating. The aggressive domestic deployment of renewable energy infrastructure \u2014 Australia commissioned 4.9 GWh of grid-scale batteries in 2025, matching the output of the entire preceding eight years combined, and has 74 storage projects representing 13.3 GW of power capacity in the pipeline \u2014 is critically dependent on imported technology. Australia manufactures approximately one percent of the solar panels installed domestically, with the remaining 99 percent sourced overwhelmingly from Chinese manufacturers whose modules, priced at between $0.09 and $0.11 per watt, are structurally incompatible with domestic replication at competitive cost. For wind energy, the situation is comparable: Australia currently imports nearly all of its wind infrastructure despite forecasts indicating the need for 86 GW of new wind capacity \u2014 roughly 14,000 onshore turbines \u2014 by 2035. The country is, in effect, replacing its dependence on imported fossil-fuel-derived refined petroleum with an equally concentrated dependence on imported Chinese clean energy hardware.<\/p>\n\n    <p class=\"obex-text\">The strategic logic of this trajectory, extended to its structural conclusion, describes the precise inversion of the petro-globalization hierarchy. Australia, a nation that for four decades exported the raw fuel that powered Asia&#8217;s industrial growth and implicitly funded China&#8217;s economic miracle, is transitioning into a net importer of the technologies that China has used the revenues of that fuel to develop and industrialize at scale. The former fossil fuel exporter becomes a consumer of the electrostate&#8217;s manufactured output. The former buyer of Australian coal and LNG becomes the seller of the infrastructure Australia needs to replace the revenue that coal and LNG once generated. Traditional trade flows do not merely slow \u2014 they reverse direction, and the terms of dependency shift with them.<\/p>\n\n    <figure class=\"obex-chart-card\">\n      <figcaption class=\"obex-chart-title\">Australia&#8217;s Refined Petroleum Import Sources vs. Clean Energy Hardware Import Dependency \u2014 2020 to 2026<\/figcaption>\n      <div class=\"obex-chart-wrapper\">\n        <canvas id=\"obex-australia-import-dependency\" role=\"img\" aria-label=\"Horizontal bar chart comparing Australia's refined petroleum import dependency with clean energy hardware import dependency.\"><\/canvas>\n      <\/div>\n      <p class=\"obex-chart-source\">Source: Obex Analytica forecast.<\/p>\n    <\/figure>\n\n    <p class=\"obex-text\">The broader pattern applies beyond Australia. Traditional fossil fuel exporting nations that have not invested at sufficient scale in downstream processing or clean technology manufacturing face a comparable structural exposure: revenue from commodity exports declining as demand contracts, and capital expenditure for energy system transformation flowing outward to the small number of nations that control the industrial base of the energy transition. The geopolitical leverage once derived from a subterranean resource \u2014 the oil and gas that could be withheld, priced, or weaponized through a maritime chokepoint \u2014 transfers to the nation that controls the manufactured hardware and the processed minerals without which the clean energy transition cannot physically occur. The Strait of Hormuz, for thirty years the defining chokepoint of geopolitical energy power, is being replaced by a different kind of chokepoint \u2014 one built of supply chains in silicon, lithium, and rare earth magnets, and one that runs not through a narrow nautical passage but through the industrial districts of Shandong, Jiangxi, and Guangdong.<\/p>\n\n    <h2 class=\"obex-heading\">Interactive Analytical Dashboard<\/h2>\n\n    <p class=\"obex-text\">All scenarios, outcome trajectories, and quantitative projections referenced in this analysis are available in full through the Obex Analytica interactive dashboard attached at the end of this report. The dashboard provides access to modeled energy revenue scenarios for Australia and comparable fossil fuel exporters under three disruption timelines (30-day, 90-day, and sustained closure), China&#8217;s clean energy export market share projections through 2035, global renewable acceleration curves by region, commodity price trajectory models for crude oil, LNG, aluminum, and rare earths, and bilateral trade flow inversions between legacy fossil exporters and the electrostate tier. Scenario parameters are fully adjustable by the client analyst.<\/p>\n  <\/article>\n\n  <script>\n    (function () {\n      function loadChartJs(callback) {\n        if (window.Chart) {\n          callback();\n          return;\n        }\n\n        var existingScript = document.querySelector('script[src*=\"chart.js\"]');\n        if (existingScript) {\n          existingScript.addEventListener('load', callback);\n          return;\n        }\n\n        var script = document.createElement('script');\n        script.src = 'https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.7\/dist\/chart.umd.min.js';\n        script.onload = callback;\n        document.head.appendChild(script);\n      }\n\n      loadChartJs(function () {\n        const LANGUAGE = 'en';\n        const isArabic = LANGUAGE === 'ar';\n        const locale = isArabic ? 'ar-EG' : 'en-US';\n        const textDirection = isArabic ? 'rtl' : 'ltr';\n\n        const OBEX_COLORS = {\n          primary: '#0F1C5C',\n          accent: '#E60000',\n          white: '#FFFFFF',\n          primary72: 'rgba(15, 28, 92, 0.72)',\n          accent72: 'rgba(230, 0, 0, 0.72)',\n          primary45: 'rgba(15, 28, 92, 0.45)',\n          accent45: 'rgba(230, 0, 0, 0.45)',\n          primary25: 'rgba(15, 28, 92, 0.25)',\n          accent25: 'rgba(230, 0, 0, 0.25)',\n          grid: 'rgba(15, 28, 92, 0.14)',\n          muted: 'rgba(15, 28, 92, 0.68)'\n        };\n\n        Chart.defaults.font.family = \"'IBM Plex Sans', 'IBM Plex Sans Arabic', Arial, sans-serif\";\n        Chart.defaults.color = OBEX_COLORS.primary;\n\n        function formatValue(value, unit, activeLocale) {\n          if (value === null || value === undefined || Number.isNaN(Number(value))) {\n            return 'n\/a';\n          }\n\n          const number = new Intl.NumberFormat(activeLocale, {\n            maximumFractionDigits: 2\n          }).format(value);\n\n          if (!unit) return number;\n          if (unit === '%') return number + '%';\n          if (unit === '$bn') return '$' + number + 'bn';\n          if (unit === 'tn yuan') return number + ' tn yuan';\n          if (unit === 'mb\/d') return number + ' mb\/d';\n          if (unit === 'index') return number;\n          return number + ' ' + unit;\n        }\n\n        function wrapLabel(label, maxChars) {\n          const text = String(label);\n          if (text.length <= maxChars) return text;\n\n          const words = text.split(' ');\n          const lines = [];\n          let currentLine = '';\n\n          words.forEach(function (word) {\n            const testLine = currentLine ? currentLine + ' ' + word : word;\n            if (testLine.length > maxChars && currentLine) {\n              lines.push(currentLine);\n              currentLine = word;\n            } else {\n              currentLine = testLine;\n            }\n          });\n\n          if (currentLine) lines.push(currentLine);\n          return lines;\n        }\n\n        function tickWrap(maxChars) {\n          return function (value) {\n            const label = this.getLabelForValue ? this.getLabelForValue(value) : value;\n            return wrapLabel(label, maxChars);\n          };\n        }\n\n        function tooltipConfig(defaultUnit) {\n          return {\n            enabled: true,\n            rtl: isArabic,\n            textDirection: textDirection,\n            backgroundColor: OBEX_COLORS.primary,\n            titleColor: OBEX_COLORS.white,\n            bodyColor: OBEX_COLORS.white,\n            borderColor: OBEX_COLORS.accent,\n            borderWidth: 1,\n            padding: 12,\n            displayColors: true,\n            callbacks: {\n              label: function (context) {\n                const dataset = context.dataset || {};\n                const parsed = context.parsed || {};\n                const value = typeof parsed.x === 'number' ? parsed.x : (typeof parsed.y === 'number' ? parsed.y : context.raw);\n                const label = dataset.label ? dataset.label + ': ' : '';\n                const customValue = dataset.valueLabels && dataset.valueLabels[context.dataIndex];\n\n                if (customValue) {\n                  return label + customValue;\n                }\n\n                return label + formatValue(value, dataset.unit || defaultUnit || '', locale);\n              },\n              afterLabel: function (context) {\n                const dataset = context.dataset || {};\n                if (dataset.notes && dataset.notes[context.dataIndex]) {\n                  return dataset.notes[context.dataIndex];\n                }\n                return '';\n              }\n            }\n          };\n        }\n\n        function legendConfig() {\n          return {\n            position: 'bottom',\n            rtl: isArabic,\n            textDirection: textDirection,\n            labels: {\n              color: OBEX_COLORS.primary,\n              usePointStyle: true,\n              boxWidth: 10,\n              boxHeight: 10,\n              padding: 18,\n              font: {\n                weight: 600\n              }\n            }\n          };\n        }\n\n        function getCanvas(canvasId) {\n          const canvas = document.getElementById(canvasId);\n          if (!canvas) return null;\n\n          const existingChart = Chart.getChart(canvas);\n          if (existingChart) existingChart.destroy();\n\n          return canvas;\n        }\n\n        const axisTitleFont = {\n          weight: 700,\n          size: 12\n        };\n\n        const commonGrid = {\n          color: OBEX_COLORS.grid,\n          drawBorder: false\n        };\n\n        const commonTicks = {\n          color: OBEX_COLORS.primary,\n          font: {\n            size: 12,\n            weight: 500\n          }\n        };\n\n        const hormuzTransitData = {\n          labels: ['January baseline', '28 February onset', 'Mid-March disruption', 'Late March closure', 'April ceasefire window'],\n          trafficIndex: [100, 100, 30, 0, 0],\n          petroleumEquivalentMbd: [21, 21, 6.3, 0, 0],\n          trafficLabels: ['100 index', '100 index', '\u224830 index after >70% fall', '0 index', '0 index before verified reopening volume'],\n          petroleumLabels: ['\u224821 mb\/d', '\u224821 mb\/d', '\u22486.3 mb\/d derived from 70% fall', '0 mb\/d', '0 mb\/d before verified reopening volume']\n        };\n\n        const chart01 = getCanvas('obex-hormuz-transit-volume');\n        if (chart01) {\n          new Chart(chart01, {\n            type: 'line',\n            data: {\n              labels: hormuzTransitData.labels,\n              datasets: [\n                {\n                  label: 'Commercial maritime traffic index',\n                  data: hormuzTransitData.trafficIndex,\n                  unit: 'index',\n                  valueLabels: hormuzTransitData.trafficLabels,\n                  borderColor: OBEX_COLORS.primary,\n                  backgroundColor: OBEX_COLORS.white,\n                  pointBackgroundColor: OBEX_COLORS.white,\n                  pointBorderColor: OBEX_COLORS.primary,\n                  pointRadius: 4,\n                  pointHoverRadius: 6,\n                  borderWidth: 3,\n                  tension: 0.12,\n                  yAxisID: 'y'\n                },\n                {\n                  label: 'Petroleum transit equivalent',\n                  data: hormuzTransitData.petroleumEquivalentMbd,\n                  unit: 'mb\/d',\n                  valueLabels: hormuzTransitData.petroleumLabels,\n                  borderColor: OBEX_COLORS.accent,\n                  backgroundColor: OBEX_COLORS.white,\n                  pointBackgroundColor: OBEX_COLORS.white,\n                  pointBorderColor: OBEX_COLORS.accent,\n                  pointRadius: 4,\n                  pointHoverRadius: 6,\n                  borderWidth: 3,\n                  borderDash: [6, 4],\n                  tension: 0.12,\n                  yAxisID: 'y1'\n                }\n              ]\n            },\n            options: {\n              responsive: true,\n              maintainAspectRatio: false,\n              interaction: {\n                mode: 'index',\n                intersect: false\n              },\n              plugins: {\n                legend: legendConfig(),\n                tooltip: tooltipConfig()\n              },\n              scales: {\n                x: {\n                  grid: {\n                    display: false\n                  },\n                  ticks: {\n                    ...commonTicks,\n                    callback: tickWrap(16),\n                    maxRotation: 0\n                  }\n                },\n                y: {\n                  min: 0,\n                  max: 110,\n                  grid: commonGrid,\n                  ticks: commonTicks,\n                  title: {\n                    display: true,\n                    text: 'Traffic index, pre-crisis = 100',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                },\n                y1: {\n                  min: 0,\n                  max: 25,\n                  position: 'right',\n                  grid: {\n                    drawOnChartArea: false,\n                    color: OBEX_COLORS.grid\n                  },\n                  ticks: commonTicks,\n                  title: {\n                    display: true,\n                    text: 'Petroleum equivalent, mb\/d',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                }\n              }\n            }\n          });\n        }\n\n        const globalPowerMixData = {\n          labels: [\n            'Solar generation',\n            'Wind generation',\n            'Global fossil power',\n            'Gas-fired generation',\n            'Coal-fired generation'\n          ],\n          values: [14, 8, -1, -4, -3.5],\n          valueLabels: ['+14%', '+8%', '-1%', '-4%', '-3.5%']\n        };\n\n        const chart02 = getCanvas('obex-global-power-generation-mix');\n        if (chart02) {\n          new Chart(chart02, {\n            type: 'bar',\n            data: {\n              labels: globalPowerMixData.labels,\n              datasets: [\n                {\n                  label: 'Year-on-year change',\n                  data: globalPowerMixData.values,\n                  unit: '%',\n                  valueLabels: globalPowerMixData.valueLabels,\n                  backgroundColor: globalPowerMixData.values.map(function (value) {\n                    return value >= 0 ? OBEX_COLORS.primary : OBEX_COLORS.accent;\n                  }),\n                  borderColor: globalPowerMixData.values.map(function (value) {\n                    return value >= 0 ? OBEX_COLORS.primary : OBEX_COLORS.accent;\n                  }),\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 44\n                }\n              ]\n            },\n            options: {\n              responsive: true,\n              maintainAspectRatio: false,\n              indexAxis: 'y',\n              plugins: {\n                legend: {\n                  display: false\n                },\n                tooltip: tooltipConfig('%')\n              },\n              scales: {\n                x: {\n                  min: -6,\n                  max: 16,\n                  grid: commonGrid,\n                  ticks: {\n                    ...commonTicks,\n                    callback: function (value) {\n                      return value + '%';\n                    }\n                  },\n                  title: {\n                    display: true,\n                    text: 'Year-on-year change (%)',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                },\n                y: {\n                  grid: {\n                    display: false\n                  },\n                  ticks: {\n                    ...commonTicks,\n                    callback: tickWrap(24)\n                  }\n                }\n              }\n            }\n          });\n        }\n\n        const chinaInvestmentData = {\n          labels: ['2020', '2021', '2022', '2023', '2024', '2025'],\n          cleanEnergy: [2.2, 2.8, 4.54, 6.35, 6.8, 7.2],\n          fossilFuel: [1.45, 1.5, 1.6, 1.65, 1.7, 1.8],\n          cleanLabels: [\n            '~2.2 tn yuan (approx.)',\n            '~2.8 tn yuan (approx.)',\n            '~4.54 tn yuan (derived)',\n            '~6.35 tn yuan (derived)',\n            '6.8 tn yuan',\n            '7.2 tn yuan'\n          ],\n          fossilLabels: [\n            '~1.45 tn yuan (approx.)',\n            '~1.50 tn yuan (approx.)',\n            '~1.60 tn yuan (approx.)',\n            '~1.65 tn yuan (approx.)',\n            '~1.70 tn yuan (approx.)',\n            '~1.80 tn yuan, about one-quarter of clean-energy investment'\n          ]\n        };\n\n        const chart03 = getCanvas('obex-china-clean-vs-fossil-investment');\n        if (chart03) {\n          new Chart(chart03, {\n            type: 'bar',\n            data: {\n              labels: chinaInvestmentData.labels,\n              datasets: [\n                {\n                  label: 'Clean energy investment',\n                  data: chinaInvestmentData.cleanEnergy,\n                  unit: 'tn yuan',\n                  valueLabels: chinaInvestmentData.cleanLabels,\n                  backgroundColor: OBEX_COLORS.primary,\n                  borderColor: OBEX_COLORS.primary,\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 44\n                },\n                {\n                  label: 'Fossil fuel extraction & coal power',\n                  data: chinaInvestmentData.fossilFuel,\n                  unit: 'tn yuan',\n                  valueLabels: chinaInvestmentData.fossilLabels,\n                  backgroundColor: OBEX_COLORS.accent,\n                  borderColor: OBEX_COLORS.accent,\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 44\n                }\n              ]\n            },\n            options: {\n              responsive: true,\n              maintainAspectRatio: false,\n              plugins: {\n                legend: legendConfig(),\n                tooltip: tooltipConfig('tn yuan')\n              },\n              scales: {\n                x: {\n                  grid: {\n                    display: false\n                  },\n                  ticks: commonTicks\n                },\n                y: {\n                  beginAtZero: true,\n                  suggestedMax: 8,\n                  grid: commonGrid,\n                  ticks: commonTicks,\n                  title: {\n                    display: true,\n                    text: 'Trillion yuan',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                }\n              }\n            }\n          });\n        }\n\n        const australiaRevenueData = {\n          labels: ['2025', '2035', '2050'],\n          fossilValues: [130, 75, 30],\n          greenValues: [30, 80, 144.5],\n          fossilLabels: ['~$130bn', '~$70\u2013$80bn', '<$30bn'],\n          greenLabels: ['~$30bn', '~$80bn', '$109\u2013$178bn']\n        };\n\n        const chart04 = getCanvas('obex-australia-export-revenue-shift');\n        if (chart04) {\n          new Chart(chart04, {\n            type: 'bar',\n            data: {\n              labels: australiaRevenueData.labels,\n              datasets: [\n                {\n                  label: 'Fossil Fuels (Coal &#038; LNG)',\n                  data: australiaRevenueData.fossilValues,\n                  unit: '$bn',\n                  valueLabels: australiaRevenueData.fossilLabels,\n                  backgroundColor: OBEX_COLORS.accent,\n                  borderColor: OBEX_COLORS.accent,\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 48\n                },\n                {\n                  label: 'Green Commodities (Critical Minerals &#038; Green Metals)',\n                  data: australiaRevenueData.greenValues,\n                  unit: '$bn',\n                  valueLabels: australiaRevenueData.greenLabels,\n                  backgroundColor: OBEX_COLORS.primary,\n                  borderColor: OBEX_COLORS.primary,\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 48\n                }\n              ]\n            },\n            options: {\n              responsive: true,\n              maintainAspectRatio: false,\n              plugins: {\n                legend: legendConfig(),\n                tooltip: tooltipConfig('$bn')\n              },\n              scales: {\n                x: {\n                  grid: {\n                    display: false\n                  },\n                  ticks: commonTicks\n                },\n                y: {\n                  beginAtZero: true,\n                  suggestedMax: 180,\n                  grid: commonGrid,\n                  ticks: commonTicks,\n                  title: {\n                    display: true,\n                    text: 'USD billion',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                }\n              }\n            }\n          });\n        }\n\n        const australiaDependencyData = {\n          labels: [\n            'Refined petroleum import dependency',\n            'Installed solar panels imported from China',\n            'Wind infrastructure import dependency',\n            'Domestic solar manufacturing share'\n          ],\n          values: [85, 99, 98, 1],\n          valueLabels: ['80\u201390%', '~99%', 'Nearly all (~98%)', '~1%'],\n          notes: [\n            'Midpoint of stated daily refined-fuel import range',\n            'China-focused installed solar import dependency',\n            'Approximation of \u201cnearly all\u201d wind infrastructure',\n            'Domestic manufacturing share'\n          ]\n        };\n\n        const chart05 = getCanvas('obex-australia-import-dependency');\n        if (chart05) {\n          new Chart(chart05, {\n            type: 'bar',\n            data: {\n              labels: australiaDependencyData.labels,\n              datasets: [\n                {\n                  label: 'Import dependency \/ exposure',\n                  data: australiaDependencyData.values,\n                  unit: '%',\n                  valueLabels: australiaDependencyData.valueLabels,\n                  notes: australiaDependencyData.notes,\n                  backgroundColor: [\n                    OBEX_COLORS.primary,\n                    OBEX_COLORS.accent,\n                    OBEX_COLORS.primary72,\n                    OBEX_COLORS.accent45\n                  ],\n                  borderColor: [\n                    OBEX_COLORS.primary,\n                    OBEX_COLORS.accent,\n                    OBEX_COLORS.primary72,\n                    OBEX_COLORS.accent45\n                  ],\n                  borderWidth: 1,\n                  borderRadius: 0,\n                  borderSkipped: false,\n                  maxBarThickness: 46\n                }\n              ]\n            },\n            options: {\n              responsive: true,\n              maintainAspectRatio: false,\n              indexAxis: 'y',\n              plugins: {\n                legend: {\n                  display: false\n                },\n                tooltip: tooltipConfig('%')\n              },\n              scales: {\n                x: {\n                  min: 0,\n                  max: 100,\n                  grid: commonGrid,\n                  ticks: {\n                    ...commonTicks,\n                    callback: function (value) {\n                      return value + '%';\n                    }\n                  },\n                  title: {\n                    display: true,\n                    text: 'Share of import dependency \/ exposure (%)',\n                    color: OBEX_COLORS.primary,\n                    font: axisTitleFont\n                  }\n                },\n                y: {\n                  grid: {\n                    display: false\n                  },\n                  ticks: {\n                    ...commonTicks,\n                    callback: tickWrap(28)\n                  }\n                }\n              }\n            }\n          });\n        }\n      });\n    })();\n  <\/script>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<!doctype html>\n<html lang=\"en\" dir=\"ltr\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n  <title>OBEX Hormuz Energy Shift Dashboard<\/title>\n  <style>\n    html, body { margin: 0; min-height: 100%; background: #F4F6FB; }\n    body { padding: 18px; box-sizing: border-box; }\n  <\/style>\n<\/head>\n<body>\n  <obex-linked-dashboard><\/obex-linked-dashboard>\n\n  <script>\n  (() => {\n    const tagName = \"obex-linked-dashboard\";\n    if (customElements.get(tagName)) return;\n\n    const DATA = {\n  \"dashboard\": {\n    \"title\": \"Hormuz Energy Shift\",\n    \"subtitle\": \"country-impact cockpit built from Obex data pack.\",\n    \"eyebrow\": \"OBEX CONNECTED DASHBOARD\",\n    \"primaryMetricLabel\": \"Country impact score\",\n    \"secondaryMetricLabel\": \"Resilience buffer\",\n    \"defaultScenario\": \"S1\",\n    \"defaultEntity\": \"egypt\",\n    \"defaultFocus\": \"transit\",\n    \"scoreScale\": \"-3 severe risk to +3 strategic opportunity\"\n  },\n  \"scenarios\": {\n    \"S1\": {\n      \"label\": \"Acute Hormuz shock: oil, products, LNG, insurance and freight spike\",\n      \"shortLabel\": \"Hormuz shock\",\n      \"stress\": 94,\n      \"avgScore\": -1.25,\n      \"minScore\": -3.0,\n      \"maxScore\": 1.0,\n      \"note\": \"Direct energy import\/export exposure and route resilience.\",\n      \"bias\": \"Transit \/ insurance shock\",\n      \"market\": \"https:\/\/www.iea.org\/topics\/the-middle-east-and-global-energy-markets | https:\/\/www.iea.org\/about\/oil-security-and-emergency-response\/strait-of-hormuz\",\n      \"timing\": \"Immediate \u2014 days to weeks\",\n      \"defaultFocus\": \"transit\"\n    },\n    \"S2\": {\n      \"label\": \"LNG and gas-market shock from Qatar\/UAE disruption and spot-price spike\",\n      \"shortLabel\": \"LNG shock\",\n      \"stress\": 88,\n      \"avgScore\": -1.38,\n      \"minScore\": -3.0,\n      \"maxScore\": 0.5,\n      \"note\": \"LNG route dependence and domestic gas balances.\",\n      \"bias\": \"Gas balance and cargo availability\",\n      \"market\": \"https:\/\/www.eia.gov\/todayinenergy\/detail.php?id=66064 | https:\/\/www.iea.org\/about\/oil-security-and-emergency-response\/strait-of-hormuz\",\n      \"timing\": \"Immediate to 30 days\",\n      \"defaultFocus\": \"lng\"\n    },\n    \"S3\": {\n      \"label\": \"Fertilizer, urea, ammonia, sulphur and aluminium disruption\",\n      \"shortLabel\": \"Fertilizer disruption\",\n      \"stress\": 74,\n      \"avgScore\": 0.25,\n      \"minScore\": -2.0,\n      \"maxScore\": 1.0,\n      \"note\": \"IEA commodity shares + national industrial profiles.\",\n      \"bias\": \"Fertilizer, urea, sulphur and metals\",\n      \"market\": \"https:\/\/www.iea.org\/topics\/the-middle-east-and-global-energy-markets\",\n      \"timing\": \"30\u201390 days\",\n      \"defaultFocus\": \"fertilizer\"\n    },\n    \"S4\": {\n      \"label\": \"Accelerated renewable, storage, grid and nuclear deployment\",\n      \"shortLabel\": \"Clean buildout\",\n      \"stress\": 50,\n      \"avgScore\": 2.0,\n      \"minScore\": 2.0,\n      \"maxScore\": 2.0,\n      \"note\": \"Opportunity scores reflect renewable potential and policy direction.\",\n      \"bias\": \"Renewables, storage, grid and hydrogen\",\n      \"market\": \"https:\/\/www.reuters.com\/business\/energy\/egypt-falls-short-renewables-target-despite-encouraging-signs-2026-01-26\/ | https:\/\/www.moenergy.gov.sa\/en\/eco-system\/programs\/optimum-energy-mix | https:\/\/www.memr.gov.jo\/En\/NewsDetails\/Kharabsheh_Jordans_Energy_Sector_Achieves_Significant_Milestones | https:\/\/www.enec.ae\/barakah-plant\/\",\n      \"timing\": \"6\u201324 months\",\n      \"defaultFocus\": \"transition\"\n    },\n    \"S5\": {\n      \"label\": \"China-led electrostate supply-chain dominance\",\n      \"shortLabel\": \"China electrostate\",\n      \"stress\": 64,\n      \"avgScore\": 0.88,\n      \"minScore\": 0.0,\n      \"maxScore\": 1.5,\n      \"note\": \"Opportunity minus dependency exposure.\",\n      \"bias\": \"Hardware dependency and vendor leverage\",\n      \"market\": \"https:\/\/www.carbonbrief.org\/analysis-clean-energy-drove-more-than-a-third-of-chinas-gdp-growth-in-2025\/ | https:\/\/www.iea.org\/reports\/energy-technology-perspectives-2023\/clean-energy-supply-chains-vulnerabilities\",\n      \"timing\": \"Procurement cycle\",\n      \"defaultFocus\": \"hardware\"\n    },\n    \"S6\": {\n      \"label\": \"Structural fossil-demand decline after 2030\",\n      \"shortLabel\": \"Fossil demand decline\",\n      \"stress\": 68,\n      \"avgScore\": 0.0,\n      \"minScore\": -2.0,\n      \"maxScore\": 1.0,\n      \"note\": \"Global fossil-demand transition applied to country profiles.\",\n      \"bias\": \"Fiscal transition exposure\",\n      \"market\": \"https:\/\/www.theguardian.com\/business\/2025\/sep\/20\/australias-fossil-fuel-earnings-set-to-fall-by-50bn-a-year-by-2035 | \/mnt\/data\/hormuz_strategic_forecast.docx\",\n      \"timing\": \"2030+ structural\",\n      \"defaultFocus\": \"fiscal\"\n    },\n    \"S7\": {\n      \"label\": \"Nuclear renaissance and firm low-carbon power\",\n      \"shortLabel\": \"Nuclear renaissance\",\n      \"stress\": 45,\n      \"avgScore\": 1.38,\n      \"minScore\": 0.5,\n      \"maxScore\": 3.0,\n      \"note\": \"Firm clean power as resilience hedge.\",\n      \"bias\": \"Firm clean power resilience\",\n      \"market\": \"https:\/\/www.enec.ae\/barakah-plant\/ | \/mnt\/data\/hormuz_strategic_forecast.docx\",\n      \"timing\": \"Project-cycle signal\",\n      \"defaultFocus\": \"nuclear\"\n    }\n  },\n  \"entities\": {\n    \"egypt\": {\n      \"label\": \"Egypt\",\n      \"type\": \"High \u2014 gas deficit, LNG imports, oil\/fuel oil imports\",\n      \"beta\": \"High importer beta\",\n      \"buffers\": \"Dual exposure\",\n      \"passThrough\": 0.98,\n      \"bufferScore\": 37.1,\n      \"resilienceScore\": 1.86,\n      \"cleanCurrent\": 11.5,\n      \"cleanTarget\": 42.0,\n      \"targetYear\": \"2030\",\n      \"fuelExposure\": \"High \u2014 gas deficit, LNG imports, oil\/fuel oil imports\",\n      \"gasStatus\": \"Gas supply shortfall; adding FSRUs; imports from Israel and LNG markets\",\n      \"bypass\": \"Suez\/Red Sea exposed; no fuel-export bypass role\",\n      \"fiscalExposure\": \"Low\/medium; import bill more important than export revenue\",\n      \"firmPower\": \"El Dabaa under development; no operational nuclear generation baseline\",\n      \"vulnerability\": \"LNG\/oil import costs, FX pressure, power\/fertilizer curtailment, Suez risk\",\n      \"opportunity\": \"Wind\/solar buildout, interconnectors, Suez industrial localization, green hydrogen\",\n      \"electricityScore\": 2.0,\n      \"liquidFuelScore\": 1.0,\n      \"securityReason\": \"Gas shortfall and fuel import exposure; renewables target high but current share modest.\",\n      \"hardwareScore\": 3.67,\n      \"hardwareRisk\": \"FX-denominated EPC and imported hardware dependency.\",\n      \"vendorExposure\": \"Medium-high; cheap hardware enables rollout but risks concentration.\",\n      \"localContent\": \"Suez Economic Zone and localization potential; project-level data needed.\",\n      \"mainRisk\": \"Import-cost shock from LNG\/oil, gas shortages, fertilizer disruption, Suez\/Red Sea revenue exposure.\",\n      \"mainOpportunity\": \"Renewables, interconnectors, green hydrogen and Suez industrial localization.\",\n      \"strategicPriority\": \"Treat renewables and storage as energy-security infrastructure; prioritize gas-demand efficiency and resilient fuel procurement.\",\n      \"policy\": {\n        \"immediate\": \"Secure LNG\/fuel-oil, protect power\/fertilizer users, deploy demand response.\",\n        \"medium\": \"Accelerate solar\/wind, add storage, reduce gas burn, harden Suez\/Red Sea logistics.\",\n        \"long\": \"Build renewable-powered industrial zones, interconnectors, green hydrogen, fertilizer resilience.\",\n        \"priority\": \"Very high\",\n        \"kpis\": \"LNG cargo cost, gas production, renewable share, curtailment, fertilizer output\"\n      },\n      \"weights\": {\n        \"transit\": 0.95,\n        \"lng\": 1.0,\n        \"fertilizer\": 0.95,\n        \"transition\": 0.78,\n        \"hardware\": 0.82,\n        \"fiscal\": 0.55,\n        \"nuclear\": 0.58\n      },\n      \"scenarios\": {\n        \"S1\": {\n          \"score\": -3.0,\n          \"summary\": \"Severe import-bill, FX, subsidy, power and fertilizer stress; Suez\/Red Sea risks amplify pressure.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Severe import-bill, FX, subsidy, power and fertilizer stress; Suez\/Red Sea risks amplify pressure.\"\n        },\n        \"S2\": {\n          \"score\": -3.0,\n          \"summary\": \"Gas deficit and LNG imports make Egypt highly exposed to spot-price and cargo-availability shocks.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Gas deficit and LNG imports make Egypt highly exposed to spot-price and cargo-availability shocks.\"\n        },\n        \"S3\": {\n          \"score\": -2.0,\n          \"summary\": \"Fertilizer feedstock reliability and food inflation risks; upside only if gas supports exports.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Fertilizer feedstock reliability and food inflation risks; upside only if gas supports exports.\"\n        },\n        \"S4\": {\n          \"score\": 2.0,\n          \"summary\": \"Strong opportunity through solar\/wind, interconnectors, green hydrogen and lower gas burn.\",\n          \"direction\": \"Strong opportunity\",\n          \"channel\": \"Strong opportunity through solar\/wind, interconnectors, green hydrogen and lower gas burn.\"\n        },\n        \"S5\": {\n          \"score\": 0.0,\n          \"summary\": \"Cheap hardware accelerates deployment, but EPC\/vendor and FX dependency create risk.\",\n          \"direction\": \"Neutral \/ mixed\",\n          \"channel\": \"Cheap hardware accelerates deployment, but EPC\/vendor and FX dependency create risk.\"\n        },\n        \"S6\": {\n          \"score\": 1.0,\n          \"summary\": \"Lower long-term fuel prices can help import bill, but gas-export hub ambitions weaken if production declines.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Lower long-term fuel prices can help import bill, but gas-export hub ambitions weaken if production declines.\"\n        },\n        \"S7\": {\n          \"score\": 1.0,\n          \"summary\": \"El Dabaa offers baseload security option but vendor, finance and construction risks matter.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"El Dabaa offers baseload security option but vendor, finance and construction risks matter.\"\n        }\n      }\n    },\n    \"uae\": {\n      \"label\": \"UAE\",\n      \"type\": \"Low domestically, but export logistics exposed to Hormuz\",\n      \"beta\": \"Export-route beta\",\n      \"buffers\": \"Power resilient \/ export-route exposed\",\n      \"passThrough\": 0.76,\n      \"bufferScore\": 77.1,\n      \"resilienceScore\": 3.86,\n      \"cleanCurrent\": 25.0,\n      \"cleanTarget\": 32.0,\n      \"targetYear\": \"2030\",\n      \"fuelExposure\": \"Low domestically, but export logistics exposed to Hormuz\",\n      \"gasStatus\": \"LNG exporter; most LNG transits Hormuz; domestic power hedged by nuclear\",\n      \"bypass\": \"ADCOP to Fujairah bypass for oil, limited spare capacity\",\n      \"fiscalExposure\": \"Medium; diversified but hydrocarbons strategic\",\n      \"firmPower\": \"Barakah supplies around 25% of electricity \/ ~40 TWh per year\",\n      \"vulnerability\": \"Hormuz export-route exposure, LNG disruption, clean-tech hardware dependency\",\n      \"opportunity\": \"Nuclear + solar + storage, Masdar\/finance, Fujairah logistics\",\n      \"electricityScore\": 5.0,\n      \"liquidFuelScore\": 3.0,\n      \"securityReason\": \"Barakah and domestic gas\/solar hedge power, while LNG and oil exports remain route-exposed.\",\n      \"hardwareScore\": 3.0,\n      \"hardwareRisk\": \"Vendor-stack concentration in solar, storage and grid software.\",\n      \"vendorExposure\": \"Medium; strong capital position can diversify suppliers.\",\n      \"localContent\": \"Clean-energy investment and Masdar partnerships.\",\n      \"mainRisk\": \"Hormuz exposure for exports and LNG; imported clean-tech hardware dependency.\",\n      \"mainOpportunity\": \"Barakah nuclear, Fujairah bypass, Masdar, solar, hydrogen and clean-energy finance.\",\n      \"strategicPriority\": \"Use nuclear + solar + storage as domestic hedge; deepen Fujairah resilience and diversified supply-chain investments.\",\n      \"policy\": {\n        \"immediate\": \"Use Barakah\/solar to protect domestic power; prioritize Fujairah\/export logistics.\",\n        \"medium\": \"Expand storage and grid flexibility; diversify suppliers and protect LNG reliability.\",\n        \"long\": \"Invest in clean-tech supply chains, hydrogen\/ammonia and grid infrastructure finance.\",\n        \"priority\": \"High\",\n        \"kpis\": \"Barakah output, LNG exports, ADCOP utilization, storage additions\"\n      },\n      \"weights\": {\n        \"transit\": 0.78,\n        \"lng\": 0.76,\n        \"fertilizer\": 0.48,\n        \"transition\": 0.72,\n        \"hardware\": 0.66,\n        \"fiscal\": 0.66,\n        \"nuclear\": 0.92\n      },\n      \"scenarios\": {\n        \"S1\": {\n          \"score\": -1.0,\n          \"summary\": \"Oil-revenue upside but export logistics and LNG routes exposed; Fujairah partially hedges crude.\",\n          \"direction\": \"Moderate risk\",\n          \"channel\": \"Oil-revenue upside but export logistics and LNG routes exposed; Fujairah partially hedges crude.\"\n        },\n        \"S2\": {\n          \"score\": -1.0,\n          \"summary\": \"Domestic power hedged by Barakah, but LNG exports and buyer confidence suffer.\",\n          \"direction\": \"Moderate risk\",\n          \"channel\": \"Domestic power hedged by Barakah, but LNG exports and buyer confidence suffer.\"\n        },\n        \"S3\": {\n          \"score\": 1.0,\n          \"summary\": \"Aluminium and industrial exports can benefit from higher prices if logistics remain open.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Aluminium and industrial exports can benefit from higher prices if logistics remain open.\"\n        },\n        \"S4\": {\n          \"score\": 2.0,\n          \"summary\": \"Nuclear, solar, storage and clean-energy finance can deepen resilience.\",\n          \"direction\": \"Strong opportunity\",\n          \"channel\": \"Nuclear, solar, storage and clean-energy finance can deepen resilience.\"\n        },\n        \"S5\": {\n          \"score\": 1.5,\n          \"summary\": \"Capital and China ties create co-investment upside, with vendor-stack concentration risk.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Capital and China ties create co-investment upside, with vendor-stack concentration risk.\"\n        },\n        \"S6\": {\n          \"score\": 0.0,\n          \"summary\": \"Diversification cushions oil risk; clean-energy diplomacy can offset some downside.\",\n          \"direction\": \"Neutral \/ mixed\",\n          \"channel\": \"Diversification cushions oil risk; clean-energy diplomacy can offset some downside.\"\n        },\n        \"S7\": {\n          \"score\": 3.0,\n          \"summary\": \"Strategic winner due to Barakah already supplying around a quarter of national electricity.\",\n          \"direction\": \"Strategic winner\",\n          \"channel\": \"Strategic winner due to Barakah already supplying around a quarter of national electricity.\"\n        }\n      }\n    },\n    \"ksa\": {\n      \"label\": \"KSA\",\n      \"type\": \"Low \u2014 major hydrocarbon exporter\",\n      \"beta\": \"Export-route beta\",\n      \"buffers\": \"Fuel-rich \/ transition fiscal risk\",\n      \"passThrough\": 0.8,\n      \"bufferScore\": 68.6,\n      \"resilienceScore\": 3.43,\n      \"cleanCurrent\": null,\n      \"cleanTarget\": 45.0,\n      \"targetYear\": \"2030\",\n      \"fuelExposure\": \"Low \u2014 major hydrocarbon exporter\",\n      \"gasStatus\": \"Domestic gas and oil; aiming to remove liquid fuel from power mix\",\n      \"bypass\": \"East-West Pipeline ~7 mb\/d to Red Sea\/Yanbu\",\n      \"fiscalExposure\": \"High long-term oil revenue exposure\",\n      \"firmPower\": \"Nuclear option value; near-term strategy is gas\/renewables\/storage\",\n      \"vulnerability\": \"Oil-demand decline, infrastructure\/security risk, Red Sea disruption\",\n      \"opportunity\": \"Renewables at scale, hydrogen\/ammonia, mining, petrochemicals, localization\",\n      \"electricityScore\": 3.0,\n      \"liquidFuelScore\": 4.0,\n      \"securityReason\": \"East-West bypass and domestic fuels help; fiscal exposure to oil demand decline remains high.\",\n      \"hardwareScore\": 3.33,\n      \"hardwareRisk\": \"Importing full transition stack instead of building domestic capability.\",\n      \"vendorExposure\": \"Medium-high; procurement scale gives leverage for local-content obligations.\",\n      \"localContent\": \"Local manufacturing and industrial localization under Vision 2030 ecosystem.\",\n      \"mainRisk\": \"Long-term oil-demand decline and chokepoint\/security risk.\",\n      \"mainOpportunity\": \"East-West Pipeline, renewables at scale, green hydrogen\/ammonia, petrochemicals, mining and localization.\",\n      \"strategicPriority\": \"Accelerate liquid-fuel displacement in power and use procurement scale to localize solar, batteries, grid equipment and hydrogen value chains.\",\n      \"policy\": {\n        \"immediate\": \"Secure East-West\/Yanbu route, protect critical infrastructure, manage spare capacity signals.\",\n        \"medium\": \"Displace liquid fuels in power, accelerate renewables\/gas, localize grid\/storage procurement.\",\n        \"long\": \"Build hydrogen\/ammonia exports, mining\/metals and battery\/solar\/grid industrial base.\",\n        \"priority\": \"Very high\",\n        \"kpis\": \"East-West throughput, liquid fuel burn, renewable capacity, local-content share\"\n      },\n      \"weights\": {\n        \"transit\": 0.58,\n        \"lng\": 0.42,\n        \"fertilizer\": 0.52,\n        \"transition\": 0.8,\n        \"hardware\": 0.78,\n        \"fiscal\": 1.0,\n        \"nuclear\": 0.56\n      },\n      \"scenarios\": {\n        \"S1\": {\n          \"score\": 1.0,\n          \"summary\": \"Higher oil revenue and East-West bypass help, but demand destruction and security risks cap upside.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Higher oil revenue and East-West bypass help, but demand destruction and security risks cap upside.\"\n        },\n        \"S2\": {\n          \"score\": 0.5,\n          \"summary\": \"Less LNG-export exposed; may benefit from oil substitution, but industrial gas\/petrochemical costs matter.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Less LNG-export exposed; may benefit from oil substitution, but industrial gas\/petrochemical costs matter.\"\n        },\n        \"S3\": {\n          \"score\": 1.0,\n          \"summary\": \"Petrochemical\/fertilizer margins may rise, but route and infrastructure risks remain.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Petrochemical\/fertilizer margins may rise, but route and infrastructure risks remain.\"\n        },\n        \"S4\": {\n          \"score\": 2.0,\n          \"summary\": \"Can reduce domestic liquid fuel burn, protect export barrels and localize transition industries.\",\n          \"direction\": \"Strong opportunity\",\n          \"channel\": \"Can reduce domestic liquid fuel burn, protect export barrels and localize transition industries.\"\n        },\n        \"S5\": {\n          \"score\": 1.5,\n          \"summary\": \"Procurement scale gives local-content leverage if used aggressively.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Procurement scale gives local-content leverage if used aggressively.\"\n        },\n        \"S6\": {\n          \"score\": -2.0,\n          \"summary\": \"Largest strategic fiscal exposure to long-term oil-demand erosion.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Largest strategic fiscal exposure to long-term oil-demand erosion.\"\n        },\n        \"S7\": {\n          \"score\": 1.0,\n          \"summary\": \"Nuclear has option value; near-term gains faster through renewables, gas and storage.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Nuclear has option value; near-term gains faster through renewables, gas and storage.\"\n        }\n      }\n    },\n    \"jordan\": {\n      \"label\": \"Jordan\",\n      \"type\": \"Very high \u2014 oil and gas importer \/ price taker\",\n      \"beta\": \"Import price-taker\",\n      \"buffers\": \"Electricity partially diversified \/ fuel exposed\",\n      \"passThrough\": 0.89,\n      \"bufferScore\": 54.3,\n      \"resilienceScore\": 2.71,\n      \"cleanCurrent\": 27.0,\n      \"cleanTarget\": 31.0,\n      \"targetYear\": \"2031\",\n      \"fuelExposure\": \"Very high \u2014 oil and gas importer \/ price taker\",\n      \"gasStatus\": \"Gas deficit; relies on Israeli pipeline gas and Aqaba FSRU flexibility\",\n      \"bypass\": \"Aqaba gives LNG import flexibility; no major export bypass\",\n      \"fiscalExposure\": \"Low; import bill and subsidies matter more\",\n      \"firmPower\": \"No operating nuclear; possible future SMR\/desalination concepts\",\n      \"vulnerability\": \"Oil\/gas price spikes, electricity costs, fiscal\/social pressure\",\n      \"opportunity\": \"Solar\/wind, distributed renewables, storage, phosphate\/potash upside\",\n      \"electricityScore\": 3.0,\n      \"liquidFuelScore\": 1.0,\n      \"securityReason\": \"27% renewable electricity and Aqaba LNG flexibility, but high oil\/gas import exposure.\",\n      \"hardwareScore\": 3.67,\n      \"hardwareRisk\": \"Hardware affordability versus supplier concentration tradeoff.\",\n      \"vendorExposure\": \"Medium; affordability favors Chinese hardware, but bargaining power is limited.\",\n      \"localContent\": \"Distributed solar\/storage\/grid services; limited manufacturing scale.\",\n      \"mainRisk\": \"High energy-import exposure, oil\/gas price spikes and limited fiscal room.\",\n      \"mainOpportunity\": \"Solar\/wind base, distributed renewables, phosphate\/potash upside and Aqaba import flexibility.\",\n      \"strategicPriority\": \"Focus on storage, grid upgrades, distributed solar, demand response and diversified gas\/LNG backup.\",\n      \"policy\": {\n        \"immediate\": \"Use 60-day petroleum stocks carefully, diversify gas through Aqaba, target subsidies.\",\n        \"medium\": \"Add battery storage, demand response and grid upgrades to raise renewable absorption.\",\n        \"long\": \"Strengthen interconnectors, distributed solar, storage and phosphate\/potash value-added exports.\",\n        \"priority\": \"High\",\n        \"kpis\": \"Oil bill, import days cover, renewable curtailment, storage capacity, subsidy cost\"\n      },\n      \"weights\": {\n        \"transit\": 0.9,\n        \"lng\": 0.93,\n        \"fertilizer\": 0.88,\n        \"transition\": 0.72,\n        \"hardware\": 0.82,\n        \"fiscal\": 0.62,\n        \"nuclear\": 0.45\n      },\n      \"scenarios\": {\n        \"S1\": {\n          \"score\": -2.0,\n          \"summary\": \"Oil\/gas importer faces import-bill and electricity-cost shock; renewables soften but do not remove exposure.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Oil\/gas importer faces import-bill and electricity-cost shock; renewables soften but do not remove exposure.\"\n        },\n        \"S2\": {\n          \"score\": -2.0,\n          \"summary\": \"Gas deficit, Israeli pipeline dependence and Aqaba LNG backup expose Jordan to higher import costs.\",\n          \"direction\": \"High \/ severe risk\",\n          \"channel\": \"Gas deficit, Israeli pipeline dependence and Aqaba LNG backup expose Jordan to higher import costs.\"\n        },\n        \"S3\": {\n          \"score\": 1.0,\n          \"summary\": \"Phosphate\/potash upside, partly offset by food and fuel inflation pressure.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Phosphate\/potash upside, partly offset by food and fuel inflation pressure.\"\n        },\n        \"S4\": {\n          \"score\": 2.0,\n          \"summary\": \"High renewable share can become stronger with storage, grid upgrades and demand response.\",\n          \"direction\": \"Strong opportunity\",\n          \"channel\": \"High renewable share can become stronger with storage, grid upgrades and demand response.\"\n        },\n        \"S5\": {\n          \"score\": 0.5,\n          \"summary\": \"Cheap hardware helps affordability, but limited bargaining power increases dependency risk.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Cheap hardware helps affordability, but limited bargaining power increases dependency risk.\"\n        },\n        \"S6\": {\n          \"score\": 1.0,\n          \"summary\": \"Lower fossil prices help import bill, though GCC slowdown could reduce remittances\/investment.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Lower fossil prices help import bill, though GCC slowdown could reduce remittances\/investment.\"\n        },\n        \"S7\": {\n          \"score\": 0.5,\n          \"summary\": \"Potential SMR\/desalination interest, constrained by financing and scale.\",\n          \"direction\": \"Moderate opportunity\",\n          \"channel\": \"Potential SMR\/desalination interest, constrained by financing and scale.\"\n        }\n      }\n    }\n  },\n  \"channels\": {\n    \"transit\": {\n      \"label\": \"Hormuz transit\",\n      \"node\": \"transit\",\n      \"body\": \"Oil\/products flows, freight insurance, shipping confidence and bypass capacity define the immediate shock lane.\",\n      \"layer\": \"Trade route \/ import bill\",\n      \"layerCopy\": \"Physical disruption first hits price, freight, insurance and stock-release decisions before it reaches CPI or fiscal accounts.\",\n      \"timing\": \"Days to weeks\",\n      \"timingCopy\": \"This channel moves fastest; the workbook treats the daily transit curve as a visual proxy until operational AIS\/Kpler data replaces it.\",\n      \"weightCopy\": \"Higher for importers and for exporters without robust bypass or non-Hormuz outlets.\",\n      \"intensity\": {\n        \"S1\": 95,\n        \"S2\": 58,\n        \"S3\": 62,\n        \"S4\": 28,\n        \"S5\": 25,\n        \"S6\": 45,\n        \"S7\": 20\n      },\n      \"currentRange\": {\n        \"S1\": \"19.87 mb\/d baseline; March trough proxy 2.1 mb\/d; bypass ceiling 3.5\u20135.5 mb\/d\",\n        \"S2\": \"Transit risk remains secondary; LNG cargo availability dominates the stress.\",\n        \"S3\": \"Route risk feeds fertilizer inputs and metals but is not the only price driver.\",\n        \"S4\": \"Transit stress fades as lower fossil burn and clean capacity improve buffers.\",\n        \"S5\": \"Physical chokepoint risk is lower than hardware\/vendor concentration risk.\",\n        \"S6\": \"Long-term oil-demand erosion reshapes flows more than acute closure risk.\",\n        \"S7\": \"Firm low-carbon generation cushions domestic power against fuel-route shocks.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"Oil + products via Hormuz\",\n          \"type\": \"benchmark\",\n          \"value\": \"19.87 mb\/d via Hormuz in 2025\",\n          \"note\": \"~25% of global seaborne oil trade\"\n        },\n        {\n          \"name\": \"March trough proxy\",\n          \"type\": \"benchmark\",\n          \"value\": \"2.1 mb\/d\",\n          \"note\": \"Workbook proxy for Hormuz oil\/products at crisis trough.\"\n        },\n        {\n          \"name\": \"Saudi East-West bypass\",\n          \"type\": \"route\",\n          \"value\": \"7 mb\/d nameplate\",\n          \"note\": \"Missile\/drone attacks; Red Sea shipping risk; terminal concentration\"\n        },\n        {\n          \"name\": \"ADCOP Fujairah bypass\",\n          \"type\": \"route\",\n          \"value\": \"1.8 mb\/d nameplate\",\n          \"note\": \"Operational\"\n        }\n      ]\n    },\n    \"lng\": {\n      \"label\": \"LNG \/ gas balance\",\n      \"node\": \"lng\",\n      \"body\": \"Qatar\/UAE LNG transit exposure, Egypt\/Jordan gas deficits and spot-price sensitivity transmit the shock into power and industry.\",\n      \"layer\": \"Power and industrial gas\",\n      \"layerCopy\": \"Gas availability affects power dispatch, industrial feedstock, fertilizer economics and fiscal support.\",\n      \"timing\": \"Immediate to 30 days\",\n      \"timingCopy\": \"Cargo availability and spot LNG prices can move quickly; demand response and fuel switching lag behind.\",\n      \"weightCopy\": \"Higher for gas-deficit importers and for exporters whose LNG credibility depends on Hormuz transit.\",\n      \"intensity\": {\n        \"S1\": 76,\n        \"S2\": 96,\n        \"S3\": 50,\n        \"S4\": 30,\n        \"S5\": 25,\n        \"S6\": 35,\n        \"S7\": 25\n      },\n      \"currentRange\": {\n        \"S1\": \">112 bcm\/year LNG transits Hormuz; spot LNG risk follows physical disruption.\",\n        \"S2\": \"Highest gas-market stress: Qatar\/UAE cargo disruption and spot-price spike.\",\n        \"S3\": \"Gas-linked fertilizer costs rise even without full LNG route closure.\",\n        \"S4\": \"Renewables, storage and demand response reduce gas burn over 6\u201324 months.\",\n        \"S5\": \"Hardware availability affects the speed of gas-displacement projects.\",\n        \"S6\": \"Gas-export hub ambitions face structural demand and price uncertainty.\",\n        \"S7\": \"Nuclear and firm clean power reduce gas-fired power sensitivity.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"LNG via Hormuz\",\n          \"type\": \"benchmark\",\n          \"value\": \">112 bcm\/year via Hormuz\",\n          \"note\": \"~19% of global LNG trade\"\n        },\n        {\n          \"name\": \"Gulf LNG alternative route\",\n          \"type\": \"route\",\n          \"value\": \"No meaningful alternative\",\n          \"note\": \"Qatar\/UAE LNG terminals depend on Hormuz transit\"\n        },\n        {\n          \"name\": \"Global gas-fired power\",\n          \"type\": \"benchmark\",\n          \"value\": \"-4% YoY\",\n          \"note\": \"Gas fell outside China due to supply and cost pressure.\"\n        },\n        {\n          \"name\": \"Total fossil power\",\n          \"type\": \"benchmark\",\n          \"value\": \"-1% YoY\",\n          \"note\": \"Fossil power declined despite the crisis; renewables buffered demand.\"\n        }\n      ]\n    },\n    \"fertilizer\": {\n      \"label\": \"Fertilizer \/ food inputs\",\n      \"node\": \"fertilizer\",\n      \"body\": \"Gas feedstock, urea, ammonia, phosphate and sulphur exposures connect the energy shock to food prices and farm input availability.\",\n      \"layer\": \"Food security \/ subsidy layer\",\n      \"layerCopy\": \"The pathway moves from feedstock and traded inputs into farm costs, yields, food inflation and fiscal shields.\",\n      \"timing\": \"30\u201390 days\",\n      \"timingCopy\": \"Price signals can appear fast; downstream food and subsidy pressure normally peaks after procurement and planting cycles.\",\n      \"weightCopy\": \"Higher for food importers and countries with fertilizer, fuel or FX vulnerabilities.\",\n      \"intensity\": {\n        \"S1\": 58,\n        \"S2\": 55,\n        \"S3\": 92,\n        \"S4\": 36,\n        \"S5\": 30,\n        \"S6\": 30,\n        \"S7\": 20\n      },\n      \"currentRange\": {\n        \"S1\": \"Food-input pressure follows fuel, freight and insurance escalation.\",\n        \"S2\": \"Gas feedstock stress lifts fertilizer costs and availability risk.\",\n        \"S3\": \">30% urea exposure plus ammonia\/phosphate and sulphur channels sit in focus.\",\n        \"S4\": \"Clean buildout improves power costs but food-input sensitivity remains.\",\n        \"S5\": \"Supply-chain leverage affects equipment, while fertilizer remains a trade risk.\",\n        \"S6\": \"Lower fossil demand can ease fuel prices but does not remove food security exposure.\",\n        \"S7\": \"Firm power reduces electricity stress but fertilizer feedstock remains fuel-linked.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"Urea trade exposure\",\n          \"type\": \"benchmark\",\n          \"value\": \">30% of global urea trade\",\n          \"note\": \"Fertilizer prices, crop yields, food inflation\"\n        },\n        {\n          \"name\": \"Ammonia \/ phosphate\",\n          \"type\": \"benchmark\",\n          \"value\": \"~20% of ammonia and phosphate trade\",\n          \"note\": \"Fertilizer and chemicals supply chains\"\n        },\n        {\n          \"name\": \"Seaborne sulphur\",\n          \"type\": \"benchmark\",\n          \"value\": \"Around half of global seaborne sulphur trade\",\n          \"note\": \"Fertilizer, chemicals, refining and industrial supply chains\"\n        },\n        {\n          \"name\": \"Food inflation pathway\",\n          \"type\": \"benchmark\",\n          \"value\": \"5-stage chain\",\n          \"note\": \"Gas feedstock \u2192 urea\/ammonia \u2192 farm input costs \u2192 food inflation \/ fiscal stress.\"\n        }\n      ]\n    },\n    \"transition\": {\n      \"label\": \"Clean buildout\",\n      \"node\": \"transition\",\n      \"body\": \"Renewables, storage, grids, interconnectors and hydrogen become energy-security infrastructure rather than only climate capex.\",\n      \"layer\": \"Resilience capex layer\",\n      \"layerCopy\": \"The channel shifts exposure from fuel procurement toward electricity flexibility, grid readiness and localization.\",\n      \"timing\": \"6\u201324 months\",\n      \"timingCopy\": \"Fast procurement can cushion near-term stress, but grid, storage and industrial localization require multi-year sequencing.\",\n      \"weightCopy\": \"Higher where clean targets, power demand and fuel-import exposure create a direct security payoff.\",\n      \"intensity\": {\n        \"S1\": 42,\n        \"S2\": 48,\n        \"S3\": 45,\n        \"S4\": 90,\n        \"S5\": 70,\n        \"S6\": 75,\n        \"S7\": 65\n      },\n      \"currentRange\": {\n        \"S1\": \"Crisis acceleration signal: solar +14% and wind +8% YoY outside China in the dataset.\",\n        \"S2\": \"Gas shock raises the value of renewables, storage and demand-side flexibility.\",\n        \"S3\": \"Food-input pressure elevates local renewables for agriculture and industry.\",\n        \"S4\": \"Primary opportunity: renewable, storage, grid and nuclear deployment accelerates.\",\n        \"S5\": \"Clean transition depends on imported hardware and China-linked supplier stacks.\",\n        \"S6\": \"Fossil-demand decline makes clean industry localization a fiscal hedge.\",\n        \"S7\": \"Firm clean power complements renewables and grid flexibility.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"Solar generation\",\n          \"type\": \"benchmark\",\n          \"value\": \"14% YoY\",\n          \"note\": \"Solar was the strongest immediate fossil-demand offset.\"\n        },\n        {\n          \"name\": \"Wind generation\",\n          \"type\": \"benchmark\",\n          \"value\": \"8% YoY\",\n          \"note\": \"Wind provided additional non-fossil buffer.\"\n        },\n        {\n          \"name\": \"China clean investment\",\n          \"type\": \"benchmark\",\n          \"value\": \"7.2 tn yuan\",\n          \"note\": \"Clean-energy economy: 15.41 tn yuan in 2025.\"\n        },\n        {\n          \"name\": \"Country clean target\",\n          \"type\": \"benchmark\",\n          \"value\": \"Entity-specific\",\n          \"note\": \"Uses the selected country's current and target clean-power share from Country_Baseline.\"\n        }\n      ]\n    },\n    \"hardware\": {\n      \"label\": \"China hardware leverage\",\n      \"node\": \"hardware\",\n      \"body\": \"Solar modules, batteries, grid equipment and critical-mineral processing create a second chokepoint around clean-energy deployment speed.\",\n      \"layer\": \"Procurement \/ vendor stack\",\n      \"layerCopy\": \"Low-cost hardware accelerates deployment but can concentrate standards, software, spare parts and financing dependency.\",\n      \"timing\": \"Procurement cycle\",\n      \"timingCopy\": \"Risks surface when projects move from strategy into EPC packages, financing, grid software and after-sales dependencies.\",\n      \"weightCopy\": \"Higher where clean buildout is urgent but local manufacturing and supplier diversity are thin.\",\n      \"intensity\": {\n        \"S1\": 30,\n        \"S2\": 35,\n        \"S3\": 38,\n        \"S4\": 65,\n        \"S5\": 94,\n        \"S6\": 62,\n        \"S7\": 55\n      },\n      \"currentRange\": {\n        \"S1\": \"Hardware dependency is a second-order exposure during acute energy stress.\",\n        \"S2\": \"Gas shock increases urgency of clean hardware procurement and grid upgrades.\",\n        \"S3\": \"Industrial inputs and aluminium channels interact with clean-hardware buildout.\",\n        \"S4\": \"Deployment opportunity depends on solar, storage and grid-equipment availability.\",\n        \"S5\": \"Primary focus: China-led electrostate supply-chain dominance and vendor concentration.\",\n        \"S6\": \"Transition fiscal plans need local-content leverage and diversified procurement.\",\n        \"S7\": \"Nuclear and grid programs can lock in long-lived technology partnerships.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"Solar modules and cells\",\n          \"type\": \"benchmark\",\n          \"value\": \"Modules $0.09-0.11\/W; China >80% across polysilicon\/wafer\/cell\/module capacity\",\n          \"note\": \"Speeds decarbonization but concentrates supply-chain dependency\"\n        },\n        {\n          \"name\": \"Lithium and cobalt processing\",\n          \"type\": \"benchmark\",\n          \"value\": \"60-70% global refining\/processing concentration\",\n          \"note\": \"Controls cost and availability of batteries and grid storage\"\n        },\n        {\n          \"name\": \"Rare earth refining\",\n          \"type\": \"benchmark\",\n          \"value\": \"~90% global refining concentration\",\n          \"note\": \"Affects turbine, EV motor and defense-industrial supply chains\"\n        },\n        {\n          \"name\": \"Power transformers\",\n          \"type\": \"benchmark\",\n          \"value\": \"64.6bn yuan exports in 2025; nearly +36% YoY\",\n          \"note\": \"Embeds standards and controls renewables integration speed\"\n        }\n      ]\n    },\n    \"fiscal\": {\n      \"label\": \"Fiscal transition\",\n      \"node\": \"fiscal\",\n      \"body\": \"Import bills, subsidies, oil-export revenue and long-run demand decline reprice the public-finance side of the energy shift.\",\n      \"layer\": \"Fiscal \/ macro buffer\",\n      \"layerCopy\": \"The same shock can improve near-term exporter revenue while increasing long-term risk where public finance depends on oil demand.\",\n      \"timing\": \"Now to 2030+\",\n      \"timingCopy\": \"Acute price effects arrive quickly; fossil-demand decline is a structural 2030+ exposure.\",\n      \"weightCopy\": \"Higher for import-bill constrained economies and for exporters exposed to long-term oil-demand erosion.\",\n      \"intensity\": {\n        \"S1\": 65,\n        \"S2\": 48,\n        \"S3\": 40,\n        \"S4\": 45,\n        \"S5\": 50,\n        \"S6\": 93,\n        \"S7\": 42\n      },\n      \"currentRange\": {\n        \"S1\": \"Acute price shock hits importers; exporters gain revenue but face demand destruction.\",\n        \"S2\": \"LNG price shock raises subsidy and utility stress for gas-exposed importers.\",\n        \"S3\": \"Food, fertilizer and industrial costs widen fiscal and social-policy exposure.\",\n        \"S4\": \"Clean buildout shifts capex from fuel imports toward infrastructure investment.\",\n        \"S5\": \"Hardware concentration changes FX, procurement and localization risks.\",\n        \"S6\": \"Primary focus: structural fossil-demand decline after 2030.\",\n        \"S7\": \"Firm low-carbon assets can lower fuel volatility but require financing discipline.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"Australia fossil exports 2025\",\n          \"type\": \"benchmark\",\n          \"value\": \"130 USD bn\",\n          \"note\": \"Coal and LNG fossil-fuel export value; green commodities include critical minerals and green metals.\"\n        },\n        {\n          \"name\": \"Australia fossil exports 2050\",\n          \"type\": \"benchmark\",\n          \"value\": \"25\u201330 USD bn\",\n          \"note\": \"Fossil below $30bn by 2050; green commodities $109-178bn.\"\n        },\n        {\n          \"name\": \"Green commodities 2050\",\n          \"type\": \"benchmark\",\n          \"value\": \"109\u2013178 USD bn\",\n          \"note\": \"Transition upside benchmark for commodity exporters.\"\n        },\n        {\n          \"name\": \"Country fiscal exposure\",\n          \"type\": \"benchmark\",\n          \"value\": \"Entity-specific\",\n          \"note\": \"Selected-country fossil export or import-bill exposure from Country_Baseline.\"\n        }\n      ]\n    },\n    \"nuclear\": {\n      \"label\": \"Nuclear \/ firm power\",\n      \"node\": \"nuclear\",\n      \"body\": \"Firm low-carbon generation is a resilience hedge, but vendor, finance, construction and governance risks vary by country.\",\n      \"layer\": \"Firm power \/ grid stability\",\n      \"layerCopy\": \"Nuclear and firm low-carbon options reduce fuel-price exposure where execution, financing and governance are strong.\",\n      \"timing\": \"Project cycle\",\n      \"timingCopy\": \"Operational assets cushion immediately; new builds require long-cycle delivery and risk governance.\",\n      \"weightCopy\": \"Higher where firm clean power is operational or strategically available as a power-sector hedge.\",\n      \"intensity\": {\n        \"S1\": 35,\n        \"S2\": 45,\n        \"S3\": 20,\n        \"S4\": 72,\n        \"S5\": 48,\n        \"S6\": 45,\n        \"S7\": 92\n      },\n      \"currentRange\": {\n        \"S1\": \"Firm clean generation is a resilience hedge against fuel and power shocks.\",\n        \"S2\": \"Nuclear and firm clean power limit gas-fired exposure where already operational.\",\n        \"S3\": \"Low-carbon baseload protects industry but not fertilizer feedstock directly.\",\n        \"S4\": \"Nuclear complements renewables where grid stability and financing allow.\",\n        \"S5\": \"Long-lived nuclear projects increase technology, finance and vendor-governance stakes.\",\n        \"S6\": \"Firm clean power reduces demand for fuel imports and protects export barrels.\",\n        \"S7\": \"Primary focus: nuclear renaissance and firm low-carbon power.\"\n      },\n      \"marketRows\": [\n        {\n          \"name\": \"UAE Barakah signal\",\n          \"type\": \"benchmark\",\n          \"value\": \"\u224825% electricity \/ ~40 TWh\",\n          \"note\": \"Country_Baseline records Barakah as a major domestic power hedge.\"\n        },\n        {\n          \"name\": \"Egypt El Dabaa\",\n          \"type\": \"benchmark\",\n          \"value\": \"Under development\",\n          \"note\": \"Baseload security option with vendor, finance and construction risk.\"\n        },\n        {\n          \"name\": \"Jordan SMR option\",\n          \"type\": \"benchmark\",\n          \"value\": \"Future concept\",\n          \"note\": \"Possible SMR\/desalination interest constrained by financing and scale.\"\n        },\n        {\n          \"name\": \"Scenario S7 signal\",\n          \"type\": \"benchmark\",\n          \"value\": \"Firm clean power\",\n          \"note\": \"Nuclear renaissance and firm low-carbon power as resilience hedge.\"\n        }\n      ]\n    }\n  },\n  \"monitorDefs\": [\n    {\n      \"key\": \"transit\",\n      \"label\": \"Hormuz traffic\",\n      \"desc\": \"Oil\/products flow, bypass ceiling and freight\/insurance stress.\"\n    },\n    {\n      \"key\": \"lng\",\n      \"label\": \"LNG \/ gas balance\",\n      \"desc\": \"Cargo availability, spot LNG price and power-sector gas sensitivity.\"\n    },\n    {\n      \"key\": \"fertilizer\",\n      \"label\": \"Fertilizer pathway\",\n      \"desc\": \"Gas feedstock, urea, ammonia\/phosphate and food-input pressure.\"\n    },\n    {\n      \"key\": \"hardware\",\n      \"label\": \"Hardware leverage\",\n      \"desc\": \"Solar, battery, grid and critical-mineral supplier concentration.\"\n    },\n    {\n      \"key\": \"power\",\n      \"label\": \"Power buffer strain\",\n      \"desc\": \"Electricity resilience under the selected country and scenario.\"\n    },\n    {\n      \"key\": \"policy\",\n      \"label\": \"Policy buffer load\",\n      \"desc\": \"Fiscal, subsidy, logistics and procurement readiness pressure.\"\n    }\n  ],\n  \"focusLinkMap\": {\n    \"transit\": [\n      \"source-transit\",\n      \"transit-filter\",\n      \"filter-impact\",\n      \"transit-fiscal\"\n    ],\n    \"lng\": [\n      \"source-lng\",\n      \"lng-filter\",\n      \"filter-impact\",\n      \"lng-fertilizer\"\n    ],\n    \"fertilizer\": [\n      \"lng-fertilizer\",\n      \"fertilizer-filter\",\n      \"filter-impact\",\n      \"fertilizer-fiscal\"\n    ],\n    \"transition\": [\n      \"transition-filter\",\n      \"filter-policy\",\n      \"transition-hardware\",\n      \"transition-nuclear\"\n    ],\n    \"hardware\": [\n      \"hardware-transition\",\n      \"transition-hardware\",\n      \"hardware-filter\",\n      \"filter-policy\"\n    ],\n    \"fiscal\": [\n      \"filter-impact\",\n      \"filter-policy\",\n      \"transit-fiscal\",\n      \"fertilizer-fiscal\"\n    ],\n    \"nuclear\": [\n      \"nuclear-filter\",\n      \"transition-nuclear\",\n      \"filter-policy\",\n      \"nuclear-impact\"\n    ]\n  },\n  \"scenarioActions\": {\n    \"S1\": {\n      \"title\": \"Route and stock discipline\",\n      \"body\": \"Prioritize fuel, insurance and stock-release decisions around the route most exposed to disruption.\"\n    },\n    \"S2\": {\n      \"title\": \"Gas cargo protection\",\n      \"body\": \"Map LNG cargoes, fallback fuel, interruptible demand and utility cost recovery before spot pressure peaks.\"\n    },\n    \"S3\": {\n      \"title\": \"Food-input shield\",\n      \"body\": \"Track urea, ammonia, sulphur and farm-input availability before it reaches CPI and fiscal support.\"\n    },\n    \"S4\": {\n      \"title\": \"Accelerate resilience capex\",\n      \"body\": \"Pull forward grid, storage, demand-response and high-value renewable packages that reduce fuel burn.\"\n    },\n    \"S5\": {\n      \"title\": \"Supplier-stack guardrail\",\n      \"body\": \"Use procurement scale to diversify vendors, localize critical scope and avoid single-stack dependency.\"\n    },\n    \"S6\": {\n      \"title\": \"Fiscal transition hedge\",\n      \"body\": \"Reprice oil-demand, import-bill and green-commodity exposures across the 2030+ investment program.\"\n    },\n    \"S7\": {\n      \"title\": \"Firm-power governance\",\n      \"body\": \"Treat nuclear and firm low-carbon power as long-cycle resilience projects with strict finance and delivery controls.\"\n    }\n  },\n  \"sourceSheets\": [\n    \"README\",\n    \"Visuals_Index\",\n    \"Sources\",\n    \"Hormuz_Transit_Model\",\n    \"Hormuz_Commodity_Impact\",\n    \"Bypass_Routes\",\n    \"Global_Power_YoY\",\n    \"China_Clean_Investment\",\n    \"China_Clean_Sectors\",\n    \"China_Supply_Leverage\",\n    \"Australia_Exports\",\n    \"Australia_Import_Dependency\",\n    \"Country_Baseline\",\n    \"Scenario_Matrix\",\n    \"Heatmap_Data\",\n    \"Resilience_Radar\",\n    \"Energy_Security_Matrix\",\n    \"Fertilizer_Pathway\",\n    \"MENA_Hardware_Dependency\",\n    \"Policy_Response_Tracker\",\n    \"Country_Takeaways\",\n    \"Dashboard\"\n  ]\n};\n\n    const template = document.createElement(\"template\");\n    template.innerHTML = `\n      <style>\n        @font-face {\n          font-family: \"OBEX Plex\";\n          src:\n            local(\"IBM Plex Sans\"),\n            url(\".\/obex-fonts\/IBMPlexSans-VariableFont_wdth,wght.woff2\") format(\"woff2\"),\n            url(\".\/IBMPlexSans-VariableFont_wdth,wght.woff2\") format(\"woff2\");\n          font-weight: 100 700;\n          font-style: normal;\n          font-display: swap;\n          unicode-range: U+0000-00FF, U+0100-024F, U+1E00-1EFF, U+2000-206F, U+20A0-20CF, U+2100-214F, U+2190-21FF, U+2200-22FF, U+25A0-25FF, U+FB00-FB06;\n        }\n\n        @font-face {\n          font-family: \"OBEX Plex\";\n          src:\n            local(\"IBM Plex Sans Arabic\"),\n            url(\".\/obex-fonts\/IBMPlexSansArabic-VariableFont_wght.woff2\") format(\"woff2\"),\n            url(\".\/IBMPlexSansArabic-VariableFont_wght.woff2\") format(\"woff2\");\n          font-weight: 100 700;\n          font-style: normal;\n          font-display: swap;\n          unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF;\n        }\n\n        :host {\n          --obex-navy: #0F1C5C;\n          --obex-red: #E60000;\n          --obex-white: #FFFFFF;\n          --obex-soft: #F4F6FB;\n          --obex-soft-2: #EEF1F8;\n          --obex-ink: #141B40;\n          --obex-muted: #58607F;\n          --obex-line: rgba(15, 28, 92, 0.16);\n          --obex-line-strong: rgba(15, 28, 92, 0.24);\n          --obex-red-soft: rgba(230, 0, 0, 0.08);\n          --obex-navy-soft: rgba(15, 28, 92, 0.06);\n          display: block;\n          width: 100%;\n          container-type: inline-size;\n          color: var(--obex-ink);\n          font-family: \"OBEX Plex\", \"IBM Plex Sans\", \"IBM Plex Sans Arabic\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Tahoma, Arial, sans-serif;\n        }\n\n        *, *::before, *::after { box-sizing: border-box; }\n        button, input { font: inherit; }\n        button { cursor: pointer; }\n        button:disabled { cursor: default; }\n\n        .shell {\n          width: 100%;\n          max-width: min(1100px, 100%);\n          margin: 0 auto;\n          padding: clamp(12px, 2cqi, 18px);\n          border: 2px solid var(--obex-navy);\n          border-radius: 28px;\n          background:\n            radial-gradient(circle at 88% 8%, rgba(230,0,0,0.10), transparent 25%),\n            radial-gradient(circle at 100% 100%, rgba(15,28,92,0.05), transparent 22%),\n            linear-gradient(180deg, var(--obex-white), #F8FAFF 58%, #F3F6FD 100%);\n          box-shadow: 0 14px 34px rgba(15, 28, 92, 0.09);\n          overflow: hidden;\n        }\n\n        .command {\n          display: grid;\n          grid-template-columns: minmax(0, 1.2fr) minmax(260px, 0.8fr);\n          gap: 12px;\n          align-items: stretch;\n          margin-bottom: 12px;\n        }\n\n        .headline {\n          min-width: 0;\n          padding: 8px 2px 4px;\n        }\n\n        .eyebrow {\n          display: inline-flex;\n          align-items: center;\n          gap: 8px;\n          padding: 7px 10px;\n          border: 1px solid var(--obex-line);\n          border-radius: 999px;\n          color: var(--obex-navy);\n          background: rgba(255, 255, 255, 0.74);\n          font-size: 0.72rem;\n          font-weight: 680;\n          letter-spacing: 0.075em;\n          text-transform: uppercase;\n          line-height: 1;\n          white-space: nowrap;\n        }\n\n        .dot {\n          width: 8px;\n          height: 8px;\n          border-radius: 999px;\n          background: var(--obex-red);\n          box-shadow: 0 0 0 4px rgba(230,0,0,0.10);\n          flex: 0 0 auto;\n        }\n\n        h1 {\n          margin: 9px 0 3px;\n          color: var(--obex-navy);\n          font-size: clamp(2rem, 4.5cqi, 3.1rem);\n          line-height: 0.94;\n          letter-spacing: -0.055em;\n          font-weight: 720;\n        }\n\n        .subtitle {\n          margin: 0;\n          max-width: 62ch;\n          color: var(--obex-muted);\n          font-size: 0.91rem;\n          line-height: 1.42;\n        }\n\n        .state-card {\n          min-width: 0;\n          padding: 12px;\n          border: 1.5px solid var(--obex-line-strong);\n          border-radius: 22px;\n          background:\n            linear-gradient(135deg, rgba(15,28,92,0.98), rgba(15,28,92,0.90)),\n            radial-gradient(circle at 100% 0%, rgba(230,0,0,0.16), transparent 28%);\n          color: var(--obex-white);\n          box-shadow: 0 10px 24px rgba(15,28,92,0.13);\n        }\n\n        .state-badge {\n          display: flex;\n          flex-wrap: wrap;\n          gap: 6px;\n          align-items: center;\n          margin-bottom: 9px;\n        }\n\n        .state-badge span {\n          display: inline-flex;\n          align-items: center;\n          min-height: 24px;\n          padding: 4px 8px;\n          border-radius: 999px;\n          background: rgba(255,255,255,0.12);\n          border: 1px solid rgba(255,255,255,0.18);\n          color: rgba(255,255,255,0.94);\n          font-size: 0.72rem;\n          font-weight: 650;\n          line-height: 1.05;\n        }\n\n        .briefing {\n          margin: 0;\n          font-size: 0.88rem;\n          line-height: 1.42;\n          color: rgba(255,255,255,0.88);\n        }\n\n        .controls {\n          display: grid;\n          grid-template-columns: 1.2fr 0.75fr 1fr;\n          gap: 10px;\n          margin-bottom: 12px;\n        }\n\n        .control-block {\n          padding: 10px;\n          border-radius: 20px;\n          border: 1px solid var(--obex-line);\n          background: rgba(255,255,255,0.78);\n          min-width: 0;\n        }\n\n        .control-label {\n          display: flex;\n          justify-content: space-between;\n          gap: 8px;\n          margin-bottom: 8px;\n          color: var(--obex-muted);\n          font-size: 0.71rem;\n          line-height: 1;\n          font-weight: 700;\n          letter-spacing: 0.07em;\n          text-transform: uppercase;\n        }\n\n        .control-label small {\n          color: rgba(88,96,127,0.78);\n          font-weight: 620;\n          letter-spacing: 0;\n          text-transform: none;\n        }\n\n        .button-group {\n          display: flex;\n          flex-wrap: wrap;\n          gap: 6px;\n        }\n\n        .chip {\n          border: 1px solid var(--obex-line);\n          border-radius: 999px;\n          background: var(--obex-white);\n          color: var(--obex-navy);\n          padding: 7px 9px;\n          min-height: 32px;\n          font-size: 0.76rem;\n          font-weight: 650;\n          line-height: 1.05;\n          transition: background .18s ease, color .18s ease, border-color .18s ease, transform .18s ease;\n        }\n\n        .chip:focus-visible,\n        .entity-row:focus-visible,\n        .node-button:focus-visible,\n        .tool-btn:focus-visible {\n          outline: 3px solid rgba(230,0,0,0.28);\n          outline-offset: 2px;\n        }\n\n        .chip:hover { transform: translateY(-1px); }\n        .chip[aria-pressed=\"true\"] {\n          color: var(--obex-white);\n          background: var(--obex-navy);\n          border-color: var(--obex-navy);\n          box-shadow: 0 8px 18px rgba(15,28,92,0.16);\n        }\n        .focus-group .chip[aria-pressed=\"true\"] {\n          background: var(--obex-red);\n          border-color: var(--obex-red);\n        }\n\n        .kpis {\n          display: grid;\n          grid-template-columns: repeat(4, minmax(0, 1fr));\n          gap: 10px;\n          margin-bottom: 12px;\n        }\n\n        .kpi-card {\n          min-width: 0;\n          padding: 12px;\n          border: 1.5px solid var(--obex-line);\n          border-radius: 20px;\n          background:\n            linear-gradient(180deg, rgba(255,255,255,0.94), rgba(255,255,255,0.80)),\n            radial-gradient(circle at 90% 0%, rgba(15,28,92,0.07), transparent 40%);\n        }\n\n        .kpi-label {\n          margin: 0 0 5px;\n          color: var(--obex-muted);\n          font-size: 0.68rem;\n          font-weight: 700;\n          letter-spacing: 0.08em;\n          text-transform: uppercase;\n          line-height: 1.1;\n        }\n\n        .kpi-value {\n          margin: 0;\n          color: var(--obex-navy);\n          font-size: clamp(1.35rem, 3.1cqi, 1.85rem);\n          line-height: 1;\n          font-weight: 720;\n          letter-spacing: -0.035em;\n        }\n\n        .kpi-copy {\n          margin: 7px 0 0;\n          color: var(--obex-muted);\n          font-size: 0.78rem;\n          line-height: 1.32;\n        }\n\n        .mini-meter {\n          width: 100%;\n          height: 7px;\n          margin-top: 9px;\n          border-radius: 999px;\n          background: var(--obex-soft-2);\n          overflow: hidden;\n          border: 1px solid rgba(15,28,92,0.08);\n        }\n\n        .mini-meter > span {\n          display: block;\n          height: 100%;\n          width: var(--meter, 0%);\n          background: linear-gradient(90deg, rgba(15,28,92,0.78), rgba(230,0,0,0.88));\n          border-radius: inherit;\n        }\n\n        .grid {\n          display: grid;\n          grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.95fr);\n          grid-template-areas:\n            \"network focus\"\n            \"country market\"\n            \"playbook playbook\"\n            \"monitor monitor\";\n          gap: 12px;\n        }\n\n        .card {\n          min-width: 0;\n          padding: 14px;\n          border: 1.5px solid var(--obex-line-strong);\n          border-radius: 22px;\n          background: rgba(255,255,255,0.92);\n          box-shadow: 0 10px 22px rgba(15,28,92,0.055);\n        }\n\n        .network-card { grid-area: network; }\n        .focus-card { grid-area: focus; }\n        .entity-card { grid-area: country; }\n        .market-card { grid-area: market; }\n        .playbook-card { grid-area: playbook; }\n        .monitor-card { grid-area: monitor; }\n\n        .card-head {\n          display: flex;\n          align-items: flex-start;\n          justify-content: space-between;\n          gap: 12px;\n          margin-bottom: 10px;\n        }\n\n        .card-title {\n          margin: 0;\n          color: var(--obex-navy);\n          font-size: 1.05rem;\n          line-height: 1.1;\n          letter-spacing: -0.025em;\n          font-weight: 720;\n        }\n\n        .card-subtitle {\n          margin: 4px 0 0;\n          color: var(--obex-muted);\n          font-size: 0.79rem;\n          line-height: 1.35;\n        }\n\n        .pill {\n          display: inline-flex;\n          align-items: center;\n          justify-content: center;\n          gap: 6px;\n          min-height: 24px;\n          padding: 4px 8px;\n          border-radius: 999px;\n          color: var(--obex-navy);\n          background: var(--obex-navy-soft);\n          border: 1px solid var(--obex-line);\n          font-size: 0.7rem;\n          font-weight: 700;\n          white-space: nowrap;\n        }\n\n        .pill.red {\n          color: var(--obex-red);\n          background: var(--obex-red-soft);\n          border-color: rgba(230,0,0,0.22);\n        }\n\n        .network-wrap {\n          position: relative;\n          min-height: 390px;\n          border-radius: 20px;\n          border: 1px solid var(--obex-line);\n          background:\n            radial-gradient(circle at 12% 10%, rgba(230,0,0,0.08), transparent 25%),\n            radial-gradient(circle at 82% 78%, rgba(15,28,92,0.07), transparent 28%),\n            linear-gradient(180deg, #FFFFFF, #F6F8FE);\n          overflow: hidden;\n        }\n\n        .network-svg {\n          position: absolute;\n          inset: 0;\n          width: 100%;\n          height: 100%;\n          z-index: 1;\n        }\n\n        .net-link {\n          fill: none;\n          stroke: rgba(15,28,92,0.22);\n          stroke-width: 2;\n          stroke-linecap: round;\n          transition: stroke .2s ease, stroke-width .2s ease, opacity .2s ease;\n        }\n\n        .net-link.hot {\n          stroke: rgba(230,0,0,0.78);\n          opacity: 1;\n        }\n\n        .net-link.dim {\n          opacity: 0.28;\n        }\n\n        .node-button,\n        .node-static {\n          --node-alpha: 0.12;\n          position: absolute;\n          z-index: 2;\n          display: inline-flex;\n          flex-direction: column;\n          align-items: center;\n          justify-content: center;\n          gap: 2px;\n          width: 108px;\n          min-height: 56px;\n          padding: 8px;\n          border-radius: 20px;\n          border: 1.6px solid var(--obex-line-strong);\n          background:\n            radial-gradient(circle at 50% 36%, rgba(15,28,92,var(--node-alpha)), rgba(255,255,255,0.92) 58%),\n            #fff;\n          color: var(--obex-navy);\n          text-align: center;\n          font-size: 0.76rem;\n          line-height: 1.05;\n          font-weight: 720;\n          box-shadow: 0 10px 18px rgba(15,28,92,0.07);\n          transform: translate(-50%, -50%);\n          transition: border-color .2s ease, box-shadow .2s ease, color .2s ease, background .2s ease;\n        }\n\n        .node-button small,\n        .node-static small {\n          color: var(--obex-muted);\n          font-size: 0.64rem;\n          font-weight: 650;\n        }\n\n        .node-button.hot {\n          border-color: rgba(15,28,92,0.34);\n        }\n\n        .node-button.active {\n          color: var(--obex-red);\n          border-color: rgba(230,0,0,0.62);\n          background:\n            radial-gradient(circle at 50% 35%, rgba(230,0,0,var(--node-alpha)), rgba(255,255,255,0.94) 62%),\n            #fff;\n          box-shadow: 0 12px 26px rgba(230,0,0,0.14);\n        }\n\n        .node-button.dominant::after {\n          content: \"\";\n          position: absolute;\n          top: -5px;\n          right: -5px;\n          width: 13px;\n          height: 13px;\n          border-radius: 999px;\n          border: 2px solid var(--obex-white);\n          background: var(--obex-red);\n          box-shadow: 0 0 0 4px rgba(230,0,0,0.08);\n        }\n\n        .node-button[disabled],\n        .node-static {\n          cursor: default;\n          color: rgba(15,28,92,0.84);\n          background:\n            radial-gradient(circle at 50% 36%, rgba(15,28,92,0.10), rgba(255,255,255,0.88) 62%),\n            #fff;\n        }\n\n        .n-source { left: 12.5%; top: 21%; }\n        .n-transit { left: 36%; top: 20%; }\n        .n-lng { left: 59%; top: 18%; }\n        .n-fertilizer { left: 27%; top: 48%; }\n        .n-transition { left: 78%; top: 39%; }\n        .n-hardware { left: 52%; top: 55%; }\n        .n-filter { left: 66%; top: 69%; }\n        .n-fiscal { left: 36%; top: 82%; }\n        .n-nuclear { left: 72%; top: 82%; }\n        .n-impact { left: 90%; top: 72%; width: 96px; min-height: 52px; }\n        .n-policy { left: 74%; top: 93%; width: 104px; min-height: 48px; }\n\n        .focus-body {\n          display: grid;\n          gap: 10px;\n        }\n\n        .detail-lead {\n          margin: 0;\n          color: var(--obex-ink);\n          font-size: 0.91rem;\n          line-height: 1.45;\n        }\n\n        .detail-grid {\n          display: grid;\n          grid-template-columns: repeat(2, minmax(0, 1fr));\n          gap: 8px;\n        }\n\n        .detail-tile {\n          min-width: 0;\n          padding: 10px;\n          border-radius: 16px;\n          border: 1px solid var(--obex-line);\n          background: linear-gradient(180deg, rgba(244,246,251,0.88), rgba(255,255,255,0.82));\n        }\n\n        .tile-label {\n          margin: 0 0 5px;\n          color: var(--obex-muted);\n          font-size: 0.68rem;\n          line-height: 1;\n          font-weight: 700;\n          letter-spacing: 0.07em;\n          text-transform: uppercase;\n        }\n\n        .tile-value {\n          margin: 0;\n          color: var(--obex-navy);\n          font-size: 0.88rem;\n          line-height: 1.32;\n          font-weight: 680;\n        }\n\n        .tile-copy {\n          margin: 5px 0 0;\n          color: var(--obex-muted);\n          font-size: 0.76rem;\n          line-height: 1.35;\n        }\n\n        .entity-list {\n          display: grid;\n          gap: 7px;\n        }\n\n        .entity-row {\n          width: 100%;\n          display: grid;\n          grid-template-columns: minmax(84px, 0.7fr) minmax(0, 1.3fr) auto;\n          gap: 10px;\n          align-items: center;\n          padding: 9px;\n          border-radius: 16px;\n          border: 1px solid var(--obex-line);\n          background: rgba(255,255,255,0.76);\n          color: var(--obex-ink);\n          text-align: left;\n          transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease, background .18s ease;\n        }\n\n        .entity-row:hover {\n          transform: translateY(-1px);\n          box-shadow: 0 8px 18px rgba(15,28,92,0.07);\n        }\n\n        .entity-row[aria-pressed=\"true\"] {\n          border-color: rgba(230,0,0,0.48);\n          background: linear-gradient(90deg, rgba(230,0,0,0.06), rgba(255,255,255,0.88));\n        }\n\n        .entity-name {\n          font-size: 0.86rem;\n          line-height: 1.1;\n          font-weight: 720;\n          color: var(--obex-navy);\n        }\n\n        .entity-beta {\n          display: block;\n          margin-top: 3px;\n          font-size: 0.68rem;\n          line-height: 1.18;\n          font-weight: 650;\n          color: var(--obex-muted);\n        }\n\n        .bar-stack {\n          min-width: 0;\n        }\n\n        .bar-copy {\n          display: flex;\n          justify-content: space-between;\n          gap: 8px;\n          margin-bottom: 4px;\n          color: var(--obex-muted);\n          font-size: 0.68rem;\n          line-height: 1.1;\n          font-weight: 650;\n        }\n\n        .bar-copy span {\n          min-width: 0;\n          overflow: hidden;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n\n        .bar-track {\n          height: 8px;\n          border-radius: 999px;\n          background: var(--obex-soft-2);\n          overflow: hidden;\n          border: 1px solid rgba(15,28,92,0.08);\n        }\n\n        .bar-fill {\n          height: 100%;\n          width: var(--w, 0%);\n          border-radius: inherit;\n          background: rgba(15,28,92,0.80);\n        }\n\n        .bar-fill.risk { background: rgba(230,0,0,0.78); }\n        .bar-fill.neutral { background: rgba(88,96,127,0.78); }\n\n        .score-pill {\n          min-width: 56px;\n          text-align: center;\n          padding: 5px 8px;\n          border-radius: 999px;\n          color: var(--obex-navy);\n          background: var(--obex-navy-soft);\n          border: 1px solid var(--obex-line);\n          font-size: 0.78rem;\n          line-height: 1;\n          font-weight: 720;\n        }\n\n        .score-pill.risk {\n          color: var(--obex-red);\n          background: var(--obex-red-soft);\n          border-color: rgba(230,0,0,0.20);\n        }\n\n        .market-list {\n          display: grid;\n          gap: 8px;\n        }\n\n        .market-row {\n          display: grid;\n          grid-template-columns: minmax(0, 1fr) auto;\n          gap: 8px;\n          align-items: start;\n          padding: 10px;\n          border: 1px solid var(--obex-line);\n          border-radius: 16px;\n          background: linear-gradient(180deg, #fff, rgba(244,246,251,0.62));\n        }\n\n        .market-row h4 {\n          margin: 0 0 4px;\n          color: var(--obex-navy);\n          font-size: 0.86rem;\n          line-height: 1.2;\n          font-weight: 720;\n        }\n\n        .market-row p {\n          margin: 0;\n          color: var(--obex-muted);\n          font-size: 0.75rem;\n          line-height: 1.34;\n        }\n\n        .range-pill {\n          justify-self: end;\n          display: inline-flex;\n          align-items: center;\n          justify-content: center;\n          min-height: 25px;\n          max-width: min(240px, 100%);\n          padding: 5px 8px;\n          border-radius: 999px;\n          color: var(--obex-white);\n          background: var(--obex-navy);\n          font-size: 0.72rem;\n          line-height: 1.15;\n          font-weight: 720;\n          text-align: center;\n          white-space: normal;\n        }\n\n        .playbook-grid {\n          display: grid;\n          grid-template-columns: repeat(4, minmax(0, 1fr));\n          gap: 9px;\n        }\n\n        .action-card {\n          min-width: 0;\n          padding: 11px;\n          border: 1px solid var(--obex-line);\n          border-radius: 18px;\n          background: linear-gradient(180deg, rgba(255,255,255,0.96), rgba(244,246,251,0.70));\n        }\n\n        .step-dot {\n          display: inline-flex;\n          align-items: center;\n          justify-content: center;\n          width: 24px;\n          height: 24px;\n          margin-bottom: 8px;\n          border-radius: 999px;\n          color: #fff;\n          background: var(--obex-red);\n          font-size: 0.72rem;\n          font-weight: 720;\n        }\n\n        .action-card h4 {\n          margin: 0 0 5px;\n          color: var(--obex-navy);\n          font-size: 0.89rem;\n          line-height: 1.18;\n          font-weight: 720;\n        }\n\n        .action-card p {\n          margin: 0;\n          color: var(--obex-muted);\n          font-size: 0.76rem;\n          line-height: 1.35;\n        }\n\n        .monitor-grid {\n          display: grid;\n          grid-template-columns: repeat(3, minmax(0, 1fr));\n          gap: 9px;\n        }\n\n        .signal-card {\n          padding: 10px;\n          border: 1px solid var(--obex-line);\n          border-radius: 17px;\n          background: rgba(255,255,255,0.78);\n        }\n\n        .signal-top {\n          display: flex;\n          align-items: flex-start;\n          justify-content: space-between;\n          gap: 8px;\n          margin-bottom: 5px;\n        }\n\n        .signal-card h4 {\n          margin: 0;\n          color: var(--obex-navy);\n          font-size: 0.84rem;\n          line-height: 1.14;\n          font-weight: 720;\n        }\n\n        .status {\n          display: inline-flex;\n          min-height: 22px;\n          align-items: center;\n          padding: 4px 7px;\n          border-radius: 999px;\n          border: 1px solid var(--obex-line);\n          background: var(--obex-soft);\n          color: var(--obex-muted);\n          font-size: 0.66rem;\n          font-weight: 720;\n          white-space: nowrap;\n        }\n\n        .status.hot {\n          color: var(--obex-red);\n          background: var(--obex-red-soft);\n          border-color: rgba(230,0,0,0.22);\n        }\n\n        .status.watch {\n          color: var(--obex-navy);\n          background: var(--obex-navy-soft);\n        }\n\n        .signal-card p {\n          min-height: 32px;\n          margin: 0 0 8px;\n          color: var(--obex-muted);\n          font-size: 0.73rem;\n          line-height: 1.32;\n        }\n\n        .signal-meter {\n          height: 7px;\n          border-radius: 999px;\n          background: var(--obex-soft-2);\n          border: 1px solid rgba(15,28,92,0.08);\n          overflow: hidden;\n        }\n\n        .signal-meter > span {\n          display: block;\n          height: 100%;\n          width: var(--meter, 0%);\n          border-radius: inherit;\n          background: rgba(15,28,92,0.75);\n        }\n\n        .signal-meter > span.hot { background: rgba(230,0,0,0.78); }\n\n        .footer-actions {\n          display: flex;\n          flex-wrap: wrap;\n          align-items: center;\n          justify-content: space-between;\n          gap: 10px;\n          margin-top: 12px;\n          padding-top: 10px;\n          border-top: 1px solid var(--obex-line);\n        }\n\n        .tool-group {\n          display: flex;\n          flex-wrap: wrap;\n          gap: 8px;\n        }\n\n        .tool-btn {\n          min-height: 32px;\n          padding: 7px 11px;\n          border: 1px solid var(--obex-line-strong);\n          border-radius: 999px;\n          background: var(--obex-white);\n          color: var(--obex-navy);\n          font-size: 0.76rem;\n          line-height: 1;\n          font-weight: 720;\n        }\n\n        .tool-btn.primary {\n          background: var(--obex-navy);\n          color: #fff;\n          border-color: var(--obex-navy);\n        }\n\n        .footer-note {\n          margin: 0;\n          color: var(--obex-muted);\n          font-size: 0.75rem;\n          line-height: 1.3;\n        }\n\n        @container (max-width: 960px) {\n          .command {\n            grid-template-columns: 1fr;\n          }\n          .controls {\n            grid-template-columns: 1fr 1fr;\n          }\n          .controls .control-block:first-child {\n            grid-column: 1 \/ -1;\n          }\n          .grid {\n            grid-template-columns: 1fr;\n            grid-template-areas:\n              \"network\"\n              \"focus\"\n              \"country\"\n              \"market\"\n              \"playbook\"\n              \"monitor\";\n          }\n          .playbook-grid {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n          }\n        }\n\n        @container (max-width: 760px) {\n          .shell {\n            border-radius: 22px;\n          }\n          .controls,\n          .kpis {\n            grid-template-columns: 1fr;\n          }\n          .detail-grid,\n          .monitor-grid {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n          }\n          .network-wrap {\n            min-height: 360px;\n          }\n          .node-button,\n          .node-static {\n            width: 96px;\n            min-height: 52px;\n            font-size: 0.70rem;\n          }\n          .n-impact { width: 88px; }\n          .n-policy { width: 96px; }\n        }\n\n        @container (max-width: 560px) {\n          h1 {\n            font-size: clamp(1.85rem, 12cqi, 2.35rem);\n          }\n          .card,\n          .kpi-card,\n          .control-block {\n            border-radius: 18px;\n            padding: 10px;\n          }\n          .detail-grid,\n          .monitor-grid,\n          .playbook-grid {\n            grid-template-columns: 1fr;\n          }\n          .entity-row {\n            grid-template-columns: 1fr;\n          }\n          .score-pill {\n            justify-self: start;\n          }\n          .market-row {\n            grid-template-columns: 1fr;\n          }\n          .range-pill {\n            justify-self: start;\n          }\n          .network-wrap {\n            min-height: 430px;\n          }\n          .node-button,\n          .node-static {\n            width: 90px;\n            min-height: 48px;\n            border-radius: 16px;\n          }\n          .n-source { left: 18%; top: 14%; }\n          .n-transit { left: 50%; top: 14%; }\n          .n-lng { left: 82%; top: 14%; }\n          .n-fertilizer { left: 26%; top: 36%; }\n          .n-transition { left: 76%; top: 36%; }\n          .n-hardware { left: 50%; top: 50%; }\n          .n-filter { left: 50%; top: 65%; }\n          .n-fiscal { left: 25%; top: 80%; }\n          .n-nuclear { left: 75%; top: 80%; }\n          .n-impact { left: 50%; top: 92%; }\n          .n-policy { display: none; }\n          .network-svg { opacity: 0.8; }\n          .footer-actions {\n            align-items: flex-start;\n            flex-direction: column;\n          }\n        }\n      <\/style>\n\n      <section class=\"shell\" role=\"region\" aria-label=\"OBEX Hormuz Energy Shift connected dashboard\">\n        <header class=\"command\" aria-label=\"Command header\">\n          <div class=\"headline\">\n            <div class=\"eyebrow\"><span class=\"dot\" aria-hidden=\"true\"><\/span><span id=\"eyebrow\"><\/span><\/div>\n            <h1 id=\"title\"><\/h1>\n            <p class=\"subtitle\" id=\"subtitle\"><\/p>\n          <\/div>\n          <div class=\"state-card\" aria-live=\"polite\">\n            <div class=\"state-badge\" id=\"stateBadge\"><\/div>\n            <p class=\"briefing\" id=\"briefing\"><\/p>\n          <\/div>\n        <\/header>\n\n        <section class=\"controls\" aria-label=\"Global dashboard controls\">\n          <div class=\"control-block\">\n            <div class=\"control-label\"><span>Scenario<\/span><small>Shock \/ transition regime<\/small><\/div>\n            <div class=\"button-group\" id=\"scenarioControls\"><\/div>\n          <\/div>\n          <div class=\"control-block\">\n            <div class=\"control-label\"><span>Country<\/span><small>Entity selector<\/small><\/div>\n            <div class=\"button-group\" id=\"entityControls\"><\/div>\n          <\/div>\n          <div class=\"control-block\">\n            <div class=\"control-label\"><span>Focus lens<\/span><small>Transmission channel<\/small><\/div>\n            <div class=\"button-group focus-group\" id=\"focusControls\"><\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"kpis\" aria-label=\"Key performance indicators\">\n          <article class=\"kpi-card\">\n            <p class=\"kpi-label\">Stress regime<\/p>\n            <p class=\"kpi-value\" id=\"kpiStress\"><\/p>\n            <p class=\"kpi-copy\" id=\"kpiStressCopy\"><\/p>\n            <div class=\"mini-meter\" aria-hidden=\"true\"><span id=\"kpiStressMeter\"><\/span><\/div>\n          <\/article>\n          <article class=\"kpi-card\">\n            <p class=\"kpi-label\">Selected primary impact<\/p>\n            <p class=\"kpi-value\" id=\"kpiImpact\"><\/p>\n            <p class=\"kpi-copy\" id=\"kpiImpactCopy\"><\/p>\n          <\/article>\n          <article class=\"kpi-card\">\n            <p class=\"kpi-label\">Selected secondary impact<\/p>\n            <p class=\"kpi-value\" id=\"kpiBuffer\"><\/p>\n            <p class=\"kpi-copy\" id=\"kpiBufferCopy\"><\/p>\n          <\/article>\n          <article class=\"kpi-card\">\n            <p class=\"kpi-label\">Transmission bias<\/p>\n            <p class=\"kpi-value\" id=\"kpiBias\"><\/p>\n            <p class=\"kpi-copy\" id=\"kpiBiasCopy\"><\/p>\n          <\/article>\n        <\/section>\n\n        <main class=\"grid\">\n          <section class=\"card network-card\" aria-label=\"Transmission web\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\">Transmission web<\/h2>\n                <p class=\"card-subtitle\">Connected shock pathway. Click a live node to switch the focus lens.<\/p>\n              <\/div>\n              <span class=\"pill red\" id=\"networkScore\"><\/span>\n            <\/div>\n            <div class=\"network-wrap\" aria-label=\"Interactive transmission network\">\n              <svg class=\"network-svg\" viewBox=\"0 0 640 390\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n                <path class=\"net-link\" data-link=\"source-transit\" d=\"M82 82 C132 46, 174 58, 230 80\"><\/path>\n                <path class=\"net-link\" data-link=\"source-lng\" d=\"M82 82 C175 20, 260 30, 378 72\"><\/path>\n                <path class=\"net-link\" data-link=\"source-fertilizer\" d=\"M82 82 C88 148, 110 184, 170 188\"><\/path>\n                <path class=\"net-link\" data-link=\"lng-fertilizer\" d=\"M378 72 C312 108, 270 146, 170 188\"><\/path>\n                <path class=\"net-link\" data-link=\"transit-filter\" d=\"M230 80 C286 138, 334 200, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"lng-filter\" d=\"M378 72 C406 130, 420 188, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"fertilizer-filter\" d=\"M170 188 C240 216, 322 238, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"hardware-transition\" d=\"M332 220 C380 176, 442 150, 500 150\"><\/path>\n                <path class=\"net-link\" data-link=\"transition-hardware\" d=\"M500 150 C446 184, 398 210, 332 220\"><\/path>\n                <path class=\"net-link\" data-link=\"transition-filter\" d=\"M500 150 C490 205, 462 238, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"hardware-filter\" d=\"M332 220 C362 246, 385 260, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"transit-fiscal\" d=\"M230 80 C236 178, 232 250, 230 320\"><\/path>\n                <path class=\"net-link\" data-link=\"fertilizer-fiscal\" d=\"M170 188 C178 250, 196 292, 230 320\"><\/path>\n                <path class=\"net-link\" data-link=\"nuclear-filter\" d=\"M460 315 C440 306, 430 288, 420 268\"><\/path>\n                <path class=\"net-link\" data-link=\"transition-nuclear\" d=\"M500 150 C526 220, 516 280, 460 315\"><\/path>\n                <path class=\"net-link\" data-link=\"filter-impact\" d=\"M420 268 C470 260, 520 266, 570 285\"><\/path>\n                <path class=\"net-link\" data-link=\"nuclear-impact\" d=\"M460 315 C500 326, 544 316, 570 285\"><\/path>\n                <path class=\"net-link\" data-link=\"filter-policy\" d=\"M420 268 C430 318, 448 340, 470 355\"><\/path>\n              <\/svg>\n\n              <button type=\"button\" class=\"node-button n-source\" disabled aria-label=\"Source signal node\">Hormuz<small>signal<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-transit\" data-focus=\"transit\" aria-label=\"Select Hormuz transit focus\">Transit<small>oil \/ freight<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-lng\" data-focus=\"lng\" aria-label=\"Select LNG and gas balance focus\">LNG<small>gas balance<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-fertilizer\" data-focus=\"fertilizer\" aria-label=\"Select fertilizer and food input focus\">Fertilizer<small>food inputs<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-transition\" data-focus=\"transition\" aria-label=\"Select clean buildout focus\">Clean<small>buildout<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-hardware\" data-focus=\"hardware\" aria-label=\"Select China hardware leverage focus\">Hardware<small>China stack<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-fiscal\" data-focus=\"fiscal\" aria-label=\"Select fiscal transition focus\">Fiscal<small>macro<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-nuclear\" data-focus=\"nuclear\" aria-label=\"Select nuclear and firm power focus\">Nuclear<small>firm power<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-filter\" disabled aria-label=\"Domestic filters node\">Filters<small>buffers \/ policy<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-impact\" disabled aria-label=\"Country impact node\">Impact<small>score<\/small><\/button>\n              <button type=\"button\" class=\"node-button n-policy\" disabled aria-label=\"Response playbook node\">Response<small>playbook<\/small><\/button>\n            <\/div>\n          <\/section>\n\n          <section class=\"card focus-card\" aria-label=\"Selected focus detail panel\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\" id=\"focusTitle\"><\/h2>\n                <p class=\"card-subtitle\" id=\"focusSubtitle\"><\/p>\n              <\/div>\n              <span class=\"pill\" id=\"focusScore\"><\/span>\n            <\/div>\n            <div class=\"focus-body\">\n              <p class=\"detail-lead\" id=\"focusBody\"><\/p>\n              <div class=\"detail-grid\" id=\"detailGrid\"><\/div>\n            <\/div>\n          <\/section>\n\n          <section class=\"card entity-card\" aria-label=\"Country comparison panel\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\">Country comparison<\/h2>\n                <p class=\"card-subtitle\">Impact score by selected scenario. Click a row to set the country.<\/p>\n              <\/div>\n              <span class=\"pill\" id=\"entityCount\"><\/span>\n            <\/div>\n            <div class=\"entity-list\" id=\"entityList\"><\/div>\n          <\/section>\n\n          <section class=\"card market-card\" aria-label=\"Market and benchmark panel\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\">Market \/ benchmark panel<\/h2>\n                <p class=\"card-subtitle\" id=\"marketSubtitle\"><\/p>\n              <\/div>\n              <span class=\"pill red\" id=\"rangePill\"><\/span>\n            <\/div>\n            <div class=\"market-list\" id=\"marketRows\"><\/div>\n          <\/section>\n\n          <section class=\"card playbook-card\" aria-label=\"Response playbook panel\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\">Response playbook<\/h2>\n                <p class=\"card-subtitle\" id=\"playbookSubtitle\"><\/p>\n              <\/div>\n              <span class=\"pill\" id=\"policyPriority\"><\/span>\n            <\/div>\n            <div class=\"playbook-grid\" id=\"playbookGrid\"><\/div>\n          <\/section>\n\n          <section class=\"card monitor-card\" aria-label=\"Monitoring dashboard panel\">\n            <div class=\"card-head\">\n              <div>\n                <h2 class=\"card-title\">Monitoring dashboard<\/h2>\n                <p class=\"card-subtitle\">Signal meters recalculate from scenario stress, country exposure and selected lens.<\/p>\n              <\/div>\n              <span class=\"pill\" id=\"monitorPill\"><\/span>\n            <\/div>\n            <div class=\"monitor-grid\" id=\"monitorGrid\"><\/div>\n          <\/section>\n        <\/main>\n\n        <footer class=\"footer-actions\">\n          <div class=\"tool-group\">\n            <button type=\"button\" class=\"tool-btn primary\" id=\"copyBtn\">Copy current briefing<\/button>\n            <button type=\"button\" class=\"tool-btn\" id=\"csvBtn\">Download current CSV<\/button>\n          <\/div>\n          <p class=\"footer-note\" id=\"footerNote\"><\/p>\n        <\/footer>\n      <\/section>\n    `;\n\n    class ObexLinkedDashboard extends HTMLElement {\n      constructor() {\n        super();\n        this.state = {\n          scenario: DATA.dashboard.defaultScenario || Object.keys(DATA.scenarios)[0],\n          entity: DATA.dashboard.defaultEntity || Object.keys(DATA.entities)[0],\n          focus: DATA.dashboard.defaultFocus || Object.keys(DATA.channels)[0]\n        };\n        this.lastBriefing = \"\";\n      }\n\n      connectedCallback() {\n        if (!this.shadowRoot) {\n          this.attachShadow({ mode: \"open\" });\n          this.shadowRoot.appendChild(template.content.cloneNode(true));\n        }\n        this.cache();\n        this.buildControls();\n        this.bind();\n        this.render();\n      }\n\n      cache() {\n        const s = this.shadowRoot;\n        this.refs = {\n          eyebrow: s.querySelector(\"#eyebrow\"),\n          title: s.querySelector(\"#title\"),\n          subtitle: s.querySelector(\"#subtitle\"),\n          stateBadge: s.querySelector(\"#stateBadge\"),\n          briefing: s.querySelector(\"#briefing\"),\n          scenarioControls: s.querySelector(\"#scenarioControls\"),\n          entityControls: s.querySelector(\"#entityControls\"),\n          focusControls: s.querySelector(\"#focusControls\"),\n          kpiStress: s.querySelector(\"#kpiStress\"),\n          kpiStressCopy: s.querySelector(\"#kpiStressCopy\"),\n          kpiStressMeter: s.querySelector(\"#kpiStressMeter\"),\n          kpiImpact: s.querySelector(\"#kpiImpact\"),\n          kpiImpactCopy: s.querySelector(\"#kpiImpactCopy\"),\n          kpiBuffer: s.querySelector(\"#kpiBuffer\"),\n          kpiBufferCopy: s.querySelector(\"#kpiBufferCopy\"),\n          kpiBias: s.querySelector(\"#kpiBias\"),\n          kpiBiasCopy: s.querySelector(\"#kpiBiasCopy\"),\n          networkScore: s.querySelector(\"#networkScore\"),\n          focusTitle: s.querySelector(\"#focusTitle\"),\n          focusSubtitle: s.querySelector(\"#focusSubtitle\"),\n          focusScore: s.querySelector(\"#focusScore\"),\n          focusBody: s.querySelector(\"#focusBody\"),\n          detailGrid: s.querySelector(\"#detailGrid\"),\n          entityCount: s.querySelector(\"#entityCount\"),\n          entityList: s.querySelector(\"#entityList\"),\n          marketSubtitle: s.querySelector(\"#marketSubtitle\"),\n          rangePill: s.querySelector(\"#rangePill\"),\n          marketRows: s.querySelector(\"#marketRows\"),\n          playbookSubtitle: s.querySelector(\"#playbookSubtitle\"),\n          policyPriority: s.querySelector(\"#policyPriority\"),\n          playbookGrid: s.querySelector(\"#playbookGrid\"),\n          monitorPill: s.querySelector(\"#monitorPill\"),\n          monitorGrid: s.querySelector(\"#monitorGrid\"),\n          copyBtn: s.querySelector(\"#copyBtn\"),\n          csvBtn: s.querySelector(\"#csvBtn\"),\n          footerNote: s.querySelector(\"#footerNote\"),\n          nodeButtons: [...s.querySelectorAll(\".node-button[data-focus]\")],\n          links: [...s.querySelectorAll(\".net-link\")]\n        };\n      }\n\n      buildControls() {\n        const scenarioEntries = Object.entries(DATA.scenarios).map(([key, item]) => ({\n          key,\n          label: `${key} \u00b7 ${item.shortLabel}`,\n          title: item.label\n        }));\n        const entityEntries = Object.entries(DATA.entities).map(([key, item]) => ({\n          key,\n          label: item.label,\n          title: item.type\n        }));\n        const focusEntries = Object.entries(DATA.channels).map(([key, item]) => ({\n          key,\n          label: item.label,\n          title: item.layer\n        }));\n\n        this.fillButtonGroup(this.refs.scenarioControls, scenarioEntries, \"scenario\");\n        this.fillButtonGroup(this.refs.entityControls, entityEntries, \"entity\");\n        this.fillButtonGroup(this.refs.focusControls, focusEntries, \"focus\");\n      }\n\n      fillButtonGroup(container, entries, controlName) {\n        container.innerHTML = entries.map(item => {\n          const pressed = this.state[controlName] === item.key ? \"true\" : \"false\";\n          return `<button type=\"button\" class=\"chip\" data-control=\"${controlName}\" data-key=\"${this.escape(item.key)}\" aria-pressed=\"${pressed}\" title=\"${this.escape(item.title || item.label)}\">${this.escape(item.label)}<\/button>`;\n        }).join(\"\");\n      }\n\n      bind() {\n        this.shadowRoot.addEventListener(\"click\", event => {\n          const control = event.target.closest(\"[data-control]\");\n          if (control) {\n            const prop = control.dataset.control;\n            const key = control.dataset.key;\n            if (this.state[prop] !== key) {\n              this.state[prop] = key;\n              this.render();\n            }\n            return;\n          }\n\n          const row = event.target.closest(\"[data-entity-row]\");\n          if (row) {\n            const key = row.dataset.entityRow;\n            if (this.state.entity !== key) {\n              this.state.entity = key;\n              this.render();\n            }\n            return;\n          }\n\n          const node = event.target.closest(\".node-button[data-focus]\");\n          if (node) {\n            const key = node.dataset.focus;\n            if (this.state.focus !== key) {\n              this.state.focus = key;\n              this.render();\n            }\n          }\n        });\n\n        this.refs.nodeButtons.forEach(button => {\n          button.addEventListener(\"keydown\", event => {\n            if (event.key === \"Enter\" || event.key === \" \") {\n              event.preventDefault();\n              button.click();\n            }\n          });\n        });\n\n        this.refs.copyBtn.addEventListener(\"click\", () => this.copyBriefing());\n        this.refs.csvBtn.addEventListener(\"click\", () => this.downloadCsv());\n      }\n\n      setText(el, value) {\n        if (el) el.textContent = value == null ? \"\" : String(value);\n      }\n\n      setHtml(el, value) {\n        if (el) el.innerHTML = value == null ? \"\" : String(value);\n      }\n\n      scenarioData(key = this.state.scenario) {\n        return DATA.scenarios[key] || DATA.scenarios[Object.keys(DATA.scenarios)[0]];\n      }\n\n      entityData(key = this.state.entity) {\n        return DATA.entities[key] || DATA.entities[Object.keys(DATA.entities)[0]];\n      }\n\n      focusData(key = this.state.focus) {\n        return DATA.channels[key] || DATA.channels[Object.keys(DATA.channels)[0]];\n      }\n\n      selectedPrimaryRange() {\n        const impact = this.selectedImpact();\n        return this.formatScore(impact.score);\n      }\n\n      selectedSecondaryRange() {\n        const entity = this.entityData();\n        return `${this.num(entity.resilienceScore, 2)} \/ 5`;\n      }\n\n      selectedImpact(entityKey = this.state.entity, scenarioKey = this.state.scenario) {\n        const entity = this.entityData(entityKey);\n        return entity.scenarios[scenarioKey] || { score: 0, summary: \"No scenario summary available.\", direction: \"Mixed\" };\n      }\n\n      channelWeightedScore(channelKey, entityKey = this.state.entity, scenarioKey = this.state.scenario) {\n        const channel = DATA.channels[channelKey];\n        const entity = this.entityData(entityKey);\n        const scenario = this.scenarioData(scenarioKey);\n        if (!channel || !entity || !scenario) return 0;\n\n        const intensity = Number(channel.intensity[scenarioKey] || 0);\n        const weight = Number(entity.weights[channelKey] || 0.55);\n        const impact = Math.abs(Number(this.selectedImpact(entityKey, scenarioKey).score || 0));\n        const resilience = Number(entity.resilienceScore || 2.5);\n        const impactMultiplier = 1 + impact * 0.055;\n        const resilienceModifier = 1 - ((resilience - 2.5) * 0.025);\n        const value = intensity * weight * impactMultiplier * resilienceModifier + scenario.stress * 0.05;\n        return Math.max(0, Math.min(100, Math.round(value)));\n      }\n\n      dominantChannel(entityKey = this.state.entity, scenarioKey = this.state.scenario) {\n        const entries = Object.keys(DATA.channels).map(key => ({\n          key,\n          score: this.channelWeightedScore(key, entityKey, scenarioKey),\n          label: DATA.channels[key].label\n        }));\n        entries.sort((a, b) => b.score - a.score);\n        return entries[0];\n      }\n\n      buildBriefing() {\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const focus = this.focusData();\n        const impact = this.selectedImpact();\n        const dominant = this.dominantChannel();\n        const mood = this.moodLabel(scenario.stress);\n        const direction = impact.direction || this.scoreDirection(impact.score);\n        const score = this.formatScore(impact.score);\n\n        this.lastBriefing = `${scenario.shortLabel} for ${entity.label}: ${focus.label} is the active lens. Country impact is ${score} (${direction}), resilience buffer is ${this.num(entity.resilienceScore, 2)}\/5, and the dominant transmission lane is ${dominant.label} at ${dominant.score}\/100. ${impact.summary}`;\n        return this.lastBriefing;\n      }\n\n      stateBadgeHtml() {\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const focus = this.focusData();\n        const dominant = this.dominantChannel();\n        return [\n          `<span>${this.escape(this.state.scenario)} \u00b7 ${this.escape(scenario.shortLabel)}<\/span>`,\n          `<span>${this.escape(this.moodLabel(scenario.stress))}<\/span>`,\n          `<span>${this.escape(entity.label)}<\/span>`,\n          `<span>${this.escape(focus.label)}<\/span>`,\n          `<span>Dominant: ${this.escape(dominant.label)}<\/span>`\n        ].join(\"\");\n      }\n\n      buildEntityList() {\n        const scenarioKey = this.state.scenario;\n        const scores = Object.keys(DATA.entities).map(key => Math.abs(Number(this.selectedImpact(key, scenarioKey).score || 0)));\n        const max = Math.max(1, ...scores);\n\n        return Object.entries(DATA.entities).map(([key, entity]) => {\n          const impact = this.selectedImpact(key, scenarioKey);\n          const score = Number(impact.score || 0);\n          const width = Math.max(4, Math.round((Math.abs(score) \/ max) * 100));\n          const scoreClass = score < 0 ? \"risk\" : score === 0 ? \"neutral\" : \"\";\n          const active = key === this.state.entity ? \"true\" : \"false\";\n          const direction = impact.direction || this.scoreDirection(score);\n          return `\n            <button type=\"button\" class=\"entity-row\" data-entity-row=\"${this.escape(key)}\" aria-pressed=\"${active}\">\n              <span>\n                <span class=\"entity-name\">${this.escape(entity.label)}<\/span>\n                <span class=\"entity-beta\">${this.escape(entity.beta)} \u00b7 ${this.escape(entity.buffers)}<\/span>\n              <\/span>\n              <span class=\"bar-stack\">\n                <span class=\"bar-copy\"><span>${this.escape(direction)}<\/span><span>${this.escape(entity.fuelExposure)}<\/span><\/span>\n                <span class=\"bar-track\" aria-hidden=\"true\"><span class=\"bar-fill ${scoreClass}\" style=\"--w: ${width}%\"><\/span><\/span>\n              <\/span>\n              <span class=\"score-pill ${scoreClass}\">${this.escape(this.scoreValue(score))}<\/span>\n            <\/button>\n          `;\n        }).join(\"\");\n      }\n\n      buildMarketRows() {\n        const focus = this.focusData();\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const signal = this.channelWeightedScore(this.state.focus);\n        const status = this.signalStatus(signal);\n        const rows = [...(focus.marketRows || [])];\n\n        if (this.state.focus === \"transition\") {\n          rows.push({\n            name: `${entity.label} clean-power target`,\n            type: \"entity\",\n            value: `${entity.cleanCurrent ?? \"n\/a\"}% \u2192 ${entity.cleanTarget ?? \"n\/a\"}% by ${entity.targetYear || \"target year\"}`,\n            note: entity.opportunity\n          });\n        }\n\n        if (this.state.focus === \"hardware\") {\n          rows.push({\n            name: `${entity.label} hardware dependency`,\n            type: \"entity\",\n            value: `${this.num(entity.hardwareScore, 2)} \/ 5 risk score`,\n            note: entity.hardwareRisk\n          });\n        }\n\n        if (this.state.focus === \"fiscal\") {\n          rows.push({\n            name: `${entity.label} fiscal exposure`,\n            type: \"entity\",\n            value: entity.fiscalExposure,\n            note: entity.strategicPriority\n          });\n        }\n\n        if (this.state.focus === \"nuclear\") {\n          rows.push({\n            name: `${entity.label} firm-power status`,\n            type: \"entity\",\n            value: entity.firmPower,\n            note: entity.securityReason\n          });\n        }\n\n        return rows.slice(0, 5).map(row => {\n          const scoreText = row.type === \"entity\" ? `${status.word} \u00b7 ${signal}\/100` : `${scenario.shortLabel}`;\n          return `\n            <div class=\"market-row\">\n              <div>\n                <h4>${this.escape(row.name)}<\/h4>\n                <p>${this.escape(row.note)}<\/p>\n              <\/div>\n              <span class=\"range-pill\">${this.escape(row.value || scoreText)}<\/span>\n            <\/div>\n          `;\n        }).join(\"\");\n      }\n\n      buildPlaybook() {\n        const entity = this.entityData();\n        const scenario = this.scenarioData();\n        const focus = this.focusData();\n        const action = DATA.scenarioActions[this.state.scenario] || { title: \"Scenario response\", body: \"Prioritize the selected transmission channel and policy buffer.\" };\n        const cards = [\n          { step: \"1\", title: \"0\u20136 month shield\", body: entity.policy.immediate },\n          { step: \"2\", title: \"6\u201324 month buffer\", body: entity.policy.medium },\n          { step: \"3\", title: \"2026\u20132035 position\", body: entity.policy.long },\n          { step: \"4\", title: action.title, body: `${action.body} Current lens: ${focus.label}. Scenario bias: ${scenario.bias}.` }\n        ];\n\n        return cards.map(card => `\n          <article class=\"action-card\">\n            <span class=\"step-dot\">${this.escape(card.step)}<\/span>\n            <h4>${this.escape(card.title)}<\/h4>\n            <p>${this.escape(card.body)}<\/p>\n          <\/article>\n        `).join(\"\");\n      }\n\n      monitorValues() {\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const impact = Math.abs(Number(this.selectedImpact().score || 0));\n        const focusScore = this.channelWeightedScore(this.state.focus);\n        return {\n          transit: this.channelWeightedScore(\"transit\"),\n          lng: this.channelWeightedScore(\"lng\"),\n          fertilizer: this.channelWeightedScore(\"fertilizer\"),\n          hardware: this.channelWeightedScore(\"hardware\"),\n          power: Math.min(100, Math.round(scenario.stress * 0.30 + (5 - entity.electricityScore) * 12 + impact * 8 + this.channelWeightedScore(\"lng\") * 0.15)),\n          policy: Math.min(100, Math.round(scenario.stress * 0.35 + (100 - entity.bufferScore) * 0.45 + impact * 8 + focusScore * 0.18))\n        };\n      }\n\n      signalStatus(value) {\n        const v = Number(value || 0);\n        if (v >= 67) return { word: \"Hot\", className: \"hot\" };\n        if (v >= 34) return { word: \"Watch\", className: \"watch\" };\n        return { word: \"Low\", className: \"low\" };\n      }\n\n      buildMonitor() {\n        const values = this.monitorValues();\n        return DATA.monitorDefs.map(def => {\n          const value = Math.max(0, Math.min(100, Math.round(values[def.key] || 0)));\n          const status = this.signalStatus(value);\n          return `\n            <article class=\"signal-card\">\n              <div class=\"signal-top\">\n                <h4>${this.escape(def.label)}<\/h4>\n                <span class=\"status ${status.className}\">${this.escape(status.word)} \u00b7 ${value}<\/span>\n              <\/div>\n              <p>${this.escape(def.desc)}<\/p>\n              <div class=\"signal-meter\" aria-label=\"${this.escape(def.label)} meter at ${value} out of 100\">\n                <span class=\"${status.className}\" style=\"--meter: ${value}%\"><\/span>\n              <\/div>\n            <\/article>\n          `;\n        }).join(\"\");\n      }\n\n      updateNetwork() {\n        const activeFocus = this.state.focus;\n        const hotLinks = new Set(DATA.focusLinkMap[activeFocus] || []);\n        const dominant = this.dominantChannel();\n        const selectedScore = this.channelWeightedScore(activeFocus);\n\n        this.refs.nodeButtons.forEach(button => {\n          const key = button.dataset.focus;\n          const score = this.channelWeightedScore(key);\n          const alpha = Math.max(0.10, Math.min(0.42, score \/ 220)).toFixed(3);\n          button.style.setProperty(\"--node-alpha\", alpha);\n          button.classList.toggle(\"active\", key === activeFocus);\n          button.classList.toggle(\"dominant\", key === dominant.key);\n          button.classList.toggle(\"hot\", score >= 60 || key === activeFocus);\n          button.setAttribute(\"aria-pressed\", key === activeFocus ? \"true\" : \"false\");\n        });\n\n        this.refs.links.forEach(link => {\n          const isHot = hotLinks.has(link.dataset.link);\n          link.classList.toggle(\"hot\", isHot);\n          link.classList.toggle(\"dim\", !isHot);\n          link.style.strokeWidth = isHot ? String(2.6 + selectedScore \/ 45) : \"1.6\";\n        });\n\n        this.setText(this.refs.networkScore, `${selectedScore}\/100 \u00b7 ${this.focusData().label}`);\n      }\n\n      syncButtons() {\n        const buttons = [...this.shadowRoot.querySelectorAll(\"[data-control]\")];\n        buttons.forEach(button => {\n          const prop = button.dataset.control;\n          const isActive = this.state[prop] === button.dataset.key;\n          button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\n        });\n      }\n\n      render() {\n        const dashboard = DATA.dashboard;\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const focus = this.focusData();\n        const impact = this.selectedImpact();\n        const dominant = this.dominantChannel();\n        const stressStatus = this.signalStatus(scenario.stress);\n        const focusScore = this.channelWeightedScore(this.state.focus);\n        const focusStatus = this.signalStatus(focusScore);\n\n        this.setText(this.refs.eyebrow, dashboard.eyebrow);\n        this.setText(this.refs.title, dashboard.title);\n        this.setText(this.refs.subtitle, dashboard.subtitle);\n        this.setHtml(this.refs.stateBadge, this.stateBadgeHtml());\n        this.setText(this.refs.briefing, this.buildBriefing());\n\n        this.setText(this.refs.kpiStress, this.moodLabel(scenario.stress));\n        this.setText(this.refs.kpiStressCopy, `${scenario.stress}\/100 \u00b7 ${scenario.bias}`);\n        this.refs.kpiStressMeter.style.setProperty(\"--meter\", `${scenario.stress}%`);\n\n        this.setText(this.refs.kpiImpact, this.scoreValue(impact.score));\n        this.setText(this.refs.kpiImpactCopy, `${impact.direction || this.scoreDirection(impact.score)} \u00b7 ${dashboard.scoreScale}`);\n\n        this.setText(this.refs.kpiBuffer, this.selectedSecondaryRange());\n        this.setText(this.refs.kpiBufferCopy, `${entity.buffers} \u00b7 pass-through ${this.num(entity.passThrough, 2)}x`);\n\n        this.setText(this.refs.kpiBias, dominant.label);\n        this.setText(this.refs.kpiBiasCopy, `${dominant.score}\/100 weighted score \u00b7 ${scenario.timing}`);\n\n        this.setText(this.refs.focusTitle, focus.label);\n        this.setText(this.refs.focusSubtitle, `${scenario.shortLabel} \u00b7 ${entity.label} \u00b7 ${focusStatus.word} signal`);\n        this.setText(this.refs.focusScore, `${focusScore}\/100`);\n        this.setText(this.refs.focusBody, focus.body);\n\n        this.setHtml(this.refs.detailGrid, this.buildDetailGrid());\n        this.setText(this.refs.entityCount, `${Object.keys(DATA.entities).length} countries`);\n        this.setHtml(this.refs.entityList, this.buildEntityList());\n        this.setText(this.refs.marketSubtitle, focus.currentRange[this.state.scenario] || scenario.bias);\n        this.setText(this.refs.rangePill, `${focusStatus.word} \u00b7 ${focusScore}\/100`);\n        this.setHtml(this.refs.marketRows, this.buildMarketRows());\n        this.setText(this.refs.playbookSubtitle, `${entity.label} response plan under ${scenario.shortLabel}.`);\n        this.setText(this.refs.policyPriority, `Priority: ${entity.policy.priority}`);\n        this.setHtml(this.refs.playbookGrid, this.buildPlaybook());\n        this.setText(this.refs.monitorPill, `${stressStatus.word} regime`);\n        this.setHtml(this.refs.monitorGrid, this.buildMonitor());\n        this.setText(this.refs.footerNote, `Current state: ${this.state.scenario} \/ ${entity.label} \/ ${focus.label}. Data normalized from ${DATA.sourceSheets.length} workbook sheets.`);\n\n        this.syncButtons();\n        this.updateNetwork();\n      }\n\n      buildDetailGrid() {\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const focus = this.focusData();\n        const impact = this.selectedImpact();\n        const weight = Math.round((entity.weights[this.state.focus] || 0) * 100);\n        const currentRange = focus.currentRange[this.state.scenario] || scenario.bias;\n        const tiles = [\n          { label: \"Current range\", value: currentRange, copy: \"Scenario-dependent signal for the active lens.\" },\n          { label: \"Selected entity weight\", value: `${weight}% exposure weight`, copy: focus.weightCopy },\n          { label: \"Domestic \/ operational layer\", value: focus.layer, copy: focus.layerCopy },\n          { label: \"Timing signal\", value: focus.timing, copy: focus.timingCopy },\n          { label: \"Country score\", value: this.formatScore(impact.score), copy: impact.summary },\n          { label: \"Country vulnerability\", value: entity.vulnerability, copy: entity.mainRisk }\n        ];\n\n        return tiles.map(tile => `\n          <div class=\"detail-tile\">\n            <p class=\"tile-label\">${this.escape(tile.label)}<\/p>\n            <p class=\"tile-value\">${this.escape(tile.value)}<\/p>\n            <p class=\"tile-copy\">${this.escape(tile.copy)}<\/p>\n          <\/div>\n        `).join(\"\");\n      }\n\n      copyBriefing() {\n        const text = this.lastBriefing || this.buildBriefing();\n        const done = () => {\n          this.setText(this.refs.footerNote, \"Briefing copied to clipboard.\");\n          window.setTimeout(() => {\n            const entity = this.entityData();\n            const focus = this.focusData();\n            this.setText(this.refs.footerNote, `Current state: ${this.state.scenario} \/ ${entity.label} \/ ${focus.label}. Data normalized from ${DATA.sourceSheets.length} workbook sheets.`);\n          }, 1500);\n        };\n\n        if (navigator.clipboard && navigator.clipboard.writeText) {\n          navigator.clipboard.writeText(text).then(done).catch(() => this.fallbackCopy(text, done));\n        } else {\n          this.fallbackCopy(text, done);\n        }\n      }\n\n      fallbackCopy(text, callback) {\n        const area = document.createElement(\"textarea\");\n        area.value = text;\n        area.setAttribute(\"readonly\", \"\");\n        area.style.position = \"fixed\";\n        area.style.left = \"-9999px\";\n        document.body.appendChild(area);\n        area.select();\n        try { document.execCommand(\"copy\"); } catch (error) {}\n        document.body.removeChild(area);\n        callback();\n      }\n\n      downloadCsv() {\n        const scenario = this.scenarioData();\n        const entity = this.entityData();\n        const focus = this.focusData();\n        const impact = this.selectedImpact();\n        const rows = [\n          [\"Field\", \"Value\"],\n          [\"Scenario\", `${this.state.scenario} \u00b7 ${scenario.label}`],\n          [\"Entity\", entity.label],\n          [\"Focus\", focus.label],\n          [\"Primary impact\", this.formatScore(impact.score)],\n          [\"Impact direction\", impact.direction || this.scoreDirection(impact.score)],\n          [\"Secondary impact\", `${this.num(entity.resilienceScore, 2)} \/ 5 resilience buffer`],\n          [\"Stress\", `${scenario.stress}\/100`],\n          [\"Dominant channel\", `${this.dominantChannel().label} \u00b7 ${this.dominantChannel().score}\/100`],\n          [\"Focus range\", focus.currentRange[this.state.scenario] || \"\"],\n          [\"Timing\", focus.timing],\n          [\"Scenario summary\", impact.summary],\n          [\"Entity vulnerability\", entity.vulnerability],\n          [\"Strategic priority\", entity.strategicPriority],\n          [\"Monitoring KPIs\", entity.policy.kpis],\n          [\"Briefing\", this.lastBriefing || this.buildBriefing()]\n        ];\n\n        const csv = rows.map(row => row.map(value => this.csvEscape(value)).join(\",\")).join(\"\\n\");\n        const blob = new Blob([csv], { type: \"text\/csv;charset=utf-8\" });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement(\"a\");\n        const fileEntity = entity.label.toLowerCase().replace(\/[^a-z0-9]+\/g, \"-\");\n        a.href = url;\n        a.download = `obex-hormuz-${this.state.scenario.toLowerCase()}-${fileEntity}-${this.state.focus}.csv`;\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n        this.setText(this.refs.footerNote, \"CSV downloaded for the current dashboard state.\");\n      }\n\n      csvEscape(value) {\n        const text = String(value == null ? \"\" : value);\n        return `\"${text.replace(\/\"\/g, '\"\"')}\"`;\n      }\n\n      moodLabel(stress) {\n        const value = Number(stress || 0);\n        if (value >= 80) return \"Systemic\";\n        if (value >= 60) return \"Compounding\";\n        if (value >= 45) return \"Active transition\";\n        return \"Contained but live\";\n      }\n\n      scoreDirection(score) {\n        const value = Number(score || 0);\n        if (value <= -2.5) return \"High \/ severe risk\";\n        if (value < 0) return \"Moderate risk\";\n        if (value === 0) return \"Mixed \/ neutral\";\n        if (value < 2) return \"Moderate opportunity\";\n        return \"Strong opportunity\";\n      }\n\n      scoreValue(score) {\n        const value = Number(score || 0);\n        const prefix = value > 0 ? \"+\" : \"\";\n        return `${prefix}${this.num(value, Number.isInteger(value) ? 0 : 1)}`;\n      }\n\n      formatScore(score) {\n        const value = Number(score || 0);\n        if (value < 0) return `${this.scoreValue(value)} risk`;\n        if (value > 0) return `${this.scoreValue(value)} opportunity`;\n        return \"0 mixed\";\n      }\n\n      num(value, digits = 1) {\n        const n = Number(value);\n        if (!Number.isFinite(n)) return \"n\/a\";\n        return n.toFixed(digits).replace(\/\\.0+$\/, \"\");\n      }\n\n      escape(value) {\n        return String(value == null ? \"\" : value)\n          .replace(\/&\/g, \"&amp;\")\n          .replace(\/<\/g, \"&lt;\")\n          .replace(\/>\/g, \"&gt;\")\n          .replace(\/\"\/g, \"&quot;\")\n          .replace(\/'\/g, \"&#039;\");\n      }\n    }\n\n    customElements.define(tagName, ObexLinkedDashboard);\n  })();\n  <\/script>\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On February 28, 2026, the detonation of the first confirmed sea mine in the navigable shipping lane of the Strait of Hormuz set in motion the largest supply disruption in the recorded history of global oil markets. The 21-mile-wide chokepoint \u2014 through which approximately 21 million barrels of petroleum and the equivalent of nearly 20 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":722,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[178,6],"tags":[62],"class_list":["post-719","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-178","category-6","tag-featured"],"_links":{"self":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/comments?post=719"}],"version-history":[{"count":3,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/719\/revisions"}],"predecessor-version":[{"id":724,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/posts\/719\/revisions\/724"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/media\/722"}],"wp:attachment":[{"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/media?parent=719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/categories?post=719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/obexanalytica.com\/ar\/wp-json\/wp\/v2\/tags?post=719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}