<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
	<id>https://www.insurerbrain.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wikilah+admin</id>
	<title>Insurer Brain - User contributions [en-us]</title>
	<link rel="self" type="application/atom+xml" href="https://www.insurerbrain.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wikilah+admin"/>
	<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/wiki/Special:Contributions/Wikilah_admin"/>
	<updated>2026-04-28T23:09:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Test&amp;diff=23036</id>
		<title>Test</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Test&amp;diff=23036"/>
		<updated>2026-04-27T08:48:35Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
topic: Global insurance markets&lt;br /&gt;
year: 2024&lt;br /&gt;
source: Activity report - Full Year 2024&lt;br /&gt;
&lt;br /&gt;
markets:&lt;br /&gt;
  - region: France&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Savings insurance&lt;br /&gt;
        performance:&lt;br /&gt;
          premium_growth_yoy: +14%&lt;br /&gt;
          total_premiums_eur_bn: 173&lt;br /&gt;
        sub_products:&lt;br /&gt;
          - name: Unit-linked&lt;br /&gt;
            growth_yoy: +8%&lt;br /&gt;
            share_of_total: 38%       # down from 40% in 2023&lt;br /&gt;
          - name: General Account&lt;br /&gt;
            growth_yoy: +17%&lt;br /&gt;
        notes:&lt;br /&gt;
          - Saving ratio increased amid economic, fiscal, and political uncertainty.&lt;br /&gt;
          - Stagnant real estate market supported net flows into Life insurance.&lt;br /&gt;
          - Surrenders decreased in General Account funds despite Livret A rate held at 3%.&lt;br /&gt;
          - Surrenders increased in Unit-linked products, partially offsetting the GA decrease.&lt;br /&gt;
&lt;br /&gt;
      - name: Protection and Complementary Health insurance&lt;br /&gt;
        notes:&lt;br /&gt;
          - Medical inflation partly absorbed via average tariff increase of 8% in 2024.&lt;br /&gt;
          - Cost and frequency of claims both rose.&lt;br /&gt;
          - Political uncertainty around the Sécurité Sociale budget may drive further tariff increases as state reimbursement share decreases.&lt;br /&gt;
&lt;br /&gt;
      - name: Property &amp;amp; Casualty&lt;br /&gt;
        notes:&lt;br /&gt;
          - Motor claims rose due to driver behavior and higher repair costs.&lt;br /&gt;
        natural_catastrophes:&lt;br /&gt;
          - event: Cyclone Belal (overseas)&lt;br /&gt;
            estimated_cost_eur_bn: 0.1&lt;br /&gt;
          - event: Cyclone Chido (overseas)&lt;br /&gt;
            estimated_cost_eur_bn_range: [0.65, 0.8]&lt;br /&gt;
          - event: Floods (including Kirk depression)&lt;br /&gt;
            estimated_cost_eur_bn_range: [0.35, 0.42]&lt;br /&gt;
&lt;br /&gt;
  - region: Europe (excluding France)&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Property &amp;amp; Casualty&lt;br /&gt;
        notes:&lt;br /&gt;
          - Faced rising repair costs amid persistent but moderating inflation.&lt;br /&gt;
          - Evolving risks including climate change.&lt;br /&gt;
          - Multiple but less severe weather events, mainly hailstorms and floods across most geographies.&lt;br /&gt;
          - Insurers responding via pricing measures, product reshaping, and updated risk management practices.&lt;br /&gt;
&lt;br /&gt;
      - name: Life and Savings&lt;br /&gt;
        notes:&lt;br /&gt;
          - Recovering from last year&#039;s challenging macroeconomic environment.&lt;br /&gt;
          - Still affected by modest growth and economic/political uncertainties.&lt;br /&gt;
&lt;br /&gt;
      - name: Health&lt;br /&gt;
        notes:&lt;br /&gt;
          - Private insurers facing ageing population, claims cost inflation, and strains on national healthcare systems.&lt;br /&gt;
          - Implementing progressive price increases.&lt;br /&gt;
          - Focusing on digital transformation, including care pathway management and wellness benefits.&lt;br /&gt;
&lt;br /&gt;
  - region: Japan&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Life insurance&lt;br /&gt;
        performance:&lt;br /&gt;
          gwp_growth_yoy: +5%&lt;br /&gt;
        notes:&lt;br /&gt;
          - Growth driven by strong sales of traditional General Account Savings products.&lt;br /&gt;
          - Higher guarantees offered as a result of rising Japanese interest rates.&lt;br /&gt;
          - Major insurers&#039; net income boosted by favorable Japanese equity market performance.&lt;br /&gt;
&lt;br /&gt;
      - name: Property &amp;amp; Casualty&lt;br /&gt;
        performance:&lt;br /&gt;
          gwp_growth_yoy: +3%&lt;br /&gt;
        notes:&lt;br /&gt;
          - Driven by price increases in Motor and Fire insurance.&lt;br /&gt;
&lt;br /&gt;
  - region: Hong Kong&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Life insurance&lt;br /&gt;
        performance:&lt;br /&gt;
          gwp_growth_yoy: +8%&lt;br /&gt;
          new_business_growth_yoy: +16%&lt;br /&gt;
        notes:&lt;br /&gt;
          - New business growth derived from non-Linked individual business.&lt;br /&gt;
          - Mainland China Visitors new business slightly decreased vs. 2023.&lt;br /&gt;
          - Mainland China Visitors represented 28% of total Individual business.&lt;br /&gt;
&lt;br /&gt;
      - name: Property &amp;amp; Casualty&lt;br /&gt;
        notes:&lt;br /&gt;
          - Market remained stable.&lt;br /&gt;
&lt;br /&gt;
  - region: United States&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Property insurance&lt;br /&gt;
        notes:&lt;br /&gt;
          - Rates rose, though at a slower pace than prior years.&lt;br /&gt;
          - Strict underwriting across capacity deployment, risk selection, and terms and conditions.&lt;br /&gt;
          - Adversely impacted by increased frequency of Nat Cat events, particularly secondary perils.&lt;br /&gt;
          - Rising reinsurance costs and economic inflation drove up construction costs.&lt;br /&gt;
&lt;br /&gt;
      - name: Casualty insurance&lt;br /&gt;
        notes:&lt;br /&gt;
          - Continues to experience rate increases due to loss trends.&lt;br /&gt;
          - Elevated casualty claims from social inflation have impacted underwriting margins and reserves.&lt;br /&gt;
&lt;br /&gt;
  - region: Global&lt;br /&gt;
    segments:&lt;br /&gt;
      - name: Reinsurance&lt;br /&gt;
        notes:&lt;br /&gt;
          - Market remains well-capitalized; companies successfully raised capital to support growth.&lt;br /&gt;
          - Property reinsurance saw increased rates and attachment points, improving margins.&lt;br /&gt;
          - Realignment of property catastrophe risk allowed reinsurers to limit losses despite active weather patterns.&lt;br /&gt;
          - Strong underwriting performance and improved investment returns helped mitigate adverse prior-year reserve development in US casualty business.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Home&amp;diff=23034</id>
		<title>Home</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Home&amp;diff=23034"/>
		<updated>2026-04-16T06:09:15Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;In the spotlight:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;nav-cards&amp;quot; data-wix-pages=&#039;[&lt;br /&gt;
  [&amp;quot;AXA FY25 results&amp;quot;,       &amp;quot;Web:AXA/results/FY25/press release/summary&amp;quot;,              &amp;quot;Results&amp;quot;,                &amp;quot;chart&amp;quot;],&lt;br /&gt;
  [&amp;quot;Claude Bébéar&amp;quot;,          &amp;quot;Claude Bébéar&amp;quot;,                                            &amp;quot;People&amp;quot;,                 &amp;quot;people&amp;quot;],&lt;br /&gt;
  [&amp;quot;French market ranking&amp;quot;,  &amp;quot;Web:Watch/France/Market ranking&amp;quot;, &amp;quot;Market insights&amp;quot;,        &amp;quot;scale&amp;quot;],&lt;br /&gt;
  [&amp;quot;Cyber insurtechs&amp;quot;,       &amp;quot;Cyber insurtech MGAs and underwriting agencies&amp;quot;,           &amp;quot;Market screening&amp;quot;,       &amp;quot;lock&amp;quot;],&lt;br /&gt;
  [&amp;quot;AI in insurance&amp;quot;,        &amp;quot;Web:Watch/AI in insurance&amp;quot;,                                &amp;quot;Market watch&amp;quot;,           &amp;quot;gear&amp;quot;],&lt;br /&gt;
  [&amp;quot;QuantCo&amp;quot;,                &amp;quot;QuantCo&amp;quot;,                                                  &amp;quot;Company profile&amp;quot;,        &amp;quot;building&amp;quot;],&lt;br /&gt;
  [&amp;quot;Loss portfolio transfer&amp;quot;,&amp;quot;Definition:Loss portfolio transfer (LPT)&amp;quot;,                 &amp;quot;Insurance encyclopedia&amp;quot;, &amp;quot;layers&amp;quot;],&lt;br /&gt;
  [&amp;quot;IFRS 17&amp;quot;,                &amp;quot;Internal:Training/IFRS17&amp;quot;,                                 &amp;quot;Training program&amp;quot;,       &amp;quot;book&amp;quot;],&lt;br /&gt;
  [&amp;quot;KiwiBot&amp;quot;,                &amp;quot;KiwiBot (Kiwi the wiki)&amp;quot;,                                  &amp;quot;AXA BRAIN&amp;quot;,              &amp;quot;heart&amp;quot;]&lt;br /&gt;
]&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Cyber_insurtech_MGAs_and_underwriting_agencies&amp;diff=23032</id>
		<title>Cyber insurtech MGAs and underwriting agencies</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Cyber_insurtech_MGAs_and_underwriting_agencies&amp;diff=23032"/>
		<updated>2026-04-12T13:04:13Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Summary:{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
&lt;br /&gt;
== Overview of key players ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x: auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:0.85em; width:100%;&amp;quot;&lt;br /&gt;
|+ 🛡️ Cyber insurtech MGA competitive landscape&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Logo&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Company&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Founded&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | HQ location&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Main region&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Category&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Target market&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Description&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of At-Bay.svg|80px|link=At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Enterprise&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:At-Bay|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Baobab Insurance.svg|80px|link=Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Germany}}, Berlin&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Upper Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Baobab Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of BOXX Insurance.svg|80px|link=BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Canada}}, Toronto&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Individual&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:BOXX Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Coalition.svg|80px|link=Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2017&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Coalition|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cogitanda.svg|80px|link=Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Germany}}, Flensburg&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Cogitanda|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Converge Insurance.svg|80px|link=Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, NY, New York&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Converge Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Corvus Insurance.svg|80px|link=Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2017&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, MA, Boston&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Corvus Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cowbell.svg|80px|link=Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2019&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, Pleasanton&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Cowbell|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Dattak.svg|80px|link=Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|France}}, Paris&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Upper Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Dattak|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Elpha Secure.svg|80px|link=Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, NY, New York&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Elpha Secure|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Emergence Insurance.svg|80px|link=Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2015&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Australia}}, Sydney&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Asia-Pacific&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber Underwriting Agency&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Emergence Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Evolve MGA.svg|80px|link=Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2015&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Diego&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Evolve MGA|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Eye Security.svg|80px|link=Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2020&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Netherlands}}, The Hague&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Eye Security|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Invision Cyber.svg|80px|link=Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2025&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|UK}}, London / {{flagicon|USA}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe / North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Invision Cyber|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Measured Analytics and Insurance.svg|80px|link=Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, UT, Salt Lake City&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Measured Analytics and Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Onda.svg|80px|link=Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2022&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|UK}}, London / {{flagicon|USA}} / {{flagicon|France}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Onda|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Pera.svg|80px|link=Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2023&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Large Corporate&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Pera|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Resilience.svg|80px|link=Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Resilience|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of SafeInside Insurance.svg|80px|link=SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2022&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, Palo Alto&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:SafeInside Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Stoïk.svg|80px|link=Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|France}}, Paris&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Stoïk|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Sync Underwriting.svg|80px|link=Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2024&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Australia}}, Sydney&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Asia-Pacific&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Sync Underwriting|1}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x: auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:0.85em; width:100%;&amp;quot;&lt;br /&gt;
|+ 🛡️ Cyber Insurtech MGA — M&amp;amp;A Opportunity Comparison Table&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Logo&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Company&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Est. GWP&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Total Funding&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Last Known Valuation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Key Shareholders / Investors&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Acquired?&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Link with AXA&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of At-Bay.svg|80px|link=At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $380M ARR (Jan 2023)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $292M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $1.35B (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Lightspeed, Khosla, Icon Ventures, Munich Re Ventures, M12, Qumra Capital, Acrew Capital, ION Crossover Partners&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | AXA SA listed as reinsurer in capacity panel&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Baobab Insurance.svg|80px|link=Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €20.1M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Viola FinTech, eCAPITAL, Augmentum Fintech, Project A Ventures, La Famiglia, Discovery Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of BOXX Insurance.svg|80px|link=BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $24.5M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Zurich Insurance Group (full owner), Cyber Mentor Fund, SixThirty&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Zurich (July 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | AXA collaboration in Spain (Jan 2024, SME cyber risk prevention)&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Coalition.svg|80px|link=Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $775M+ run rate (July 2022)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $770M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $5B (2022)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Allianz X, Index Ventures, Ribbit Capital, T. Rowe Price, Durable Capital, Whale Rock, Valor Equity Partners, General Atlantic&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Historical carrier lineage: Coalition Insurance Company predecessor names include &amp;quot;AXA Art Insurance Corporation&amp;quot; (shell lineage only, no present-day AXA tie)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cogitanda.svg|80px|link=Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | DGC AG (post-insolvency acquirer)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by DGC AG from insolvency (Mar 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Converge Insurance.svg|80px|link=Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $20M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Forgepoint Capital, QBE Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Founder Anthony Dagostino departed to AXA XL (Sep 2023)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Corvus Insurance.svg|80px|link=Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $200M+ book&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $162M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~$750M (Series C)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Travelers (full owner), Bain Capital Ventures, Insight Partners, Telstra Ventures, .406 Ventures&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Travelers (~$435M, Jan 2024)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cowbell.svg|80px|link=Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $200M+ run rate (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $208.3M+&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Zurich Insurance Group, Anthemis, Permira, Prosperity7, Brewer Lane Ventures, PruVen Capital, NYCA Partners, Viola FinTech, ManchesterStory&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Zurich strategic investor)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Dattak.svg|80px|link=Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €10M (2024); €22M target (2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €18M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | XAnge, Breega, Bpifrance&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | CEO Charlotte Couallier is former AXA France commercial partnerships director; board member Matthieu Bébéar is ex-Chief Business Officer of AXA&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Elpha Secure.svg|80px|link=Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$29M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Canapi Ventures, Stone Point Ventures, AXIS Capital, State Farm Ventures, The Hartford STAG Ventures, Fermat Capital Management, EOS Venture Partners&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Emergence Insurance.svg|80px|link=Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Steadfast Group Limited (33.33%), Hollard Insurance&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Steadfast associate)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Evolve MGA.svg|80px|link=Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None (acquired)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Brown &amp;amp; Brown / Nexus Underwriting (full owner)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Nexus / Brown &amp;amp; Brown (2023)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Historical capacity panel included XL Catlin / AXA XL&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Eye Security.svg|80px|link=Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €57.5M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | J.P. Morgan Growth Equity Partners, Bessemer Venture Partners, TIN Capital&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Invision Cyber.svg|80px|link=Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Vector Investment Capital (75%+ control), Correlation Holdings (minority at Acies MGU level)&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Co-founder Stuart Essex formerly Head of UK PI at AXA XL&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Measured Analytics and Insurance.svg|80px|link=Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Undisclosed (2 rounds)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Signal Peak Ventures, Origin Ventures, Royal Street Ventures, Silicon Valley Data Capital, AV8 Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Onda.svg|80px|link=Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Pera.svg|80px|link=Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $3.25M (group seed)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Ryan Specialty (full owner), Maiden Holdings (prior seed)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Ryan Specialty (May 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Resilience.svg|80px|link=Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$225M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~$650M (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Intact Ventures, General Catalyst, Lightspeed, Founders Fund, CRV, UL Ventures, Shield Capital&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Intact strategic partner)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of SafeInside Insurance.svg|80px|link=SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$170M (group)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Avataar Ventures, BT Group, Sorenson Capital, Prosperity7, Eight Roads, Telstra Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Stoïk.svg|80px|link=Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~€50M (2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~€69.8M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Alven, a16z, Munich Re Ventures, Tokio Marine HCC, Impala, Opera Tech Ventures, Anthemis&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Henri de Castries (former AXA CEO) participated as business angel in Series A (June 2022)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Sync Underwriting.svg|80px|link=Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Rhodian Group (equity), Amwins (minority in Rhodian)&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== At-Bay ==&lt;br /&gt;
{{Summary:At-Bay|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Baobab Insurance ==&lt;br /&gt;
{{Summary:Baobab Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== BOXX Insurance ==&lt;br /&gt;
{{Summary:BOXX Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Coalition ==&lt;br /&gt;
{{Summary:Coalition|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Cogitanda ==&lt;br /&gt;
{{Summary:Cogitanda|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Converge Insurance ==&lt;br /&gt;
{{Summary:Converge Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Corvus Insurance ==&lt;br /&gt;
{{Summary:Corvus Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Cowbell ==&lt;br /&gt;
{{Summary:Cowbell|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Dattak ==&lt;br /&gt;
{{Summary:Dattak|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Elpha Secure ==&lt;br /&gt;
{{Summary:Elpha Secure|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Emergence Insurance ==&lt;br /&gt;
{{Summary:Emergence Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Evolve MGA ==&lt;br /&gt;
{{Summary:Evolve MGA|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Eye Security ==&lt;br /&gt;
{{Summary:Eye Security|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Invision Cyber ==&lt;br /&gt;
{{Summary:Invision Cyber|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Measured Analytics and Insurance ==&lt;br /&gt;
{{Summary:Measured Analytics and Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Onda ==&lt;br /&gt;
{{Summary:Onda|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Pera ==&lt;br /&gt;
{{Summary:Pera|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Resilience ==&lt;br /&gt;
{{Summary:Resilience|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== SafeInside Insurance ==&lt;br /&gt;
{{Summary:SafeInside Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Stoïk ==&lt;br /&gt;
{{Summary:Stoïk|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Sync Underwriting ==&lt;br /&gt;
{{Summary:Sync Underwriting|5}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23031</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23031"/>
		<updated>2026-04-12T13:03:28Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local maxEntries = tonumber(frame.args[1]) or 30&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    local count = 0&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        if count &amp;gt;= maxEntries then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            &lt;br /&gt;
            local defTitle&lt;br /&gt;
            if title:match(&amp;quot;^Definition:&amp;quot;) then&lt;br /&gt;
                defTitle = title&lt;br /&gt;
            else&lt;br /&gt;
                defTitle = &amp;quot;Definition:&amp;quot; .. title&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            local page = mw.title.new(defTitle)&lt;br /&gt;
            if page then&lt;br /&gt;
                local text = page:getContent()&lt;br /&gt;
                if text then&lt;br /&gt;
                    text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                    text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                    local sentence = text:match(&amp;quot;^(.-%.)&amp;quot;)&lt;br /&gt;
                    if sentence then&lt;br /&gt;
                        table.insert(entries, {&lt;br /&gt;
                            title = title:gsub(&amp;quot;^Definition:&amp;quot;, &amp;quot;&amp;quot;),&lt;br /&gt;
                            summary = sentence&lt;br /&gt;
                        })&lt;br /&gt;
                        count = count + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, e.summary)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23030</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23030"/>
		<updated>2026-04-12T12:59:05Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            &lt;br /&gt;
            local defTitle&lt;br /&gt;
            if title:match(&amp;quot;^Definition:&amp;quot;) then&lt;br /&gt;
                defTitle = title&lt;br /&gt;
            else&lt;br /&gt;
                defTitle = &amp;quot;Definition:&amp;quot; .. title&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            local displayName = title:gsub(&amp;quot;^Definition:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            local page = mw.title.new(defTitle)&lt;br /&gt;
            &lt;br /&gt;
            if page and page.exists then&lt;br /&gt;
                local text = page:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
                text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                local sentence = text:match(&amp;quot;^(.-%.)&amp;quot;)&lt;br /&gt;
                if sentence then&lt;br /&gt;
                    table.insert(entries, {&lt;br /&gt;
                        title = displayName,&lt;br /&gt;
                        summary = sentence&lt;br /&gt;
                    })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    -- render: just the sentence, no repeated title&lt;br /&gt;
    local out = {}&lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, e.summary)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23029</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23029"/>
		<updated>2026-04-12T12:57:31Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            &lt;br /&gt;
            -- only prepend if not already in Definition: namespace&lt;br /&gt;
            local defTitle&lt;br /&gt;
            if title:match(&amp;quot;^Definition:&amp;quot;) then&lt;br /&gt;
                defTitle = title&lt;br /&gt;
            else&lt;br /&gt;
                defTitle = &amp;quot;Definition:&amp;quot; .. title&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            -- clean display name (strip namespace prefix)&lt;br /&gt;
            local displayName = title:gsub(&amp;quot;^Definition:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            local page = mw.title.new(defTitle)&lt;br /&gt;
            &lt;br /&gt;
            if page and page.exists then&lt;br /&gt;
                local text = page:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
                text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                local sentence = text:match(&amp;quot;^(.-%.)&amp;quot;)&lt;br /&gt;
                if sentence then&lt;br /&gt;
                    table.insert(entries, {&lt;br /&gt;
                        title = displayName,&lt;br /&gt;
                        summary = sentence&lt;br /&gt;
                    })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, string.format(&lt;br /&gt;
            &amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;: %s&amp;quot;, e.title, e.summary&lt;br /&gt;
        ))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23028</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23028"/>
		<updated>2026-04-12T12:56:34Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    local debug = {}&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            &lt;br /&gt;
            local defTitle = &amp;quot;Definition:&amp;quot; .. title&lt;br /&gt;
            local page = mw.title.new(defTitle)&lt;br /&gt;
            &lt;br /&gt;
            if not page then&lt;br /&gt;
                table.insert(debug, &amp;quot;FAIL mw.title.new: &amp;quot; .. defTitle)&lt;br /&gt;
            elseif not page.exists then&lt;br /&gt;
                table.insert(debug, &amp;quot;NOT FOUND: &amp;quot; .. defTitle)&lt;br /&gt;
            else&lt;br /&gt;
                local text = page:getContent()&lt;br /&gt;
                if not text then&lt;br /&gt;
                    table.insert(debug, &amp;quot;NO CONTENT: &amp;quot; .. defTitle)&lt;br /&gt;
                else&lt;br /&gt;
                    text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                    text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                    local sentence = text:match(&amp;quot;^(.-%.)&amp;quot;)&lt;br /&gt;
                    if not sentence then&lt;br /&gt;
                        table.insert(debug, &amp;quot;NO SENTENCE: &amp;quot; .. defTitle)&lt;br /&gt;
                    else&lt;br /&gt;
                        table.insert(debug, &amp;quot;OK: &amp;quot; .. defTitle)&lt;br /&gt;
                        table.insert(entries, {&lt;br /&gt;
                            title = title,&lt;br /&gt;
                            summary = sentence&lt;br /&gt;
                        })&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    &lt;br /&gt;
    -- debug output (remove once working)&lt;br /&gt;
    table.insert(out, &amp;quot;=== DEBUG ===&amp;quot;)&lt;br /&gt;
    for _, d in ipairs(debug) do&lt;br /&gt;
        table.insert(out, d)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, &amp;quot;=== END DEBUG ===&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, string.format(&lt;br /&gt;
            &amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;: %s&amp;quot;, e.title, e.summary&lt;br /&gt;
        ))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23027</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23027"/>
		<updated>2026-04-12T12:54:04Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- find all [[internal links]]&lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            &lt;br /&gt;
            -- look up the Definition: namespace version&lt;br /&gt;
            local defTitle = &amp;quot;Definition:&amp;quot; .. title&lt;br /&gt;
            local page = mw.title.new(defTitle)&lt;br /&gt;
            &lt;br /&gt;
            if page and page.exists then&lt;br /&gt;
                local text = page:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
                -- strip templates, get first sentence&lt;br /&gt;
                text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                local sentence = text:match(&amp;quot;^(.-%.)&amp;quot;)&lt;br /&gt;
                if sentence then&lt;br /&gt;
                    table.insert(entries, {&lt;br /&gt;
                        title = title,&lt;br /&gt;
                        summary = sentence&lt;br /&gt;
                    })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- sort alphabetically&lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    -- render&lt;br /&gt;
    local out = {}&lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, string.format(&lt;br /&gt;
            &amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;: %s&amp;quot;, e.title, e.summary&lt;br /&gt;
        ))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Cyber_insurtech_MGAs_and_underwriting_agencies&amp;diff=23026</id>
		<title>Cyber insurtech MGAs and underwriting agencies</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Cyber_insurtech_MGAs_and_underwriting_agencies&amp;diff=23026"/>
		<updated>2026-04-12T12:50:46Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Summary:{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
&lt;br /&gt;
== Overview of key players ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x: auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:0.85em; width:100%;&amp;quot;&lt;br /&gt;
|+ 🛡️ Cyber insurtech MGA competitive landscape&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Logo&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Company&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Founded&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | HQ location&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Main region&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Category&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Target market&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Description&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of At-Bay.svg|80px|link=At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Enterprise&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:At-Bay|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Baobab Insurance.svg|80px|link=Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Germany}}, Berlin&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Upper Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Baobab Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of BOXX Insurance.svg|80px|link=BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Canada}}, Toronto&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Individual&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:BOXX Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Coalition.svg|80px|link=Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2017&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA / Carrier&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Coalition|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cogitanda.svg|80px|link=Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Germany}}, Flensburg&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Cogitanda|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Converge Insurance.svg|80px|link=Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, NY, New York&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Converge Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Corvus Insurance.svg|80px|link=Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2017&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, MA, Boston&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Corvus Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cowbell.svg|80px|link=Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2019&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, Pleasanton&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Cowbell|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Dattak.svg|80px|link=Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|France}}, Paris&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Upper Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Dattak|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Elpha Secure.svg|80px|link=Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, NY, New York&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Elpha Secure|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Emergence Insurance.svg|80px|link=Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2015&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Australia}}, Sydney&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Asia-Pacific&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber Underwriting Agency&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Emergence Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Evolve MGA.svg|80px|link=Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2015&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Diego&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Evolve MGA|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Eye Security.svg|80px|link=Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2020&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Netherlands}}, The Hague&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Eye Security|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Invision Cyber.svg|80px|link=Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2025&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|UK}}, London / {{flagicon|USA}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe / North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Invision Cyber|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Measured Analytics and Insurance.svg|80px|link=Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2018&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, UT, Salt Lake City&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Measured Analytics and Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Onda.svg|80px|link=Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2022&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|UK}}, London / {{flagicon|USA}} / {{flagicon|France}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Onda|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Pera.svg|80px|link=Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2023&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Large Corporate&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Pera|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Resilience.svg|80px|link=Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2016&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, San Francisco&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Resilience|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of SafeInside Insurance.svg|80px|link=SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2022&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|USA}}, CA, Palo Alto&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | North America&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Mid-Market to Large&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:SafeInside Insurance|1}}&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Stoïk.svg|80px|link=Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2021&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|France}}, Paris&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Europe&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Stoïk|1}}&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Sync Underwriting.svg|80px|link=Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | 2024&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{flagicon|Australia}}, Sydney&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Asia-Pacific&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Cyber MGA&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | SME to Mid-Market&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | {{Summary:Sync Underwriting|1}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x: auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:0.85em; width:100%;&amp;quot;&lt;br /&gt;
|+ 🛡️ Cyber Insurtech MGA — M&amp;amp;A Opportunity Comparison Table&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Logo&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center; width:80px;&amp;quot; | Company&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Est. GWP&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Total Funding&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Last Known Valuation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Key Shareholders / Investors&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Acquired?&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Link with AXA&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of At-Bay.svg|80px|link=At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[At-Bay]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $380M ARR (Jan 2023)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $292M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $1.35B (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Lightspeed, Khosla, Icon Ventures, Munich Re Ventures, M12, Qumra Capital, Acrew Capital, ION Crossover Partners&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | AXA SA listed as reinsurer in capacity panel&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Baobab Insurance.svg|80px|link=Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Baobab Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €20.1M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Viola FinTech, eCAPITAL, Augmentum Fintech, Project A Ventures, La Famiglia, Discovery Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of BOXX Insurance.svg|80px|link=BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[BOXX Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $24.5M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Zurich Insurance Group (full owner), Cyber Mentor Fund, SixThirty&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Zurich (July 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | AXA collaboration in Spain (Jan 2024, SME cyber risk prevention)&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Coalition.svg|80px|link=Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Coalition]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $775M+ run rate (July 2022)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $770M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $5B (2022)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Allianz X, Index Ventures, Ribbit Capital, T. Rowe Price, Durable Capital, Whale Rock, Valor Equity Partners, General Atlantic&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Historical carrier lineage: Coalition Insurance Company predecessor names include &amp;quot;AXA Art Insurance Corporation&amp;quot; (shell lineage only, no present-day AXA tie)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cogitanda.svg|80px|link=Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cogitanda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | DGC AG (post-insolvency acquirer)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by DGC AG from insolvency (Mar 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Converge Insurance.svg|80px|link=Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Converge Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $20M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Forgepoint Capital, QBE Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Founder Anthony Dagostino departed to AXA XL (Sep 2023)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Corvus Insurance.svg|80px|link=Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Corvus Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $200M+ book&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $162M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~$750M (Series C)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Travelers (full owner), Bain Capital Ventures, Insight Partners, Telstra Ventures, .406 Ventures&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Travelers (~$435M, Jan 2024)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Cowbell.svg|80px|link=Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Cowbell]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $200M+ run rate (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $208.3M+&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Zurich Insurance Group, Anthemis, Permira, Prosperity7, Brewer Lane Ventures, PruVen Capital, NYCA Partners, Viola FinTech, ManchesterStory&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Zurich strategic investor)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Dattak.svg|80px|link=Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Dattak]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €10M (2024); €22M target (2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €18M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | XAnge, Breega, Bpifrance&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | CEO Charlotte Couallier is former AXA France commercial partnerships director; board member Matthieu Bébéar is ex-Chief Business Officer of AXA&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Elpha Secure.svg|80px|link=Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Elpha Secure]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$29M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Canapi Ventures, Stone Point Ventures, AXIS Capital, State Farm Ventures, The Hartford STAG Ventures, Fermat Capital Management, EOS Venture Partners&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Emergence Insurance.svg|80px|link=Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Emergence Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Steadfast Group Limited (33.33%), Hollard Insurance&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Steadfast associate)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Evolve MGA.svg|80px|link=Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Evolve MGA]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None (acquired)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Brown &amp;amp; Brown / Nexus Underwriting (full owner)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Nexus / Brown &amp;amp; Brown (2023)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Historical capacity panel included XL Catlin / AXA XL&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Eye Security.svg|80px|link=Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Eye Security]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | €57.5M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | J.P. Morgan Growth Equity Partners, Bessemer Venture Partners, TIN Capital&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Invision Cyber.svg|80px|link=Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Invision Cyber]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Vector Investment Capital (75%+ control), Correlation Holdings (minority at Acies MGU level)&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Co-founder Stuart Essex formerly Head of UK PI at AXA XL&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Measured Analytics and Insurance.svg|80px|link=Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Measured Analytics and Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Undisclosed (2 rounds)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Signal Peak Ventures, Origin Ventures, Royal Street Ventures, Silicon Valley Data Capital, AV8 Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Onda.svg|80px|link=Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Onda]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Pera.svg|80px|link=Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Pera]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | $3.25M (group seed)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Ryan Specialty (full owner), Maiden Holdings (prior seed)&lt;br /&gt;
| style=&amp;quot;background:#f8d7da; text-align:left;&amp;quot; | Yes — Acquired by Ryan Specialty (May 2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Resilience.svg|80px|link=Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Resilience]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$225M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~$650M (2021)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Intact Ventures, General Catalyst, Lightspeed, Founders Fund, CRV, UL Ventures, Shield Capital&lt;br /&gt;
| style=&amp;quot;background:#fff3cd; text-align:left;&amp;quot; | No — Independent (Intact strategic partner)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of SafeInside Insurance.svg|80px|link=SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[SafeInside Insurance]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &amp;gt;$170M (group)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Avataar Ventures, BT Group, Sorenson Capital, Prosperity7, Eight Roads, Telstra Ventures&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|- style=&amp;quot;background:#f2f2f2;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Stoïk.svg|80px|link=Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Stoïk]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~€50M (2025)&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | ~€69.8M&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Alven, a16z, Munich Re Ventures, Tokio Marine HCC, Impala, Opera Tech Ventures, Anthemis&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Henri de Castries (former AXA CEO) participated as business angel in Series A (June 2022)&lt;br /&gt;
|- style=&amp;quot;background:#ffffff;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | [[File:Logo of Sync Underwriting.svg|80px|link=Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | [[Sync Underwriting]]&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | n.d.&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Rhodian Group (equity), Amwins (minority in Rhodian)&lt;br /&gt;
| style=&amp;quot;background:#d4edda; text-align:left;&amp;quot; | No — Independent&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | None identified&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== At-Bay ==&lt;br /&gt;
{{Summary:At-Bay|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Baobab Insurance ==&lt;br /&gt;
{{Summary:Baobab Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== BOXX Insurance ==&lt;br /&gt;
{{Summary:BOXX Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Coalition ==&lt;br /&gt;
{{Summary:Coalition|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Cogitanda ==&lt;br /&gt;
{{Summary:Cogitanda|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Converge Insurance ==&lt;br /&gt;
{{Summary:Converge Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Corvus Insurance ==&lt;br /&gt;
{{Summary:Corvus Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Cowbell ==&lt;br /&gt;
{{Summary:Cowbell|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Dattak ==&lt;br /&gt;
{{Summary:Dattak|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Elpha Secure ==&lt;br /&gt;
{{Summary:Elpha Secure|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Emergence Insurance ==&lt;br /&gt;
{{Summary:Emergence Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Evolve MGA ==&lt;br /&gt;
{{Summary:Evolve MGA|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Eye Security ==&lt;br /&gt;
{{Summary:Eye Security|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Invision Cyber ==&lt;br /&gt;
{{Summary:Invision Cyber|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Measured Analytics and Insurance ==&lt;br /&gt;
{{Summary:Measured Analytics and Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Onda ==&lt;br /&gt;
{{Summary:Onda|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Pera ==&lt;br /&gt;
{{Summary:Pera|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Resilience ==&lt;br /&gt;
{{Summary:Resilience|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== SafeInside Insurance ==&lt;br /&gt;
{{Summary:SafeInside Insurance|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Stoïk ==&lt;br /&gt;
{{Summary:Stoïk|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Sync Underwriting ==&lt;br /&gt;
{{Summary:Sync Underwriting|5}}&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Glossary ==&lt;br /&gt;
{{#invoke:Glossary|generate}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23025</id>
		<title>Module:Glossary</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Module:Glossary&amp;diff=23025"/>
		<updated>2026-04-12T12:49:55Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: Created page with &amp;quot;-- Module:AutoGlossary local p = {}  function p.generate(frame)     local current = mw.title.getCurrentTitle()     local content = current:getContent() or &amp;quot;&amp;quot;          -- find all internal links     local seen = {}     local entries = {}          for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do         local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link         title = mw.text.trim(title)                  if not seen[title] then             seen[title] = true             local p...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:AutoGlossary&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local current = mw.title.getCurrentTitle()&lt;br /&gt;
    local content = current:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- find all [[internal links]]&lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    &lt;br /&gt;
    for link in content:gmatch(&amp;quot;%[%[([^%]|]+)&amp;quot;) do&lt;br /&gt;
        local title = link:match(&amp;quot;^(.-)#&amp;quot;) or link&lt;br /&gt;
        title = mw.text.trim(title)&lt;br /&gt;
        &lt;br /&gt;
        if not seen[title] then&lt;br /&gt;
            seen[title] = true&lt;br /&gt;
            local page = mw.title.new(title)&lt;br /&gt;
            if page and page.exists then&lt;br /&gt;
                local text = page:getContent() or &amp;quot;&amp;quot;&lt;br /&gt;
                -- strip templates and clean up&lt;br /&gt;
                text = text:gsub(&amp;quot;%b{}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                text = text:gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                -- collect up to 3 sentences&lt;br /&gt;
                local sentences = {}&lt;br /&gt;
                local count = 0&lt;br /&gt;
                for sentence in text:gmatch(&amp;quot;([^%.]+%.)&amp;quot;) do&lt;br /&gt;
                    sentence = mw.text.trim(sentence)&lt;br /&gt;
                    if sentence ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                        count = count + 1&lt;br /&gt;
                        table.insert(sentences, sentence)&lt;br /&gt;
                        if count &amp;gt;= 3 then&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                &lt;br /&gt;
                if #sentences &amp;gt; 0 then&lt;br /&gt;
                    table.insert(entries, {&lt;br /&gt;
                        title = title,&lt;br /&gt;
                        summary = table.concat(sentences, &amp;quot; &amp;quot;)&lt;br /&gt;
                    })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- sort alphabetically&lt;br /&gt;
    table.sort(entries, function(a, b) &lt;br /&gt;
        return a.title &amp;lt; b.title &lt;br /&gt;
    end)&lt;br /&gt;
    &lt;br /&gt;
    -- render&lt;br /&gt;
    local out = {}&lt;br /&gt;
    for _, e in ipairs(entries) do&lt;br /&gt;
        table.insert(out, string.format(&lt;br /&gt;
            &amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;: %s&amp;quot;, e.title, e.summary&lt;br /&gt;
        ))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Common.js&amp;diff=23024</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Common.js&amp;diff=23024"/>
		<updated>2026-04-09T05:29:49Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
/**&lt;br /&gt;
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally&lt;br /&gt;
 * loaded for all users on every wiki page. If possible create a gadget that is&lt;br /&gt;
 * enabled by default instead of adding it here (since gadgets are fully&lt;br /&gt;
 * optimized ResourceLoader modules with possibility to add dependencies etc.)&lt;br /&gt;
 *&lt;br /&gt;
 * Since Common.js isn&#039;t a gadget, there is no place to declare its&lt;br /&gt;
 * dependencies, so we have to lazy load them with mw.loader.using on demand and&lt;br /&gt;
 * then execute the rest in the callback. In most cases these dependencies will&lt;br /&gt;
 * be loaded (or loading) already and the callback will not be delayed. In case a&lt;br /&gt;
 * dependency hasn&#039;t arrived yet it&#039;ll make sure those are loaded before this.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* global mw, $ */&lt;br /&gt;
/* jshint strict:false, browser:true */&lt;br /&gt;
&lt;br /&gt;
mw.loader.using( [ &#039;mediawiki.util&#039; ] ).done( function () {&lt;br /&gt;
	/* Begin of mw.loader.using callback */&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Map addPortletLink to mw.util&lt;br /&gt;
	 * @deprecated: Use mw.util.addPortletLink instead.&lt;br /&gt;
	 */&lt;br /&gt;
	mw.log.deprecate( window, &#039;addPortletLink&#039;, mw.util.addPortletLink, &#039;Use mw.util.addPortletLink instead&#039; );&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL&lt;br /&gt;
	 * @rev 6&lt;br /&gt;
	 */&lt;br /&gt;
	var extraCSS = mw.util.getParamValue( &#039;withCSS&#039; ),&lt;br /&gt;
		extraJS = mw.util.getParamValue( &#039;withJS&#039; );&lt;br /&gt;
&lt;br /&gt;
	if ( extraCSS ) {&lt;br /&gt;
		if ( extraCSS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.css$/ ) ) {&lt;br /&gt;
			mw.loader.load( &#039;/w/index.php?title=&#039; + extraCSS + &#039;&amp;amp;action=raw&amp;amp;ctype=text/css&#039;, &#039;text/css&#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.notify( &#039;Only pages from the MediaWiki namespace are allowed.&#039;, { title: &#039;Invalid withCSS value&#039; } );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( extraJS ) {&lt;br /&gt;
		if ( extraJS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.js$/ ) ) {&lt;br /&gt;
			mw.loader.load( &#039;/w/index.php?title=&#039; + extraJS + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.notify( &#039;Only pages from the MediaWiki namespace are allowed.&#039;, { title: &#039;Invalid withJS value&#039; } );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Collapsible tables; reimplemented with mw-collapsible&lt;br /&gt;
	 * Styling is also in place to avoid FOUC&lt;br /&gt;
	 *&lt;br /&gt;
	 * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].&lt;br /&gt;
	 * @version 3.0.0 (2018-05-20)&lt;br /&gt;
	 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js&lt;br /&gt;
	 * @author [[User:R. Koot]]&lt;br /&gt;
	 * @author [[User:Krinkle]]&lt;br /&gt;
	 * @author [[User:TheDJ]]&lt;br /&gt;
	 * @deprecated Since MediaWiki 1.20: Use class=&amp;quot;mw-collapsible&amp;quot; instead which&lt;br /&gt;
	 * is supported in MediaWiki core. Shimmable since MediaWiki 1.32&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {jQuery} $content&lt;br /&gt;
	 */&lt;br /&gt;
	function makeCollapsibleMwCollapsible( $content ) {&lt;br /&gt;
		var $tables = $content&lt;br /&gt;
			.find( &#039;table.collapsible:not(.mw-collapsible)&#039; )&lt;br /&gt;
			.addClass( &#039;mw-collapsible&#039; );&lt;br /&gt;
&lt;br /&gt;
		$.each( $tables, function ( index, table ) {&lt;br /&gt;
			// mw.log.warn( &#039;This page is using the deprecated class collapsible. Please replace it with mw-collapsible.&#039;);&lt;br /&gt;
			if ( $( table ).hasClass( &#039;collapsed&#039; ) ) {&lt;br /&gt;
				$( table ).addClass( &#039;mw-collapsed&#039; );&lt;br /&gt;
				// mw.log.warn( &#039;This page is using the deprecated class collapsed. Please replace it with mw-collapsed.&#039;);&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		if ( $tables.length &amp;gt; 0 ) {&lt;br /&gt;
			mw.loader.using( &#039;jquery.makeCollapsible&#039; ).then( function () {&lt;br /&gt;
				$tables.makeCollapsible();&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	mw.hook( &#039;wikipage.content&#039; ).add( makeCollapsibleMwCollapsible );&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse&lt;br /&gt;
	 *&lt;br /&gt;
	 * Maintainers: TheDJ&lt;br /&gt;
	 */&lt;br /&gt;
	function mwCollapsibleSetup( $collapsibleContent ) {&lt;br /&gt;
		var $element,&lt;br /&gt;
			$toggle,&lt;br /&gt;
			autoCollapseThreshold = 2;&lt;br /&gt;
		$.each( $collapsibleContent, function ( index, element ) {&lt;br /&gt;
			$element = $( element );&lt;br /&gt;
			if ( $element.hasClass( &#039;collapsible&#039; ) ) {&lt;br /&gt;
				$element.find( &#039;tr:first &amp;gt; th:first&#039; ).prepend( $element.find( &#039;tr:first &amp;gt; * &amp;gt; .mw-collapsible-toggle&#039; ) );&lt;br /&gt;
			}&lt;br /&gt;
			if ( $collapsibleContent.length &amp;gt;= autoCollapseThreshold &amp;amp;&amp;amp; $element.hasClass( &#039;autocollapse&#039; ) ) {&lt;br /&gt;
				$element.data( &#039;mw-collapsible&#039; ).collapse();&lt;br /&gt;
			} else if ( $element.hasClass( &#039;innercollapse&#039; ) ) {&lt;br /&gt;
				if ( $element.parents( &#039;.outercollapse&#039; ).length &amp;gt; 0 ) {&lt;br /&gt;
					$element.data( &#039;mw-collapsible&#039; ).collapse();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// because of colored backgrounds, style the link in the text color&lt;br /&gt;
			// to ensure accessible contrast&lt;br /&gt;
			$toggle = $element.find( &#039;.mw-collapsible-toggle&#039; );&lt;br /&gt;
			if ( $toggle.length ) {&lt;br /&gt;
				// Make the toggle inherit text color (Updated for T333357 2023-04-29)&lt;br /&gt;
				if ( $toggle.parent()[ 0 ].style.color ) {&lt;br /&gt;
					$toggle.css( &#039;color&#039;, &#039;inherit&#039; );&lt;br /&gt;
					$toggle.find( &#039;.mw-collapsible-text&#039; ).css( &#039;color&#039;, &#039;inherit&#039; );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;wikipage.collapsibleContent&#039; ).add( mwCollapsibleSetup );&lt;br /&gt;
&lt;br /&gt;
	/* End of mw.loader.using callback */&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
// CapSach — Sticky TOC overlay (UNRESTRICTED: Works on iPad/Desktop/Mobile)&lt;br /&gt;
(function () {&lt;br /&gt;
  &lt;br /&gt;
  // 1. REMOVED the &amp;quot;min-width: 768px&amp;quot; check. Now runs everywhere.&lt;br /&gt;
&lt;br /&gt;
  // Only run on pages where it makes sense (Articles/MainPage)&lt;br /&gt;
  if (window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; mw.config.get) {&lt;br /&gt;
    var isAllowed = mw.config.get(&#039;wgIsArticle&#039;) || mw.config.get(&#039;wgIsMainPage&#039;);&lt;br /&gt;
    if (!isAllowed) return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Find the content root; MobileFrontend restructures DOM, so be flexible&lt;br /&gt;
  var root =&lt;br /&gt;
    document.querySelector(&#039;#mw-content-text .mw-parser-output&#039;) ||&lt;br /&gt;
    document.querySelector(&#039;.mw-parser-output&#039;) ||&lt;br /&gt;
    document.getElementById(&#039;mw-content-text&#039;) ||&lt;br /&gt;
    document.querySelector(&#039;#content&#039;) ||&lt;br /&gt;
    document.body;&lt;br /&gt;
&lt;br /&gt;
  // Collect headings (H2–H6). Prefer spans with .mw-headline (stable anchor ids)&lt;br /&gt;
  var items = [];&lt;br /&gt;
  var headings = root.querySelectorAll(&#039;h2, h3, h4, h5, h6&#039;);&lt;br /&gt;
  headings.forEach(function (h) {&lt;br /&gt;
    var level = parseInt(h.tagName.slice(1), 10);&lt;br /&gt;
    if (level &amp;lt; 2 || level &amp;gt; 6) return;&lt;br /&gt;
    var headline = h.querySelector(&#039;.mw-headline&#039;) || h;&lt;br /&gt;
    var id = headline.id || h.id;&lt;br /&gt;
    var text = (headline.textContent || h.textContent || &#039;&#039;).trim();&lt;br /&gt;
    if (!id || !text) return;&lt;br /&gt;
    items.push({ id: id, text: text, level: level });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Show only if there are enough headings to be useful&lt;br /&gt;
  // CHANGED: Lowered requirement to 1 heading so it always shows if there is any structure&lt;br /&gt;
  if (items.length &amp;lt; 1) return;&lt;br /&gt;
&lt;br /&gt;
  // Create trigger button (bottom-left; avoids “Back to top” on bottom-right)&lt;br /&gt;
  var btn = document.createElement(&#039;button&#039;);&lt;br /&gt;
  btn.id = &#039;cps-open-toc&#039;;&lt;br /&gt;
  btn.type = &#039;button&#039;;&lt;br /&gt;
  btn.setAttribute(&#039;aria-label&#039;, &#039;Open table of contents&#039;);&lt;br /&gt;
  btn.innerHTML = &#039;&amp;lt;span class=&amp;quot;icon&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;≡&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;TOC&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
  document.body.appendChild(btn);&lt;br /&gt;
&lt;br /&gt;
  // Overlay + panel&lt;br /&gt;
  var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
  overlay.id = &#039;cps-toc-overlay&#039;;&lt;br /&gt;
  overlay.setAttribute(&#039;aria-hidden&#039;, &#039;true&#039;);&lt;br /&gt;
&lt;br /&gt;
  var panel = document.createElement(&#039;div&#039;);&lt;br /&gt;
  panel.id = &#039;cps-toc-panel&#039;;&lt;br /&gt;
  panel.setAttribute(&#039;role&#039;, &#039;dialog&#039;);&lt;br /&gt;
  panel.setAttribute(&#039;aria-modal&#039;, &#039;true&#039;);&lt;br /&gt;
  panel.setAttribute(&#039;aria-label&#039;, &#039;Table of contents&#039;);&lt;br /&gt;
&lt;br /&gt;
  var header = document.createElement(&#039;div&#039;);&lt;br /&gt;
  header.id = &#039;cps-toc-header&#039;;&lt;br /&gt;
  header.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;h2 id=&amp;quot;cps-toc-title&amp;quot;&amp;gt;Contents&amp;lt;/h2&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;button id=&amp;quot;cps-toc-close&amp;quot; type=&amp;quot;button&amp;quot; aria-label=&amp;quot;Close&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var list = document.createElement(&#039;ul&#039;);&lt;br /&gt;
  list.id = &#039;cps-toc-list&#039;;&lt;br /&gt;
&lt;br /&gt;
  items.forEach(function (it) {&lt;br /&gt;
    var li = document.createElement(&#039;li&#039;);&lt;br /&gt;
    li.setAttribute(&#039;data-level&#039;, String(it.level));&lt;br /&gt;
    var a = document.createElement(&#039;a&#039;);&lt;br /&gt;
    a.href = &#039;#&#039; + it.id;&lt;br /&gt;
    a.textContent = it.text;&lt;br /&gt;
    li.appendChild(a);&lt;br /&gt;
    list.appendChild(li);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  panel.appendChild(header);&lt;br /&gt;
  panel.appendChild(list);&lt;br /&gt;
  overlay.appendChild(panel);&lt;br /&gt;
  document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
  // Focus handling&lt;br /&gt;
  var lastFocus = null;&lt;br /&gt;
  function openOverlay() {&lt;br /&gt;
    lastFocus = document.activeElement;&lt;br /&gt;
    overlay.classList.add(&#039;is-open&#039;);&lt;br /&gt;
    overlay.setAttribute(&#039;aria-hidden&#039;, &#039;false&#039;);&lt;br /&gt;
    document.body.style.overflow = &#039;hidden&#039;;&lt;br /&gt;
    // Focus first link for accessibility&lt;br /&gt;
    var firstLink = list.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (firstLink) firstLink.focus({ preventScroll: true });&lt;br /&gt;
  }&lt;br /&gt;
  function closeOverlay() {&lt;br /&gt;
    overlay.classList.remove(&#039;is-open&#039;);&lt;br /&gt;
    overlay.setAttribute(&#039;aria-hidden&#039;, &#039;true&#039;);&lt;br /&gt;
    document.body.style.overflow = &#039;&#039;;&lt;br /&gt;
    if (lastFocus &amp;amp;&amp;amp; lastFocus.focus) lastFocus.focus({ preventScroll: true });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Force button display immediately&lt;br /&gt;
  btn.style.display = &#039;flex&#039;; &lt;br /&gt;
  btn.addEventListener(&#039;click&#039;, openOverlay);&lt;br /&gt;
&lt;br /&gt;
  overlay.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
    // Click outside the bottom sheet closes&lt;br /&gt;
    if (e.target === overlay) closeOverlay();&lt;br /&gt;
  });&lt;br /&gt;
  overlay.querySelector(&#039;#cps-toc-close&#039;).addEventListener(&#039;click&#039;, closeOverlay);&lt;br /&gt;
&lt;br /&gt;
  overlay.addEventListener(&#039;keydown&#039;, function (e) {&lt;br /&gt;
    if (e.key === &#039;Escape&#039;) closeOverlay();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Navigate and try to ensure mobile-collapsed sections are visible&lt;br /&gt;
// Navigate and try to ensure mobile-collapsed sections are visible&lt;br /&gt;
  list.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
    var a = e.target.closest(&#039;a&#039;);&lt;br /&gt;
    if (!a) return;&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    var targetId = a.getAttribute(&#039;href&#039;).slice(1);&lt;br /&gt;
&lt;br /&gt;
    // === NEW LOGIC START: Scroll to Top for &amp;quot;Contents&amp;quot; ===&lt;br /&gt;
    // If the user clicks the &amp;quot;Contents&amp;quot; header (id=&amp;quot;mw-toc-heading&amp;quot;), scroll to top (0,0)&lt;br /&gt;
// === FIXED CODE ===&lt;br /&gt;
if (targetId === &#039;mw-toc-heading&#039;) {&lt;br /&gt;
   closeOverlay();&lt;br /&gt;
   // Delay scroll to let iOS Safari process the overflow change&lt;br /&gt;
   setTimeout(function() {&lt;br /&gt;
       try {&lt;br /&gt;
           window.scrollTo({ top: 0, behavior: &#039;smooth&#039; });&lt;br /&gt;
       } catch (e) {&lt;br /&gt;
           window.scrollTo(0, 0);&lt;br /&gt;
       }&lt;br /&gt;
       // Fallback for older iOS Safari&lt;br /&gt;
       document.documentElement.scrollTop = 0;&lt;br /&gt;
       document.body.scrollTop = 0;&lt;br /&gt;
   }, 100);&lt;br /&gt;
   if (history.replaceState) {&lt;br /&gt;
       history.replaceState(null, &#039;&#039;, window.location.pathname + window.location.search);&lt;br /&gt;
   }&lt;br /&gt;
   return;&lt;br /&gt;
}&lt;br /&gt;
    // === NEW LOGIC END ===&lt;br /&gt;
&lt;br /&gt;
    var target = document.getElementById(targetId);&lt;br /&gt;
    closeOverlay();&lt;br /&gt;
&lt;br /&gt;
    if (target) {&lt;br /&gt;
      try {&lt;br /&gt;
        target.scrollIntoView({ behavior: &#039;smooth&#039;, block: &#039;start&#039; });&lt;br /&gt;
      } catch (_) {&lt;br /&gt;
        target.scrollIntoView(true);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Update URL hash after a tick (so browser back works)&lt;br /&gt;
      setTimeout(function () {&lt;br /&gt;
        if (history &amp;amp;&amp;amp; history.replaceState) {&lt;br /&gt;
          history.replaceState(null, &#039;&#039;, &#039;#&#039; + targetId);&lt;br /&gt;
        } else {&lt;br /&gt;
          location.hash = targetId;&lt;br /&gt;
        }&lt;br /&gt;
      }, 200);&lt;br /&gt;
&lt;br /&gt;
      // MobileFrontend: headings may be inside collapsed sections.&lt;br /&gt;
      // Heuristic: click the nearest toggle if present.&lt;br /&gt;
      var maybeToggle = target.closest(&#039;.collapsible-block, .mf-section&#039;) ||&lt;br /&gt;
                        target.closest(&#039;section&#039;);&lt;br /&gt;
      if (maybeToggle &amp;amp;&amp;amp; maybeToggle.classList.contains(&#039;collapsed&#039;)) {&lt;br /&gt;
        // Try to open; fallback by clicking the first heading inside&lt;br /&gt;
        var headingToggle = maybeToggle.querySelector(&#039;.section-heading, h2, h3, h4, h5, h6&#039;);&lt;br /&gt;
        if (headingToggle) headingToggle.click();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // 2. REMOVED the &amp;quot;resize&amp;quot; event listener that was hiding the button.&lt;br /&gt;
  // The button now persists on all screen sizes.&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/* Script for Inline Expandable Template */&lt;br /&gt;
$(function() {&lt;br /&gt;
    $(&#039;.inline-expand-trigger&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        // 1. Toggle the content visibility&lt;br /&gt;
        $(this).next(&#039;.inline-expand-content&#039;).toggle();&lt;br /&gt;
&lt;br /&gt;
        // 2. Toggle the arrow icon&lt;br /&gt;
        const currentText = $(this).text();&lt;br /&gt;
        $(this).text(&lt;br /&gt;
            currentText.includes(&#039;▸&#039;) ? currentText.replace(&#039;▸&#039;, &#039;◂&#039;) : currentText.replace(&#039;◂&#039;, &#039;▸&#039;)&lt;br /&gt;
        );&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Check if the button already exists to prevent duplicates&lt;br /&gt;
    if ($(&#039;#custom-email-btn&#039;).length === 0) {&lt;br /&gt;
        &lt;br /&gt;
        // Create the email button element&lt;br /&gt;
        var emailBtn = $(&#039;&amp;lt;a&amp;gt;&#039;, {&lt;br /&gt;
            id: &#039;custom-email-btn&#039;,&lt;br /&gt;
            href: &#039;mailto:bananabot@axabrain.com&#039;,&lt;br /&gt;
            // Simple accessible title&lt;br /&gt;
            title: &#039;Contact AXA BRAIN Services&#039;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Add it to the body of the page&lt;br /&gt;
        $(&#039;body&#039;).append(emailBtn);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* Open AXA BRAIN AI Assistant when clicking the logo */&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;.fullscreen-logo&#039;).css(&#039;cursor&#039;, &#039;pointer&#039;).click(function(e) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        &lt;br /&gt;
        // Method 1: Click the AI Assistant floating icon&lt;br /&gt;
        var $aiButton = $(&#039;img[src*=&amp;quot;ai-icon.png&amp;quot;]&#039;).closest(&#039;div, button, a&#039;);&lt;br /&gt;
        if ($aiButton.length &amp;gt; 0) {&lt;br /&gt;
            $aiButton.trigger(&#039;click&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Method 2: Try the extension&#039;s trigger class&lt;br /&gt;
        var $trigger = $(&#039;.ext-aiassistant-trigger, .ext-aiassistant&#039;);&lt;br /&gt;
        if ($trigger.length &amp;gt; 0) {&lt;br /&gt;
            $trigger.first().trigger(&#039;click&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        console.log(&amp;quot;AXA BRAIN Assistant button not found on this page.&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_variable_fee_approach&amp;diff=23023</id>
		<title>Internal:Training/IFRS17/The variable fee approach</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_variable_fee_approach&amp;diff=23023"/>
		<updated>2026-04-06T18:09:24Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:Premium allocation approach|premium allocation approach]] simplifies measurement for short-duration contracts. Now we turn to the other end of the spectrum: long-duration contracts where the [[Definition:Policyholder|policyholder&#039;s]] returns are tied to [[Definition:Underlying items|underlying items]], and where a different modification of the [[Definition:General model|general model]] is needed to reflect their unique economics.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* What [[Definition:Direct participating contracts|direct participating contracts]] are and why they behave differently from traditional [[Definition:Insurance contract|insurance contracts]].&lt;br /&gt;
* How the variable fee concept modifies the [[Definition:General model|general model]] by treating changes in the insurer&#039;s share of [[Definition:Underlying items|underlying items]] as an adjustment to the [[Definition:Contractual service margin|CSM]] rather than sending them to [[Definition:Profit and loss|profit or loss]].&lt;br /&gt;
* What the three eligibility criteria are that a contract must satisfy before the [[Definition:Variable fee approach|variable fee approach]] can be applied.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== What are direct participating contracts ==&lt;br /&gt;
&lt;br /&gt;
🤝 &#039;&#039;&#039;A different kind of promise.&#039;&#039;&#039; Not all [[Definition:Insurance contract|insurance contracts]] work like the traditional policies we have studied so far. In a traditional contract, the insurer promises a fixed or formulaic benefit: if your house burns down, you receive the repair cost; if you die during the [[Definition:Coverage period|coverage period]], your family receives a set sum. But some contracts make a fundamentally different promise. They tell the [[Definition:Policyholder|policyholder]]: &amp;quot;We will invest a pool of [[Definition:Underlying items|underlying items]] on your behalf, you will receive a substantial share of the returns from those items, and we will also provide you with [[Definition:Insurance coverage|insurance coverage]].&amp;quot; These are [[Definition:Direct participating contracts|direct participating contracts]], and they sit at the heart of many [[Definition:Life insurance|life insurance]] and [[Definition:Savings contract|savings]] products sold across Europe.&lt;br /&gt;
&lt;br /&gt;
💼 &#039;&#039;&#039;A familiar product.&#039;&#039;&#039; If you have encountered [[Definition:Unit-linked contract|unit-linked]] life insurance or [[Definition:With-profits contract|with-profits]] endowment policies, you have already met direct participating contracts in practice. Consider a with-profits savings product sold in France: the [[Definition:Policyholder|policyholder]] pays [[Definition:Premium|premiums]] that are invested in a pool of [[Definition:Bonds|bonds]], [[Definition:Equities|equities]], and [[Definition:Real estate|real estate]]. Each year, the policyholder receives a share of the [[Definition:Investment return|investment returns]] generated by that pool, plus a guaranteed minimum. AXA, as the insurer, retains a fee for managing the assets and bearing the [[Definition:Insurance risk|insurance risk]]. The policyholder&#039;s benefit is not fixed in advance; it depends directly on how the [[Definition:Underlying items|underlying items]] perform.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners sometimes assume that any contract with an [[Definition:Investment component|investment component]] qualifies as a [[Definition:Direct participating contracts|direct participating contract]]. That is not the case. The defining feature is not merely the presence of an investment element, but the fact that the [[Definition:Policyholder|policyholder]] is promised a substantial share of the returns on a clearly identified pool of [[Definition:Underlying items|underlying items]]. A [[Definition:Term life insurance|term life]] contract with a small cash-value rider, for example, would not typically qualify.&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Why traditional accounting falls short.&#039;&#039;&#039; Under the [[Definition:General model|general model]], changes in [[Definition:Financial risk|financial assumptions]], such as shifts in [[Definition:Interest rates|interest rates]] or [[Definition:Equity|equity]] prices, flow through to the [[Definition:Income statement|income statement]] or [[Definition:Other comprehensive income|OCI]]. For a traditional contract, that treatment makes sense: the insurer bears the financial risk. But for a [[Definition:Direct participating contracts|direct participating contract]], the insurer is essentially acting as an asset manager who also provides [[Definition:Insurance coverage|insurance coverage]]. When the value of [[Definition:Underlying items|underlying items]] rises, the policyholder&#039;s benefit rises too, and the insurer&#039;s share, its fee, adjusts accordingly. Forcing these financial movements into the [[Definition:Income statement|income statement]] would create artificial [[Definition:Volatility|volatility]] that does not reflect the real economics of the relationship.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the [[Definition:General model|general model]] creates misleading [[Definition:Volatility|volatility]] for these contracts, how might IFRS 17 redesign the mechanics to better reflect the insurer&#039;s true economics?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;gm-paa&amp;quot; data-wix-config=&#039;{&amp;quot;mode&amp;quot;:&amp;quot;vfa&amp;quot;}&#039;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The variable fee concept: how VFA modifies the general model ==&lt;br /&gt;
&lt;br /&gt;
💡 &#039;&#039;&#039;Reframing the insurer&#039;s role.&#039;&#039;&#039; The key insight behind the [[Definition:Variable fee approach|variable fee approach]] is that, for [[Definition:Direct participating contracts|direct participating contracts]], the insurer&#039;s profit is best understood as a variable fee charged for services rendered. That fee has two parts: a share of the returns on [[Definition:Underlying items|underlying items]], and compensation for providing [[Definition:Insurance coverage|insurance coverage]] and [[Definition:Investment management services|investment management services]]. Instead of treating changes in [[Definition:Underlying items|underlying items]] as [[Definition:Insurance finance income or expense|financial income or expense]] that hits the [[Definition:Income statement|income statement]], the [[Definition:Variable fee approach|VFA]] routes the insurer&#039;s share of those changes through the [[Definition:Contractual service margin|CSM]]. The result is a smoother, more representative [[Definition:Profit|profit]] pattern.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;How the mechanics differ.&#039;&#039;&#039; Recall that under the [[Definition:General model|general model]], changes in [[Definition:Financial risk|financial assumptions]] (such as [[Definition:Discount rate|discount rates]] or [[Definition:Market returns|market returns]]) do not adjust the [[Definition:Contractual service margin|CSM]]; they flow to the [[Definition:Income statement|income statement]] or [[Definition:Other comprehensive income|OCI]]. The [[Definition:Variable fee approach|VFA]] changes this rule for [[Definition:Direct participating contracts|direct participating contracts]]. Suppose AXA manages a with-profits portfolio in Belgium backed by a pool of [[Definition:Underlying items|underlying items]] worth €500 million. If [[Definition:Equity|equity]] markets rise and the pool&#039;s value increases by €25 million, the [[Definition:Policyholder|policyholders]] are entitled to, say, 90% of that gain (€22.5 million), and the insurer&#039;s share is 10% (€2.5 million). Under the [[Definition:Variable fee approach|VFA]], that €2.5 million increase in the insurer&#039;s share adjusts the [[Definition:Contractual service margin|CSM]] upward. It will be released as [[Definition:Insurance revenue|insurance revenue]] over future periods as the insurer continues to provide service.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A common error is believing that the [[Definition:Variable fee approach|VFA]] eliminates all [[Definition:Volatility|volatility]] from the [[Definition:Income statement|income statement]]. It does not. Changes in [[Definition:Non-financial risk|non-financial assumptions]], such as revised [[Definition:Mortality|mortality]] or [[Definition:Lapse rate|lapse]] expectations, are treated the same way as under the [[Definition:General model|general model]]: changes relating to future service still adjust the [[Definition:Contractual service margin|CSM]], but changes relating to current or past service still go to [[Definition:Profit and loss|profit or loss]]. What the [[Definition:Variable fee approach|VFA]] specifically adds is the routing of [[Definition:Financial risk|financial]] changes through the [[Definition:Contractual service margin|CSM]], something the general model does not permit.&lt;br /&gt;
&lt;br /&gt;
🔎 &#039;&#039;&#039;Seeing it in context.&#039;&#039;&#039; To appreciate why this matters, imagine the Belgian portfolio at year-end after a sharp stock market decline. The pool&#039;s value drops by €30 million. Policyholders absorb €27 million (90%), and the insurer&#039;s share falls by €3 million. Under the [[Definition:General model|general model]], that €3 million would hit the [[Definition:Income statement|income statement]] immediately, creating a visible loss even though the insurer&#039;s long-term fee structure is unchanged. Under the [[Definition:Variable fee approach|VFA]], the €3 million reduces the [[Definition:Contractual service margin|CSM]] instead. As long as the [[Definition:Contractual service margin|CSM]] remains positive, the insurer simply recognises less [[Definition:Profit|profit]] in future periods, matching the economics of a fee that fluctuates with the assets it manages.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; The [[Definition:Variable fee approach|VFA]] clearly suits contracts where [[Definition:Policyholder|policyholders]] share in [[Definition:Investment return|investment returns]]. But not every contract with some participation feature qualifies. How does IFRS 17 draw the line between contracts that may use the [[Definition:Variable fee approach|VFA]] and those that must stay under the [[Definition:General model|general model]]?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Scope and the three eligibility criteria ==&lt;br /&gt;
&lt;br /&gt;
📏 &#039;&#039;&#039;A strict gateway.&#039;&#039;&#039; IFRS 17 does not allow insurers to choose the [[Definition:Variable fee approach|variable fee approach]] freely. A contract must satisfy three criteria at [[Definition:Inception|inception]], and all three must be met simultaneously. If even one fails, the contract must be measured under the [[Definition:General model|general model]] (or the [[Definition:Premium allocation approach|PAA]] if eligible). The three criteria are designed to ensure that the contract genuinely represents a fee-for-service arrangement tied to [[Definition:Underlying items|underlying items]], rather than a traditional contract with a thin investment wrapper.&lt;br /&gt;
&lt;br /&gt;
1️⃣ &#039;&#039;&#039;Criterion one: a specified pool of underlying items.&#039;&#039;&#039; The contractual terms must specify that the [[Definition:Policyholder|policyholder]] participates in the returns of a clearly identified pool of [[Definition:Underlying items|underlying items]]. These items might be a portfolio of [[Definition:Bonds|bonds]], an [[Definition:Equity fund|equity fund]], a basket of [[Definition:Real estate|real estate]] holdings, or any other identifiable collection of [[Definition:Assets|assets]], [[Definition:Liabilities|liabilities]], or a combination. The pool must be identifiable; a vague reference to &amp;quot;the insurer&#039;s general investment portfolio&amp;quot; would not qualify. For example, a [[Definition:Unit-linked contract|unit-linked]] product in Italy where each policyholder&#039;s account is linked to a named fund of European [[Definition:Equities|equities]] clearly satisfies this criterion.&lt;br /&gt;
&lt;br /&gt;
2️⃣ &#039;&#039;&#039;Criterion two: a substantial share of fair value returns.&#039;&#039;&#039; The insurer must expect to pay the [[Definition:Policyholder|policyholder]] a substantial share of the [[Definition:Fair value|fair value]] returns on those [[Definition:Underlying items|underlying items]]. &amp;quot;Substantial&amp;quot; is not defined as a specific percentage, but the standard requires that the policyholder&#039;s share be significant enough that the contract is genuinely participatory. A product that promises the policyholder 90% of the returns on an identified [[Definition:Bond fund|bond fund]] easily meets this test. A product that promises only 5% of returns, with 95% retained by the insurer, would not, because the policyholder&#039;s participation is not substantial.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners interpret &amp;quot;substantial share&amp;quot; as meaning the policyholder must receive the majority (over 50%) of the returns. The standard does not set a fixed threshold. What matters is the overall economic substance: the policyholder&#039;s share must be large enough that the contract&#039;s [[Definition:Cash flows|cash flows]] are expected to vary substantially with the performance of the [[Definition:Underlying items|underlying items]]. The assessment is made at [[Definition:Inception|inception]] and considers the full range of scenarios, not just the most likely outcome.&lt;br /&gt;
&lt;br /&gt;
3️⃣ &#039;&#039;&#039;Criterion three: substantial variability with underlying items.&#039;&#039;&#039; The insurer must expect that a substantial proportion of any change in the amounts paid to the [[Definition:Policyholder|policyholder]] will vary with the change in [[Definition:Fair value|fair value]] of the [[Definition:Underlying items|underlying items]]. This criterion zooms in on the variability of the total benefit, not just the existence of participation. Consider a product that offers both a guaranteed floor and a participation feature. If the guarantee is so generous that the policyholder will almost always receive the guaranteed amount regardless of how the [[Definition:Underlying items|underlying items]] perform, then the benefit does not substantially vary with those items, and criterion three fails. The contract might look participatory, but the guarantee dominates the economics, making the [[Definition:General model|general model]] more appropriate.&lt;br /&gt;
&lt;br /&gt;
🧩 &#039;&#039;&#039;Putting the pieces together.&#039;&#039;&#039; All three criteria work as a single gate. A [[Definition:With-profits contract|with-profits]] savings product at an insurer like AXA that names a specific asset pool, promises the policyholder 85% of the returns, and has only a modest minimum guarantee would typically pass all three tests and qualify for the [[Definition:Variable fee approach|VFA]]. Conversely, a [[Definition:Guaranteed annuity|guaranteed annuity]] product that happens to hold an identifiable asset pool but promises the policyholder a fixed benefit regardless of performance would fail criteria two and three, even though criterion one is met. The three criteria ensure that the [[Definition:Variable fee approach|VFA]] is reserved for contracts where the insurer truly acts as a fee-collecting service provider, not a traditional risk bearer.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* [[Definition:Direct participating contracts|Direct participating contracts]] promise the [[Definition:Policyholder|policyholder]] a substantial share of the returns on a specified pool of [[Definition:Underlying items|underlying items]], making the insurer&#039;s profit function like a variable fee for service.&lt;br /&gt;
* The [[Definition:Variable fee approach|VFA]] modifies the [[Definition:General model|general model]] by routing the insurer&#039;s share of changes in [[Definition:Underlying items|underlying items]] through the [[Definition:Contractual service margin|CSM]], producing a profit pattern that reflects the economics of a fee-based relationship rather than creating artificial [[Definition:Volatility|volatility]].&lt;br /&gt;
* A contract qualifies for the [[Definition:Variable fee approach|VFA]] only if it meets all three eligibility criteria at [[Definition:Inception|inception]]: a specified pool of [[Definition:Underlying items|underlying items]], a substantial policyholder share of returns, and substantial variability of benefits with those items.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The variable fee approach/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23022</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23022"/>
		<updated>2026-04-06T18:07:56Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 340px;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 19px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 22px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.25rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
   Binary classification: &amp;quot;Adjusts CSM&amp;quot; vs &amp;quot;Hits P&amp;amp;L directly&amp;quot;.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 78. Decision Rule Banner ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-rule {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  background: #fefce8;&lt;br /&gt;
  border: 1px solid #fde68a;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 79. Score Badges ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-score-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  padding: 0.3rem 0.65rem;&lt;br /&gt;
  border-radius: 20px;&lt;br /&gt;
  border: 1px solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 80. Scenario Card ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-num {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-text {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-icon {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0.85rem;&lt;br /&gt;
  right: 0.85rem;&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card--correct { border-color: var(--wix-correct); }&lt;br /&gt;
.wix-is-card--wrong   { border-color: var(--wix-wrong); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 81. Choice Buttons ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px dashed;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    transform   0.15s ease,&lt;br /&gt;
    box-shadow  0.15s ease,&lt;br /&gt;
    background  0.15s ease;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:hover {&lt;br /&gt;
  transform: scale(1.02);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:active {&lt;br /&gt;
  transform: scale(0.98);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:disabled {&lt;br /&gt;
  opacity: 0.45;&lt;br /&gt;
  cursor: default;&lt;br /&gt;
  transform: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-icon { font-size: 1.4em; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-sub {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--csm {&lt;br /&gt;
  border-color: #bfdbfe;&lt;br /&gt;
  background: #eff6ff;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--csm .wix-is-choice-title { color: #2563eb; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--pl {&lt;br /&gt;
  border-color: #fecaca;&lt;br /&gt;
  background: #fef2f2;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--pl .wix-is-choice-title { color: #dc2626; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 82. Feedback Panel ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border: 1px solid var(--wix-correct-border, #82e0aa);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border: 1px solid var(--wix-wrong-border, #f1948a);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-fb-head {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin-bottom: 0.25rem;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 83. Final Screen ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-final {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  padding: 2rem 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-icon { font-size: 2.5rem; margin-bottom: 0.65rem; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-body {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  max-width: 500px;&lt;br /&gt;
  margin: 0 auto 1.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 84. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-is-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
   Sort 9 items into 3 IFRS 17 income statement sections.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
/* ── category colour tokens (scoped) ── */&lt;br /&gt;
[data-wix-module=&amp;quot;income-builder&amp;quot;] {&lt;br /&gt;
  --ib-rev:        #1d4ed8;&lt;br /&gt;
  --ib-rev-bg:     #eff6ff;&lt;br /&gt;
  --ib-rev-border: #bfdbfe;&lt;br /&gt;
  --ib-exp:        #b45309;&lt;br /&gt;
  --ib-exp-bg:     #fffbeb;&lt;br /&gt;
  --ib-exp-border: #fde68a;&lt;br /&gt;
  --ib-fin:        #7c3aed;&lt;br /&gt;
  --ib-fin-bg:     #f5f3ff;&lt;br /&gt;
  --ib-fin-border: #ddd6fe;&lt;br /&gt;
  --ib-res:        #15803d;&lt;br /&gt;
  --ib-res-bg:     #f0fdf4;&lt;br /&gt;
  --ib-res-border: #bbf7d0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 85. Tile (current item) ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.55rem 0.9rem;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile-desc {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  padding-left: 0.15rem;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 86. Choice Buttons (3-column) ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice {&lt;br /&gt;
  padding: 0.65rem 0.4rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px solid;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: transform 0.15s, opacity 0.15s;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice:active { transform: scale(0.97); }&lt;br /&gt;
.wix-ib-choice:disabled { opacity: 0.45; cursor: default; transform: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice--rev { background: var(--ib-rev-bg); border-color: var(--ib-rev-border); color: var(--ib-rev); }&lt;br /&gt;
.wix-ib-choice--exp { background: var(--ib-exp-bg); border-color: var(--ib-exp-border); color: var(--ib-exp); }&lt;br /&gt;
.wix-ib-choice--fin { background: var(--ib-fin-bg); border-color: var(--ib-fin-border); color: var(--ib-fin); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 87. Income Statement Skeleton ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-stmt {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.45rem;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-title {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-count {&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 88. Drop Area + Placed Chips ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop {&lt;br /&gt;
  min-height: 40px;&lt;br /&gt;
  border: 2px dashed var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.4rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop-ph {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: #b0b0b0;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  padding: 0.2rem 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.25rem;&lt;br /&gt;
  padding: 0.3rem 0.6rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.74em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip--rev { background: var(--ib-rev-bg); color: var(--ib-rev); border: 1px solid var(--ib-rev-border); }&lt;br /&gt;
.wix-ib-chip--exp { background: var(--ib-exp-bg); color: var(--ib-exp); border: 1px solid var(--ib-exp-border); }&lt;br /&gt;
.wix-ib-chip--fin { background: var(--ib-fin-bg); color: var(--ib-fin); border: 1px solid var(--ib-fin-border); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 89. Result Row ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result {&lt;br /&gt;
  background: var(--ib-res-bg);&lt;br /&gt;
  border-bottom: 1px solid var(--ib-res-border);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-eq {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 90. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ib-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GM vs PAA / VFA STEPPER — data-wix-module=&amp;quot;gm-paa&amp;quot;&lt;br /&gt;
   Side-by-side table: step through General Model vs PAA or VFA.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
[data-wix-module=&amp;quot;gm-paa&amp;quot;] {&lt;br /&gt;
  --gp-gm:  #1a5276;&lt;br /&gt;
  --gp-alt: #6b4c8a;&lt;br /&gt;
  --gp-alt-light: #f3eef8;&lt;br /&gt;
  --gp-yes: #217a4b;&lt;br /&gt;
  --gp-no:  #b8423a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* VFA variant overrides (applied via JS-set class) */&lt;br /&gt;
[data-wix-module=&amp;quot;gm-paa&amp;quot;].wix-gp--vfa {&lt;br /&gt;
  --gp-alt: #7a4422;&lt;br /&gt;
  --gp-alt-light: #f5ede6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 91. Scenario Callout ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-scenario {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  background: #fdf6e0;&lt;br /&gt;
  border: 1px solid #e6d9a0;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  color: #6b5a10;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 92. Comparison Table ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-table {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-thead {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 80px 80px;&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  border-bottom: 2px solid var(--wix-border);&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th--gm  { color: var(--gp-gm); }&lt;br /&gt;
.wix-gp-th--alt { color: var(--gp-alt); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 93. Row ────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 80px 80px;&lt;br /&gt;
  padding: 0 1rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  padding: 0.65rem 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  transition: color 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row--revealed .wix-gp-row-label { color: var(--wix-text); }&lt;br /&gt;
.wix-gp-row--current { background: var(--gp-alt-light); }&lt;br /&gt;
.wix-gp-row--current .wix-gp-row-label { font-weight: 600; }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-num {&lt;br /&gt;
  font-size: 0.65em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  width: 18px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-mark {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  padding: 0.65rem 0;&lt;br /&gt;
  font-size: 1.05em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  opacity: 0;&lt;br /&gt;
  transition: opacity 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row--revealed .wix-gp-mark { opacity: 1; }&lt;br /&gt;
.wix-gp-mark--yes { color: var(--gp-yes); }&lt;br /&gt;
.wix-gp-mark--no  { color: var(--gp-no); }&lt;br /&gt;
.wix-gp-mark--mod { color: var(--gp-alt); font-size: 0.7em; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 94. Explanation Box ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  min-height: 44px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain-step {&lt;br /&gt;
  font-size: 0.64em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--gp-alt);&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain-body {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 95. Counters Row ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-counters {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-num {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  transition: color 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-num--kept { color: var(--gp-yes); }&lt;br /&gt;
.wix-gp-cbox-num--skip { color: var(--gp-no); }&lt;br /&gt;
.wix-gp-cbox-num--pct  { color: var(--gp-alt); }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-lbl {&lt;br /&gt;
  font-size: 0.62em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  margin-top: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 96. Controls ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 97. Footnote ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-footnote {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 98. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 520px) {&lt;br /&gt;
  .wix-gp-thead,&lt;br /&gt;
  .wix-gp-row {&lt;br /&gt;
    grid-template-columns: 1fr 64px 64px;&lt;br /&gt;
    padding-left: 0.6rem;&lt;br /&gt;
    padding-right: 0.6rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23021</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23021"/>
		<updated>2026-04-06T18:07:35Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   - &amp;quot;impact-sort&amp;quot;       Binary classification: CSM vs P&amp;amp;L scenario sorter&lt;br /&gt;
   - &amp;quot;income-builder&amp;quot;    Sort 9 items into IFRS 17 income statement sections&lt;br /&gt;
   - &amp;quot;gm-paa&amp;quot;            Step-through comparison: General Model vs PAA&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks,&lt;br /&gt;
    &#039;impact-sort&#039;:          initImpactSort,&lt;br /&gt;
    &#039;income-builder&#039;:       initIncomeBuilder,&lt;br /&gt;
    &#039;gm-paa&#039;:               initGmPaa&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
     Binary classification exercise: does the scenario adjust the CSM&lt;br /&gt;
     or hit P&amp;amp;L directly?  Six shuffled cards, score tracking, and a&lt;br /&gt;
     final results screen.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initImpactSort( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Scenario data ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var SCENARIOS = [&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a new longevity study shows policyholders are living &amp;lt;strong&amp;gt;2\u00A0years longer&amp;lt;/strong&amp;gt; than assumed \u2014 expected death claims over the remaining coverage period fall by \u20AC12M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;This change relates to mortality expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period \u2014 service the insurer has &amp;lt;strong&amp;gt;not yet delivered&amp;lt;/strong&amp;gt;. Because it concerns future service, the \u20AC12M favourable change increases the CSM, and will be released as profit gradually as coverage continues.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? No \u2014 these are death claims expected &amp;lt;em&amp;gt;in the future&amp;lt;/em&amp;gt;, over the remaining life of the policies. Because it concerns future service, the \u20AC12M favourable change increases the CSM rather than appearing in P&amp;amp;L immediately.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCB0&#039;,&lt;br /&gt;
        text: &#039;AXA Belgium unit-linked savings contracts: revised data shows policyholder lapse rates will &amp;lt;strong&amp;gt;rise by 15%&amp;lt;/strong&amp;gt; over the remaining contract term, reducing expected future fee income by \u20AC8M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;Unfavourable changes about future service are absorbed by the CSM, just like favourable ones. The CSM decreases by \u20AC8M because fewer policyholders will stay to generate fees. The CSM acts as a buffer in both directions \u2014 as long as it stays at or above zero.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;The change relates to lapses that have &amp;lt;em&amp;gt;not yet happened&amp;lt;/em&amp;gt; \u2014 it\u2019s about future service. The fees lost are fees the insurer has not yet earned. Unfavourable changes about the future are absorbed by the CSM (decreasing it by \u20AC8M). The key: the service hasn\u2019t been provided yet.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83C\uDFE5&#039;,&lt;br /&gt;
        text: &#039;AXA Germany group disability portfolio: a large employer reports a &amp;lt;strong&amp;gt;cluster of 40 new disability claims&amp;lt;/strong&amp;gt; during the current reporting quarter, all arising from a factory closure this year.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The insurer was providing disability coverage when these claims were incurred \u2014 the service has &amp;lt;strong&amp;gt;already been delivered&amp;lt;/strong&amp;gt; for this period. Since this relates to current service, the full amount goes straight to insurance service expenses in the income statement. The CSM cannot absorb it.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? Yes \u2014 the disabilities occurred during the current quarter while the insurer was on risk. This is current-period service, so the cost goes straight to insurance service expenses. The CSM only absorbs changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCC5&#039;,&lt;br /&gt;
        text: &#039;AXA Switzerland individual annuity book: a &amp;lt;strong&amp;gt;prior-year reserve for an annuitant who died in 2023&amp;lt;/strong&amp;gt; is re-estimated upward because final medical and estate costs were higher than provisioned.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;This relates to &amp;lt;strong&amp;gt;past service&amp;lt;/strong&amp;gt; \u2014 the annuitant died in a prior period and the claim event is long settled. Any re-estimate of an already-incurred claim bypasses the CSM entirely and flows directly into insurance service expenses. The CSM only represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The annuitant died in 2023 \u2014 the service has long since been provided. Re-estimates of already-incurred claims relate to past service and go straight to the income statement. Remember: the CSM represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;, not service already delivered.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83E\uDE7A&#039;,&lt;br /&gt;
        text: &#039;AXA Japan critical illness portfolio: following a screening campaign, the insurer estimates &amp;lt;strong&amp;gt;200 cancer diagnoses occurred during H1&amp;lt;/strong&amp;gt; but won\u2019t be reported until H2. The full IBNR provision is booked.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The diagnoses are &amp;lt;strong&amp;gt;incurred&amp;lt;/strong&amp;gt; in H1, even if not yet reported. Once incurred, the liability relates to current service \u2014 the insurer was providing critical illness cover when the diseases arose. Any estimates of these claims go straight to the income statement. IBNR doesn\u2019t change this: incurred means the service has been provided.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The cancers were diagnosed during H1 \u2014 the insurer was on risk when they occurred. Even though the claims are IBNR (incurred but not yet reported), they are still &amp;lt;em&amp;gt;incurred&amp;lt;/em&amp;gt;, meaning the service has been provided. All incurred claim estimates bypass the CSM and go to P&amp;amp;L.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a pandemic scenario causes expected mortality claims to &amp;lt;strong&amp;gt;rise so sharply that the CSM would go below zero&amp;lt;/strong&amp;gt;. The change relates entirely to future service.&#039;,&lt;br /&gt;
        answer: &#039;both&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 but there\u2019s a twist.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 It\u2019s actually a trick question \u2014 both answers are partially right.&#039;,&lt;br /&gt;
        bothBody: &#039;This change relates to future service, so it &amp;lt;em&amp;gt;starts&amp;lt;/em&amp;gt; by adjusting the CSM. But the CSM cannot go negative. The portion that brings the CSM to zero is absorbed normally; the &amp;lt;strong&amp;gt;excess&amp;lt;/strong&amp;gt; spills over into P&amp;amp;L as an immediate loss. The group becomes onerous and a loss component is established. This is the one scenario where the answer is \u201Cboth\u201D \u2014 CSM first, then P&amp;amp;L for the overflow.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
    var current    = 0;&lt;br /&gt;
    var correct    = 0;&lt;br /&gt;
    var wrong      = 0;&lt;br /&gt;
    var answered   = false;&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Where Does the Impact Land?&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Decision rule */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-rule&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;The key question:&amp;lt;/strong&amp;gt; \u201CHas the service already been provided?\u201D If yes \u2192 P&amp;amp;L. If no \u2192 CSM.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress bar */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge&#039;, style: { border: &#039;none&#039;, padding: &#039;0&#039;, background: &#039;none&#039;, color: &#039;&#039; } } );&lt;br /&gt;
    var progBar  = wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( progBar );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeCorrect = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeWrong   = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeCorrect, badgeWrong ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Card stage */&lt;br /&gt;
    var cardStage = wix.el( &#039;div&#039; );&lt;br /&gt;
    wrapper.appendChild( cardStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnCsm = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--csm&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDD04&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Adjusts the CSM&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Future service \u2014 profit recognised later&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var btnPl = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--pl&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDCC9&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Hits P&amp;amp;L directly&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Current or past service \u2014 recognised now&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-choices&#039; }, [ btnCsm, btnPl ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next scenario \u25B8&#039;, style: { marginTop: &#039;0.6rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Render helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeCorrect.textContent = &#039;\u2713 &#039; + correct + &#039; correct&#039;;&lt;br /&gt;
      badgeWrong.textContent   = &#039;\u2717 &#039; + wrong + &#039; wrong&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderCard() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( current &amp;gt;= order.length ) {&lt;br /&gt;
        showFinal();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      var card = wix.el( &#039;div&#039;, { className: &#039;wix-is-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-num&#039;, textContent: &#039;Scenario &#039; + ( current + 1 ) + &#039; of &#039; + order.length } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-is-card-icon&#039;, textContent: s.icon } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-text&#039;, innerHTML: s.text } )&lt;br /&gt;
      ] );&lt;br /&gt;
      cardStage.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( current / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = current + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = false;&lt;br /&gt;
      btnPl.disabled  = false;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
      var isCorrect = s.answer === &#039;both&#039; ? true : chosen === s.answer;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) correct++; else wrong++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Card border */&lt;br /&gt;
      var card = cardStage.firstChild;&lt;br /&gt;
      card.className = &#039;wix-is-card &#039; + ( isCorrect ? &#039;wix-is-card--correct&#039; : &#039;wix-is-card--wrong&#039; );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( s.answer === &#039;both&#039; ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = chosen === &#039;csm&#039; ? s.correctHead : s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML   = s.bothBody;&lt;br /&gt;
      } else if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent   = s.correctHead;&lt;br /&gt;
        fbBody.innerHTML     = s.correctBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent   = s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML     = s.wrongBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = true;&lt;br /&gt;
      btnPl.disabled  = true;&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = current &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next scenario \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( correct / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect score!&#039; : pct &amp;gt;= 67 ? &#039;Well done!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You got &amp;lt;strong&amp;gt;&#039; + correct + &#039; out of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; correct (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        ( pct === 100&lt;br /&gt;
          ? &#039;You\u2019ve nailed the future vs.\u00A0current/past service distinction \u2014 the key question IFRS\u00A017 asks at every re-estimate.&#039;&lt;br /&gt;
          : &#039;Remember the key question: &amp;lt;strong&amp;gt;\u201CHas the service already been provided?\u201D&amp;lt;/strong&amp;gt; If yes, the change bypasses the CSM and goes straight to P&amp;amp;L. If no, it adjusts the CSM.&#039; );&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order   = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
      current = 0;&lt;br /&gt;
      correct = 0;&lt;br /&gt;
      wrong   = 0;&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
      renderCard();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnCsm.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;csm&#039; ); } );&lt;br /&gt;
    btnPl.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;pl&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { current++; renderCard(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderCard();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
     Sort 9 line items into the correct section of the IFRS 17&lt;br /&gt;
     income statement: Revenue, Service Expenses, or Finance.&lt;br /&gt;
     Items accumulate as chips in the statement skeleton.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIncomeBuilder( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { id: &#039;csm-release&#039;, icon: &#039;\uD83C\uDF81&#039;, label: &#039;CSM release&#039;,&lt;br /&gt;
        desc: &#039;Share of unearned profit recognised as coverage is provided&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;The CSM release represents profit earned by delivering coverage during the period. It is one of the three components that build insurance revenue \u2014 alongside expected claims costs and the RA release.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The CSM release is the share of unearned profit recognised as the insurer delivers coverage. Revenue under IFRS 17 is built from three releases: expected claims costs, the RA release, and the CSM release. All three go to revenue.&#039; },&lt;br /&gt;
      { id: &#039;ra-release&#039;, icon: &#039;\uD83D\uDEE1\uFE0F&#039;, label: &#039;Risk adjustment release&#039;,&lt;br /&gt;
        desc: &#039;Reduction in RA as risk is borne over time&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;Bearing risk is part of the service the insurer provides. As each period passes and uncertainty diminishes, the released portion of the RA flows into insurance revenue \u2014 it represents compensation for risk the insurer has now borne.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The RA release reflects risk the insurer has already borne \u2014 that\u2019s a service delivered. Under IFRS 17, it is one of the three components of insurance revenue, not an expense or a finance item.&#039; },&lt;br /&gt;
      { id: &#039;claims-alloc&#039;, icon: &#039;\uD83D\uDCCB&#039;, label: &#039;Expected claims &amp;amp; expenses allocated to period&#039;,&lt;br /&gt;
        desc: &#039;Portion of estimated claims/expenses matching coverage provided (e.g.\u00A0the Lyon home contract at 6\u00A0months)&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;This is often the most surprising one. Under IFRS 17, the portion of expected claims cost allocated to the period is a component of revenue, not an expense. Think of the Lyon home contract: at six months, half the expected cost is released into revenue. The logic is that revenue measures the &amp;lt;em&amp;gt;value of service delivered&amp;lt;/em&amp;gt;, and the expected claims cost is part of that value. Actual claims incurred go to expenses.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This actually belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;Under IFRS 17, revenue is not premiums \u2014 it\u2019s the value of coverage delivered. That value includes the expected claims cost allocated to the period (like the Lyon home contract at 6\u00A0months), plus the RA release and CSM release. The &amp;lt;em&amp;gt;expected&amp;lt;/em&amp;gt; cost is a revenue component; &amp;lt;em&amp;gt;actual&amp;lt;/em&amp;gt; incurred claims go to expenses.&#039; },&lt;br /&gt;
      { id: &#039;claims-incurred&#039;, icon: &#039;\u26C8\uFE0F&#039;, label: &#039;Claims incurred&#039;,&lt;br /&gt;
        desc: &#039;Actual claim costs from events that occurred (e.g.\u00A0hailstorm damaging 200 cars in Bavaria)&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When the Bavaria hailstorm damages 200 cars, the cost of those actual claims is an insurance service expense. This is the cost of events that have happened \u2014 current or past service \u2014 hitting the income statement directly.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Claims incurred, like the Bavaria hailstorm damaging 200 cars, are the actual costs of insured events. These go to insurance service expenses \u2014 they\u2019re the cost side of underwriting, paired against revenue to produce the insurance service result.&#039; },&lt;br /&gt;
      { id: &#039;est-change-past&#039;, icon: &#039;\uD83D\uDD27&#039;, label: &#039;Changes in estimates for current/past service&#039;,&lt;br /&gt;
        desc: &#039;Re-estimates of claims already incurred or coverage already provided&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When estimates change for service already delivered \u2014 like revised repair costs on claims already incurred \u2014 the adjustment bypasses the CSM and goes straight to insurance service expenses. Only changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service adjust the CSM.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Changes in estimates for current or past service relate to coverage already provided. They cannot go through the CSM (which is about future profit) and they aren\u2019t a finance effect. They go directly to insurance service expenses in the income statement.&#039; },&lt;br /&gt;
      { id: &#039;onerous-loss&#039;, icon: &#039;\uD83D\uDEA8&#039;, label: &#039;Losses on onerous groups&#039;,&lt;br /&gt;
        desc: &#039;Initial losses at recognition and subsequent deterioration of onerous groups&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Losses on onerous contracts \u2014 whether recognised at day one or from subsequent deterioration \u2014 are part of insurance service expenses. They reflect the cost of underwriting contracts that are expected to be unprofitable, which is fundamentally a service-related cost.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Onerous group losses are an underwriting cost, not a finance effect. Whether it\u2019s a day-one loss or subsequent deterioration, these sit within insurance service expenses \u2014 they tell you about pricing and claims management, not market conditions.&#039; },&lt;br /&gt;
      { id: &#039;acq-costs&#039;, icon: &#039;\uD83E\uDD1D&#039;, label: &#039;Acquisition costs amortised&#039;,&lt;br /&gt;
        desc: &#039;Commissions to brokers (e.g.\u00A0in Belgium) and distribution costs (e.g.\u00A0in Spain), spread over the period&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Under IFRS 17, acquisition costs \u2014 like commissions paid to Belgian brokers or Spanish distribution costs \u2014 are amortised and included within insurance service expenses. They\u2019re not shown as a separate deduction; this keeps the insurance service result self-contained.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Acquisition costs (Belgian broker commissions, Spanish distribution costs) are amortised within insurance service expenses under IFRS 17 \u2014 not shown separately. The insurance service result captures the &amp;lt;em&amp;gt;full&amp;lt;/em&amp;gt; cost of acquiring, servicing, and settling contracts.&#039; },&lt;br /&gt;
      { id: &#039;discount-unwind&#039;, icon: &#039;\u23F3&#039;, label: &#039;Unwinding of the discount&#039;,&lt;br /&gt;
        desc: &#039;Liability grows as future payments get closer in time (accretion of interest)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;The discount unwind is a financing effect, not an underwriting cost. As future claim payments draw closer, the present value of the liability rises \u2014 this accretion of interest belongs in insurance finance income or expense, keeping the service result clean.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;A common mistake! The discount unwind feels like a cost of doing business, but IFRS 17 treats it as a financing effect. It goes to insurance finance income or expense \u2014 &amp;lt;em&amp;gt;not&amp;lt;/em&amp;gt; to the service result. This separation is deliberate: it keeps underwriting profitability free from time-value-of-money effects.&#039; },&lt;br /&gt;
      { id: &#039;rate-change&#039;, icon: &#039;\uD83D\uDCC9&#039;, label: &#039;Effect of discount rate changes&#039;,&lt;br /&gt;
        desc: &#039;Gains or losses when market interest rates move between reporting dates (e.g.\u00A0rates drop for AXA Germany long-tail liability contracts)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;When interest rates drop \u2014 as in the AXA Germany long-tail liability example \u2014 the present value of future claims increases, creating a financial expense. This has nothing to do with underwriting quality, so it sits in insurance finance income or expense. The insurer can also choose the OCI option to keep rate volatility out of reported profit entirely.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;Discount rate changes (like the AXA Germany long-tail scenario where rates drop sharply) are a market-driven effect, not underwriting performance. IFRS 17 places them in insurance finance income or expense to keep the service result undistorted. The insurer may also elect the OCI option to smooth this further.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
    var cur = 0, ok = 0, no = 0, answered = false;&lt;br /&gt;
    var placed = { revenue: [], expenses: [], finance: [] };&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Build the Income Statement&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { style: { fontSize: &#039;0.78em&#039;, fontWeight: &#039;600&#039;, color: &#039;var(--wix-text-muted)&#039;, whiteSpace: &#039;nowrap&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeOk = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeNo = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeOk, badgeNo ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Tile stage */&lt;br /&gt;
    var tileStage = wix.el( &#039;div&#039;, { style: { minHeight: &#039;60px&#039;, marginBottom: &#039;1rem&#039; } } );&lt;br /&gt;
    wrapper.appendChild( tileStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnRev = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--rev&#039;, innerHTML: &#039;Insurance&amp;lt;br&amp;gt;Revenue&#039; } );&lt;br /&gt;
    var btnExp = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--exp&#039;, innerHTML: &#039;Service&amp;lt;br&amp;gt;Expenses&#039; } );&lt;br /&gt;
    var btnFin = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--fin&#039;, innerHTML: &#039;Finance&amp;lt;br&amp;gt;Inc/Exp&#039; } );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-ib-choices&#039; }, [ btnRev, btnExp, btnFin ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Income statement skeleton */&lt;br /&gt;
    function makeSection( dotColor, titleColor, titleText, zoneKey ) {&lt;br /&gt;
      var countEl = wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-count&#039;, textContent: &#039;0 items&#039; } );&lt;br /&gt;
      var dropEl  = wix.el( &#039;div&#039;, { className: &#039;wix-ib-drop&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
      var section = wix.el( &#039;div&#039;, { className: &#039;wix-ib-section&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ib-sec-head&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-dot&#039;, style: { background: dotColor } } ),&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-title&#039;, style: { color: titleColor }, textContent: titleText } ),&lt;br /&gt;
          countEl&lt;br /&gt;
        ] ),&lt;br /&gt;
        dropEl&lt;br /&gt;
      ] );&lt;br /&gt;
      return { section: section, dropEl: dropEl, countEl: countEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var revSec = makeSection( &#039;var(--ib-rev)&#039;, &#039;var(--ib-rev)&#039;, &#039;Insurance Revenue&#039;, &#039;revenue&#039; );&lt;br /&gt;
    var expSec = makeSection( &#039;var(--ib-exp)&#039;, &#039;var(--ib-exp)&#039;, &#039;Insurance Service Expenses&#039;, &#039;expenses&#039; );&lt;br /&gt;
    var finSec = makeSection( &#039;var(--ib-fin)&#039;, &#039;var(--ib-fin)&#039;, &#039;Insurance Finance Income / Expense&#039;, &#039;finance&#039; );&lt;br /&gt;
&lt;br /&gt;
    var resultRow = wix.el( &#039;div&#039;, { className: &#039;wix-ib-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-label&#039;, textContent: &#039;= Insurance Service Result&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-eq&#039;, textContent: &#039;Revenue \u2212 Expenses&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-stmt&#039; }, [&lt;br /&gt;
      revSec.section, expSec.section, resultRow, finSec.section&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next item \u25B8&#039;, style: { marginTop: &#039;0.5rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ZONE_MAP = {&lt;br /&gt;
      revenue:  { sec: revSec,  chipCls: &#039;wix-ib-chip--rev&#039; },&lt;br /&gt;
      expenses: { sec: expSec,  chipCls: &#039;wix-ib-chip--exp&#039; },&lt;br /&gt;
      finance:  { sec: finSec,  chipCls: &#039;wix-ib-chip--fin&#039; }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeOk.textContent = &#039;\u2713 &#039; + ok;&lt;br /&gt;
      badgeNo.textContent = &#039;\u2717 &#039; + no;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateCounts() {&lt;br /&gt;
      revSec.countEl.textContent = placed.revenue.length + &#039; item&#039; + ( placed.revenue.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      expSec.countEl.textContent = placed.expenses.length + &#039; item&#039; + ( placed.expenses.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      finSec.countEl.textContent = placed.finance.length + &#039; item&#039; + ( placed.finance.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function toggleBtns( on ) {&lt;br /&gt;
      btnRev.disabled = !on;&lt;br /&gt;
      btnExp.disabled = !on;&lt;br /&gt;
      btnFin.disabled = !on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderTile() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( cur &amp;gt;= order.length ) { showFinal(); return; }&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.icon } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.label } )&lt;br /&gt;
      ] ) );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile-desc&#039;, textContent: it.desc } ) );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( cur / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = cur + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      toggleBtns( true );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
      toggleBtns( false );&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      var isCorrect = chosen === it.zone;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) ok++; else no++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Place chip in correct zone (always into the right section) */&lt;br /&gt;
      var target = ZONE_MAP[it.zone];&lt;br /&gt;
      var ph = target.sec.dropEl.querySelector( &#039;.wix-ib-drop-ph&#039; );&lt;br /&gt;
      if ( ph ) ph.parentNode.removeChild( ph );&lt;br /&gt;
&lt;br /&gt;
      var chip = wix.el( &#039;span&#039;, { className: &#039;wix-ib-chip &#039; + target.chipCls, textContent: it.icon + &#039; &#039; + it.label } );&lt;br /&gt;
      target.sec.dropEl.appendChild( chip );&lt;br /&gt;
      placed[it.zone].push( it.id );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      /* Hide tile */&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = it.okHead;&lt;br /&gt;
        fbBody.innerHTML   = it.okBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent = it.noHead;&lt;br /&gt;
        fbBody.innerHTML   = it.noBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = cur &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next item \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( ok / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect \u2014 you built it!&#039; : pct &amp;gt;= 67 ? &#039;Almost there!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You placed &amp;lt;strong&amp;gt;&#039; + ok + &#039; of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; items correctly (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        &#039;The completed income statement above is now your reference. Notice how the &amp;lt;strong&amp;gt;Insurance Service Result&amp;lt;/strong&amp;gt; sits between revenue and expenses \u2014 purely underwriting \u2014 while finance effects live below, keeping the two stories separate.&#039;;&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
      cur = 0; ok = 0; no = 0; answered = false;&lt;br /&gt;
      placed.revenue = []; placed.expenses = []; placed.finance = [];&lt;br /&gt;
&lt;br /&gt;
      /* Clear chips, restore placeholders */&lt;br /&gt;
      [ revSec, expSec, finSec ].forEach( function ( s ) {&lt;br /&gt;
        wix.empty( s.dropEl );&lt;br /&gt;
        s.dropEl.appendChild( wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } ) );&lt;br /&gt;
      } );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      renderTile();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnRev.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;revenue&#039; ); } );&lt;br /&gt;
    btnExp.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;expenses&#039; ); } );&lt;br /&gt;
    btnFin.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;finance&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { cur++; renderTile(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderTile();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GM vs PAA / VFA STEPPER — data-wix-module=&amp;quot;gm-paa&amp;quot;&lt;br /&gt;
     Side-by-side step-through.  Reads optional data-wix-config JSON&lt;br /&gt;
     to switch between PAA mode (kept/skipped) and VFA mode&lt;br /&gt;
     (same/modified).  Falls back to PAA defaults when no config is&lt;br /&gt;
     present.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGmPaa( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read config (or use PAA defaults) ───────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = container.getAttribute( &#039;data-wix-config&#039; );&lt;br /&gt;
    var cfg;&lt;br /&gt;
    try { cfg = raw ? JSON.parse( raw ) : {}; } catch ( e ) { cfg = {}; }&lt;br /&gt;
&lt;br /&gt;
    var mode = cfg.mode || &#039;paa&#039;;  // &#039;paa&#039; | &#039;vfa&#039;&lt;br /&gt;
&lt;br /&gt;
    /* ── Default PAA steps ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PAA_STEPS = [&lt;br /&gt;
      { label: &#039;Collect premiums and deduct acquisition costs&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both paths start identically. The insurer collects premiums from the German motor group and deducts acquisition costs paid.&#039; },&lt;br /&gt;
      { label: &#039;Project all future cash flows for remaining coverage&#039;, type: &#039;skipped&#039;,&lt;br /&gt;
        explain: &#039;The General Model requires probability-weighted projections of every future cash flow. The PAA skips this \u2014 the premium itself serves as the proxy for expected service.&#039; },&lt;br /&gt;
      { label: &#039;Discount projected cash flows to present value&#039;, type: &#039;skipped&#039;,&lt;br /&gt;
        explain: &#039;Because the PAA doesn\u2019t project future cash flows for remaining coverage, there is nothing to discount. For a one-year contract the time-value difference is immaterial.&#039; },&lt;br /&gt;
      { label: &#039;Calculate a risk adjustment on remaining coverage&#039;, type: &#039;skipped&#039;,&lt;br /&gt;
        explain: &#039;The General Model quantifies compensation for bearing uncertainty about future cash flows. The PAA does not require this on the Liability for Remaining Coverage \u2014 another layer of actuarial judgment avoided.&#039; },&lt;br /&gt;
      { label: &#039;Derive and track a Contractual Service Margin (CSM)&#039;, type: &#039;skipped&#039;,&lt;br /&gt;
        explain: &#039;The heart of the simplification. The General Model calculates the CSM as the residual between fulfilment cash flows and premiums, then tracks it over time. The PAA has no CSM \u2014 the premium-based liability replaces the entire mechanism.&#039; },&lt;br /&gt;
      { label: &#039;Release the CSM via coverage units each quarter&#039;, type: &#039;skipped&#039;,&lt;br /&gt;
        explain: &#039;Under the General Model the insurer defines coverage units and allocates the CSM to determine revenue. Under the PAA, proportional time passage does the same job \u2014 each quarter, one quarter of the liability is released as insurance revenue.&#039; },&lt;br /&gt;
      { label: &#039;Release remaining coverage as insurance revenue over time&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches recognise insurance revenue as coverage is delivered. The PAA simply releases the premium-based liability proportionally over the coverage period \u2014 same result, far fewer calculations.&#039; },&lt;br /&gt;
      { label: &#039;When a claim occurs, measure the Liability for Incurred Claims using fulfilment cash flows&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Once a claim event happens, both paths converge. The insurer estimates the present value of future payments using probability-weighted cash flows. The PAA simplifies the \u201Cpromise outstanding\u201D side, not the \u201Cclaims already happened\u201D side.&#039; },&lt;br /&gt;
      { label: &#039;Discount the Liability for Incurred Claims to present value&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both the General Model and PAA require discounting on incurred claims. The simplification only applies to the Liability for Remaining Coverage.&#039; },&lt;br /&gt;
      { label: &#039;Add a risk adjustment to the Liability for Incurred Claims&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;The PAA removes the risk adjustment only on the remaining coverage side. For incurred claims, the insurer still quantifies uncertainty. Both models are identical here.&#039; },&lt;br /&gt;
      { label: &#039;Apply the onerous contract test \u2014 recognise any loss immediately&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;If the group is expected to generate a loss, both approaches require immediate recognition. The PAA is a simplification, not an escape from prudent accounting.&#039; },&lt;br /&gt;
      { label: &#039;Follow IFRS 17 grouping rules (portfolios, profitability groups, annual cohorts)&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Grouping requirements are unchanged. Portfolios, profitability groups, and annual cohorts apply in exactly the same way under the PAA as under the General Model.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Default VFA steps ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var VFA_STEPS = [&lt;br /&gt;
      { label: &#039;Calculate fulfilment cash flows at initial recognition&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches start identically. The insurer projects probability-weighted future cash flows for the Belgian with-profits portfolio, including policyholder benefits, expenses, and premiums.&#039; },&lt;br /&gt;
      { label: &#039;Discount cash flows to present value&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches discount projected cash flows. For direct participating contracts the cash flows depend on the underlying items, but the discounting mechanics are the same at inception.&#039; },&lt;br /&gt;
      { label: &#039;Add a risk adjustment for non-financial risk&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches require the insurer to quantify the compensation it demands for bearing non-financial uncertainty (e.g. mortality, lapse risk). Identical treatment.&#039; },&lt;br /&gt;
      { label: &#039;Derive the Contractual Service Margin (CSM) as the residual&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches derive the CSM the same way at inception: premiums minus fulfilment cash flows. The CSM represents unearned profit to be released over the coverage period.&#039; },&lt;br /&gt;
      { label: &#039;When non-financial assumptions change for future service \u2192 adjust the CSM&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches route changes in non-financial estimates (e.g. revised mortality or lapse expectations) relating to future service through the CSM. No difference here.&#039; },&lt;br /&gt;
      { label: &#039;When non-financial assumptions change for current or past service \u2192 recognise in profit or loss&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Experience adjustments and changes relating to current or past service go straight to profit or loss under both approaches. The VFA does not change this rule.&#039; },&lt;br /&gt;
      { label: &#039;When value of underlying items rises \u2192 insurer\u2019s share (\u20AC2.5M on a \u20AC25M gain) goes to income statement or OCI&#039;, type: &#039;modified&#039;,&lt;br /&gt;
        explain: &#039;This is where the VFA diverges. Equity markets rise, the \u20AC500M pool gains \u20AC25M. Policyholders receive 90% (\u20AC22.5M). Under the General Model, the insurer\u2019s 10% share (\u20AC2.5M) flows to the income statement or OCI \u2014 creating immediate profit. Under the VFA, that \u20AC2.5M adjusts the CSM upward instead, to be released as insurance revenue over future periods. This reflects the economics of a variable fee.&#039; },&lt;br /&gt;
      { label: &#039;When value of underlying items falls \u2192 insurer\u2019s share (\u20AC3M on a \u20AC30M drop) goes to income statement or OCI&#039;, type: &#039;modified&#039;,&lt;br /&gt;
        explain: &#039;The same logic applies in reverse. Markets fall, the pool drops \u20AC30M. Policyholders absorb \u20AC27M (90%). Under the General Model, the insurer\u2019s \u20AC3M loss hits the income statement immediately \u2014 creating visible volatility even though the long-term fee structure is unchanged. Under the VFA, the \u20AC3M reduces the CSM instead. As long as the CSM remains positive, the insurer simply recognises less profit in future periods.&#039; },&lt;br /&gt;
      { label: &#039;When discount rates or other financial assumptions change \u2192 adjust income statement or OCI&#039;, type: &#039;modified&#039;,&lt;br /&gt;
        explain: &#039;Another key modification. Under the General Model, changes in financial assumptions (like discount rates) flow to the income statement or OCI. Under the VFA, the insurer\u2019s share of these changes is routed through the CSM as well \u2014 preventing artificial volatility that doesn\u2019t reflect the fee-based economics.&#039; },&lt;br /&gt;
      { label: &#039;Release the CSM as insurance revenue over the coverage period&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;Both approaches release the CSM as insurance revenue over time using coverage units. The difference is that under the VFA, the CSM absorbs more movements (financial changes), so the revenue pattern is smoother and more reflective of the insurer\u2019s true variable fee.&#039; },&lt;br /&gt;
      { label: &#039;Apply the onerous contract test \u2014 recognise any loss immediately&#039;, type: &#039;same&#039;,&lt;br /&gt;
        explain: &#039;If the CSM is exhausted and the group becomes loss-making, both approaches require immediate loss recognition in profit or loss. The VFA does not shield the insurer from genuine losses.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Resolve config ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var STEPS    = cfg.steps || ( mode === &#039;vfa&#039; ? VFA_STEPS : PAA_STEPS );&lt;br /&gt;
    var title    = cfg.title    || ( mode === &#039;vfa&#039; ? &#039;General Model vs VFA \u2014 Side by Side&#039; : &#039;General Model vs PAA \u2014 Side by Side&#039; );&lt;br /&gt;
    var scenario = cfg.scenario || ( mode === &#039;vfa&#039;&lt;br /&gt;
      ? &#039;&amp;lt;strong&amp;gt;Scenario:&amp;lt;/strong&amp;gt; A with-profits savings portfolio in Belgium. Underlying items worth \u20AC500M. Policyholders receive 90% of returns; AXA retains 10% as a variable fee for managing assets and bearing insurance risk.&#039;&lt;br /&gt;
      : &#039;&amp;lt;strong&amp;gt;Scenario:&amp;lt;/strong&amp;gt; A group of one-year motor insurance contracts in Germany, measured under both approaches.&#039; );&lt;br /&gt;
    var colLabel = cfg.colLabel || ( mode === &#039;vfa&#039; ? &#039;VFA&#039; : &#039;PAA (shortcut)&#039; );&lt;br /&gt;
    var footnote = cfg.footnote || ( mode === &#039;vfa&#039;&lt;br /&gt;
      ? &#039;The VFA modifies how financial changes are treated \u2014 everything else stays the same as the General Model.&#039;&lt;br /&gt;
      : &#039;The PAA simplifies the Liability for Remaining Coverage side \u2014 not the Liability for Incurred Claims side.&#039; );&lt;br /&gt;
&lt;br /&gt;
    /* Labels for PAA mode counters vs VFA mode counters */&lt;br /&gt;
    var isPaa = mode !== &#039;vfa&#039;;&lt;br /&gt;
    var lbl1 = isPaa ? &#039;Steps kept&#039;    : &#039;Steps identical&#039;;&lt;br /&gt;
    var lbl2 = isPaa ? &#039;Steps skipped&#039; : &#039;Steps modified by VFA&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* VFA class on container for colour override */&lt;br /&gt;
    if ( mode === &#039;vfa&#039; ) container.className += &#039; wix-gp--vfa&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var current = -1;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: title } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-scenario&#039;, innerHTML: scenario } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Table */&lt;br /&gt;
    var thead = wix.el( &#039;div&#039;, { className: &#039;wix-gp-thead&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th&#039;, textContent: &#039;Step&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th wix-gp-th--gm&#039;, textContent: &#039;General Model&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th wix-gp-th--alt&#039;, textContent: colLabel } )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    var rowEls = [];&lt;br /&gt;
    var gmMarks = [];&lt;br /&gt;
    var altMarks = [];&lt;br /&gt;
&lt;br /&gt;
    STEPS.forEach( function ( s, i ) {&lt;br /&gt;
      var gm  = wix.el( &#039;div&#039;, { className: &#039;wix-gp-mark&#039; } );&lt;br /&gt;
      var alt = wix.el( &#039;div&#039;, { className: &#039;wix-gp-mark&#039; } );&lt;br /&gt;
      gmMarks.push( gm );&lt;br /&gt;
      altMarks.push( alt );&lt;br /&gt;
&lt;br /&gt;
      rowEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gp-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-gp-row-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-gp-num&#039;, textContent: String( i + 1 ) } ),&lt;br /&gt;
          wix.el( &#039;span&#039;, { textContent: s.label } )&lt;br /&gt;
        ] ),&lt;br /&gt;
        gm,&lt;br /&gt;
        alt&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-table&#039; }, [ thead, wix.el( &#039;div&#039;, {}, rowEls ) ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation box */&lt;br /&gt;
    var eStep = wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain-step&#039; } );&lt;br /&gt;
    var eBody = wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain-body&#039;, innerHTML: &#039;Press &amp;lt;strong&amp;gt;Next&amp;lt;/strong&amp;gt; to begin.&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain&#039; }, [ eStep, eBody ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Counters (2 boxes — no &amp;quot;effort saved&amp;quot; for VFA mode) */&lt;br /&gt;
    var ctA = wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-num wix-gp-cbox-num--kept&#039;, textContent: &#039;0&#039; } );&lt;br /&gt;
    var ctB = wix.el( &#039;div&#039;, { className: isPaa ? &#039;wix-gp-cbox-num wix-gp-cbox-num--skip&#039; : &#039;wix-gp-cbox-num wix-gp-cbox-num--pct&#039;, textContent: &#039;0&#039; } );&lt;br /&gt;
    var ctPct = isPaa ? wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-num wix-gp-cbox-num--pct&#039;, textContent: &#039;\u2014&#039; } ) : null;&lt;br /&gt;
&lt;br /&gt;
    var counterChildren = [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctA, wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: lbl1 } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctB, wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: lbl2 } ) ] )&lt;br /&gt;
    ];&lt;br /&gt;
    if ( ctPct ) counterChildren.push(&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctPct, wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: &#039;Effort saved&#039; } ) ] )&lt;br /&gt;
    );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-counters&#039; }, counterChildren ) );&lt;br /&gt;
&lt;br /&gt;
    /* Controls */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var btnNext  = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next \u2192&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-controls&#039; }, [ btnReset, btnNext ] ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gp-footnote&#039;, textContent: footnote } ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var a = 0, b = 0;&lt;br /&gt;
&lt;br /&gt;
      STEPS.forEach( function ( s, i ) {&lt;br /&gt;
        var isSame = s.type === &#039;same&#039; || ( isPaa &amp;amp;&amp;amp; s.type !== &#039;skipped&#039; );&lt;br /&gt;
        if ( i &amp;lt;= current ) {&lt;br /&gt;
          rowEls[i].className = &#039;wix-gp-row wix-gp-row--revealed&#039; + ( i === current ? &#039; wix-gp-row--current&#039; : &#039;&#039; );&lt;br /&gt;
          gmMarks[i].className  = &#039;wix-gp-mark wix-gp-mark--yes&#039;;&lt;br /&gt;
          gmMarks[i].textContent = &#039;\u2714&#039;;&lt;br /&gt;
&lt;br /&gt;
          if ( isSame ) {&lt;br /&gt;
            altMarks[i].className  = &#039;wix-gp-mark wix-gp-mark--yes&#039;;&lt;br /&gt;
            altMarks[i].textContent = &#039;\u2714&#039;;&lt;br /&gt;
            a++;&lt;br /&gt;
          } else if ( s.type === &#039;modified&#039; ) {&lt;br /&gt;
            altMarks[i].className  = &#039;wix-gp-mark wix-gp-mark--mod&#039;;&lt;br /&gt;
            altMarks[i].textContent = &#039;\u2260 CSM&#039;;&lt;br /&gt;
            b++;&lt;br /&gt;
          } else {&lt;br /&gt;
            altMarks[i].className  = &#039;wix-gp-mark wix-gp-mark--no&#039;;&lt;br /&gt;
            altMarks[i].textContent = &#039;\u2718&#039;;&lt;br /&gt;
            b++;&lt;br /&gt;
          }&lt;br /&gt;
        } else {&lt;br /&gt;
          rowEls[i].className     = &#039;wix-gp-row&#039;;&lt;br /&gt;
          gmMarks[i].className    = &#039;wix-gp-mark&#039;;&lt;br /&gt;
          gmMarks[i].textContent  = &#039;&#039;;&lt;br /&gt;
          altMarks[i].className   = &#039;wix-gp-mark&#039;;&lt;br /&gt;
          altMarks[i].textContent = &#039;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      /* Explanation */&lt;br /&gt;
      if ( current &amp;gt;= 0 ) {&lt;br /&gt;
        var s = STEPS[current];&lt;br /&gt;
        var tag;&lt;br /&gt;
        if ( isPaa ) tag = ( s.type === &#039;skipped&#039; ? &#039;Skipped by PAA&#039; : &#039;Kept by PAA&#039; );&lt;br /&gt;
        else tag = ( s.type === &#039;modified&#039; ? &#039;Modified by VFA&#039; : &#039;Identical&#039; );&lt;br /&gt;
        eStep.textContent = &#039;Step &#039; + ( current + 1 ) + &#039; of &#039; + STEPS.length + &#039; \u00B7 &#039; + tag;&lt;br /&gt;
        eBody.innerHTML   = s.explain;&lt;br /&gt;
      } else {&lt;br /&gt;
        eStep.textContent = &#039;&#039;;&lt;br /&gt;
        eBody.innerHTML   = &#039;Press &amp;lt;strong&amp;gt;Next&amp;lt;/strong&amp;gt; to begin.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Counters */&lt;br /&gt;
      ctA.textContent = a;&lt;br /&gt;
      ctB.textContent = b;&lt;br /&gt;
      if ( ctPct ) {&lt;br /&gt;
        var total = a + b;&lt;br /&gt;
        ctPct.textContent = total &amp;gt; 0 ? Math.round( b / STEPS.length * 100 ) + &#039;%&#039; : &#039;\u2014&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Button */&lt;br /&gt;
      if ( current &amp;gt;= STEPS.length - 1 ) {&lt;br /&gt;
        btnNext.disabled = true;&lt;br /&gt;
        btnNext.textContent = &#039;Complete \u2713&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNext.disabled = false;&lt;br /&gt;
        btnNext.textContent = &#039;Next \u2192&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( current &amp;lt; STEPS.length - 1 ) { current++; update(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      current = -1; update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_premium_allocation_approach&amp;diff=23020</id>
		<title>Internal:Training/IFRS17/The premium allocation approach</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_premium_allocation_approach&amp;diff=23020"/>
		<updated>2026-04-06T18:01:05Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:Income statement|income statement]] under [[Definition:IFRS 17|IFRS 17]] presents [[Definition:Insurance revenue|insurance revenue]] based on service delivered, not [[Definition:Premium|premiums]] collected, along with [[Definition:Insurance service expense|insurance service expenses]] and [[Definition:Insurance finance income or expense|insurance finance income or expense]]. Now we turn to a simpler way of reaching those same results: the [[Definition:Premium allocation approach|premium allocation approach]], a shortcut available for many of the contracts you will encounter in practice.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* The conditions a group of [[Definition:Insurance contract|insurance contracts]] must meet before the insurer may use the [[Definition:Premium allocation approach|premium allocation approach]] instead of the [[Definition:General model|general model]].&lt;br /&gt;
* How the [[Definition:Premium allocation approach|PAA]] measures the [[Definition:Insurance contract liability|liability]] for remaining coverage and the [[Definition:Liability for incurred claims|liability for incurred claims]], and why it is considered a simplified method.&lt;br /&gt;
* Which elements of the [[Definition:General model|general model]] the [[Definition:Premium allocation approach|PAA]] keeps, which it skips, and the practical consequences of those differences.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== When PAA is available: the eligibility test ==&lt;br /&gt;
&lt;br /&gt;
🚪 &#039;&#039;&#039;A lighter path, not a free pass.&#039;&#039;&#039; The [[Definition:General model|general model]] you studied in the previous pages is the default measurement approach under [[Definition:IFRS 17|IFRS 17]]. It requires the insurer to calculate [[Definition:Fulfilment cash flows|fulfilment cash flows]], [[Definition:Discounting|discount]] them, add a [[Definition:Risk adjustment|risk adjustment]], and track a [[Definition:Contractual service margin|contractual service margin]] that evolves over time. For contracts that last many years, such as [[Definition:Life insurance|life insurance]] or long-tail [[Definition:Liability insurance|liability covers]], that rigour is essential. But many contracts, especially in [[Definition:Property insurance|property]] and [[Definition:Motor insurance|motor insurance]], run for just one year. For those shorter contracts, [[Definition:IFRS 17|IFRS 17]] offers a simpler route called the [[Definition:Premium allocation approach|premium allocation approach]], or PAA. Think of it as a shortcut through familiar territory: you arrive at broadly the same destination but with far fewer calculations along the way.&lt;br /&gt;
&lt;br /&gt;
📏 &#039;&#039;&#039;The eligibility test.&#039;&#039;&#039; An insurer may use the [[Definition:Premium allocation approach|PAA]] for a group of contracts only if it can demonstrate, at [[Definition:Initial recognition|initial recognition]], that the PAA liability would not differ materially from the one produced by the [[Definition:General model|general model]]. In practice, this condition is automatically satisfied when the [[Definition:Coverage period|coverage period]] of every contract in the group is one year or less. A standard 12-month [[Definition:Motor insurance|motor policy]] in Germany or a one-year [[Definition:Home insurance|home insurance]] contract in Belgium passes this test without further analysis. If the [[Definition:Coverage period|coverage period]] exceeds one year, the insurer must perform a more detailed assessment to prove the results would be sufficiently close. Most [[Definition:Non-life insurance|non-life]] books at an insurer like AXA consist of annual contracts, which is why the PAA is so widely used across the industry.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume the [[Definition:Premium allocation approach|PAA]] is available simply because a contract looks &amp;quot;simple&amp;quot; or has a low [[Definition:Premium|premium]]. Simplicity of product design is not the criterion. The test is about whether the measurement result would materially differ from the [[Definition:General model|general model]]. A complex product with a short [[Definition:Coverage period|coverage period]] can qualify, while a straightforward product with a five-year term may not.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the [[Definition:Premium allocation approach|PAA]] is a shortcut, what exactly does it simplify? How does the insurer measure the [[Definition:Insurance contract liability|liability]] without tracking a [[Definition:Contractual service margin|CSM]] that absorbs changes in estimates at every reporting date?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How PAA works: simplified measurement ==&lt;br /&gt;
&lt;br /&gt;
📦 &#039;&#039;&#039;Starting with the liability for remaining coverage.&#039;&#039;&#039; Under the [[Definition:Premium allocation approach|PAA]], the insurer does not calculate all four [[Definition:Building block|building blocks]] at [[Definition:Initial recognition|initial recognition]]. Instead, it starts by recording the [[Definition:Liability for remaining coverage|liability for remaining coverage]] (LRC) at the amount of [[Definition:Premium|premiums]] received, minus any [[Definition:Acquisition cost|acquisition costs]] already paid. As time passes, the insurer reduces this [[Definition:Liability for remaining coverage|LRC]] in proportion to the [[Definition:Coverage period|coverage]] provided, which directly becomes [[Definition:Insurance revenue|insurance revenue]] in the [[Definition:Income statement|income statement]]. Imagine AXA writes a group of annual [[Definition:Home insurance|home insurance]] contracts in Spain, collecting €6,000,000 in [[Definition:Premium|premiums]] on 1 January. After deducting €300,000 of [[Definition:Acquisition cost|acquisition costs]], the [[Definition:Liability for remaining coverage|LRC]] starts at €5,700,000. Each quarter, roughly one quarter of that balance is released as [[Definition:Insurance revenue|revenue]], reflecting the coverage delivered during those three months.&lt;br /&gt;
&lt;br /&gt;
🔓 &#039;&#039;&#039;No CSM to track.&#039;&#039;&#039; This is the heart of the simplification. Under the [[Definition:General model|general model]], the insurer must maintain a [[Definition:Contractual service margin|contractual service margin]] that absorbs favourable and unfavourable changes in estimates of future [[Definition:Cash flow|cash flows]], then release it through [[Definition:Coverage unit|coverage units]]. Under the [[Definition:Premium allocation approach|PAA]], that entire mechanism disappears for the [[Definition:Liability for remaining coverage|liability for remaining coverage]]. The [[Definition:Premium|premium]] itself serves as a proxy for the expected value of service to be delivered. Because the [[Definition:Coverage period|coverage period]] is short, the difference between tracking a full [[Definition:Contractual service margin|CSM]] and simply running down the [[Definition:Premium|premium]] over time is immaterial. This saves significant actuarial and accounting effort at every [[Definition:Reporting period|reporting period]].&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners sometimes believe the [[Definition:Premium allocation approach|PAA]] eliminates the need to think about [[Definition:Claim|claims]] altogether. It does not. The PAA simplifies the [[Definition:Liability for remaining coverage|liability for remaining coverage]], but once a [[Definition:Claim|claim]] event occurs, the insurer must still measure the [[Definition:Liability for incurred claims|liability for incurred claims]] (LIC) using the full [[Definition:Fulfilment cash flows|fulfilment cash flow]] approach: [[Definition:Probability-weighted estimate|probability-weighted]] estimates of future payments, [[Definition:Discounting|discounted]] to [[Definition:Present value|present value]], plus a [[Definition:Risk adjustment|risk adjustment]]. The simplification applies to the &amp;quot;promise still outstanding&amp;quot; side, not the &amp;quot;claims already happened&amp;quot; side.&lt;br /&gt;
&lt;br /&gt;
🏥 &#039;&#039;&#039;Handling incurred claims.&#039;&#039;&#039; When [[Definition:Claim|claims]] are reported or estimated during the [[Definition:Coverage period|coverage period]], the insurer sets up a [[Definition:Liability for incurred claims|liability for incurred claims]]. For a group of Spanish [[Definition:Home insurance|home insurance]] contracts, suppose a severe hailstorm in March generates [[Definition:Claim|claims]] with an estimated [[Definition:Present value|present value]] of €800,000 and a [[Definition:Risk adjustment|risk adjustment]] of €50,000. The insurer records a [[Definition:Liability for incurred claims|LIC]] of €850,000. This part of the measurement is identical to the [[Definition:General model|general model]]: the insurer uses the same [[Definition:Fulfilment cash flows|fulfilment cash flow]] techniques to value obligations that have already crystallised.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the [[Definition:Premium allocation approach|PAA]] removes the [[Definition:Contractual service margin|CSM]] and simplifies the [[Definition:Liability for remaining coverage|LRC]], does the insurer also get to skip [[Definition:Discounting|discounting]] and the [[Definition:Risk adjustment|risk adjustment]] on the remaining coverage side? Or are those still required?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== What you keep and what you skip vs. the general model ==&lt;br /&gt;
&lt;br /&gt;
✂️ &#039;&#039;&#039;What the PAA removes.&#039;&#039;&#039; The most significant simplification is the removal of the [[Definition:Contractual service margin|CSM]] for the [[Definition:Liability for remaining coverage|liability for remaining coverage]]. Under the [[Definition:General model|general model]], every change in estimated future [[Definition:Cash flow|cash flows]] that relates to future service must be routed through the [[Definition:Contractual service margin|CSM]], creating a complex adjustment at each [[Definition:Reporting period|reporting date]]. The [[Definition:Premium allocation approach|PAA]] sidesteps this entirely. The insurer also does not need to project and [[Definition:Discounting|discount]] the [[Definition:Fulfilment cash flows|fulfilment cash flows]] for remaining coverage at each reporting date, because the [[Definition:Premium|premium]]-based [[Definition:Liability for remaining coverage|LRC]] serves as a sufficient approximation. Additionally, the insurer is not required to calculate a [[Definition:Risk adjustment|risk adjustment]] on the [[Definition:Liability for remaining coverage|LRC]], though it must still do so for the [[Definition:Liability for incurred claims|liability for incurred claims]]. The net effect is a dramatic reduction in the volume of calculations and actuarial judgments needed at each period end.&lt;br /&gt;
&lt;br /&gt;
📋 &#039;&#039;&#039;What the PAA keeps.&#039;&#039;&#039; Despite the simplifications, several important requirements remain. The insurer must still apply the [[Definition:Onerous contract|onerous contract]] test. If at any point during the [[Definition:Coverage period|coverage period]] the group is expected to generate a [[Definition:Loss|loss]], the insurer recognises that [[Definition:Loss|loss]] immediately, just as under the [[Definition:General model|general model]]. The [[Definition:Liability for incurred claims|liability for incurred claims]] continues to require full [[Definition:Fulfilment cash flows|fulfilment cash flow]] measurement, including [[Definition:Discounting|discounting]] and a [[Definition:Risk adjustment|risk adjustment]]. The insurer must also still follow [[Definition:IFRS 17|IFRS 17&#039;s]] [[Definition:Grouping contracts|grouping]] requirements: [[Definition:Portfolio|portfolios]], [[Definition:Profitability group|profitability groups]], and [[Definition:Annual cohort|annual cohorts]] apply in exactly the same way.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent misunderstanding is that the [[Definition:Premium allocation approach|PAA]] is a completely different accounting model. It is not. The PAA is best understood as a practical simplification of the [[Definition:General model|general model]] for the [[Definition:Liability for remaining coverage|remaining coverage]] portion only. Everything on the [[Definition:Liability for incurred claims|incurred claims]] side, plus the [[Definition:Onerous contract|onerous contract]] test and [[Definition:Grouping contracts|grouping rules]], works the same way. If you master the [[Definition:General model|general model]], you already understand most of the PAA; you simply set aside a few steps that do not materially affect the result for short-duration contracts.&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;A practical comparison.&#039;&#039;&#039; Consider a group of one-year [[Definition:Motor insurance|motor insurance]] contracts in Germany. Under the [[Definition:General model|general model]], the insurer would project all [[Definition:Cash flow|cash flows]] over the remaining months, [[Definition:Discounting|discount]] them, compute a [[Definition:Risk adjustment|risk adjustment]], derive a [[Definition:Contractual service margin|CSM]], and release it through [[Definition:Coverage unit|coverage units]] each quarter. Under the [[Definition:Premium allocation approach|PAA]], the insurer simply starts with the [[Definition:Premium|premiums]] received, deducts [[Definition:Acquisition cost|acquisition costs]], and recognises [[Definition:Insurance revenue|revenue]] proportionally over the year. When a [[Definition:Claim|claim]] occurs, it measures the [[Definition:Liability for incurred claims|LIC]] with full rigour. The [[Definition:Income statement|income statement]] result is materially the same, but the operational cost of producing it is far lower. For [[Definition:Non-life insurance|non-life]] portfolios dominated by annual contracts, this efficiency gain is substantial.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;gm-paa&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* The [[Definition:Premium allocation approach|PAA]] is available when the [[Definition:Coverage period|coverage period]] is one year or less, or when the insurer can demonstrate its results would not materially differ from the [[Definition:General model|general model]].&lt;br /&gt;
* The [[Definition:Premium allocation approach|PAA]] simplifies the [[Definition:Liability for remaining coverage|liability for remaining coverage]] by using [[Definition:Premium|premiums]] received (less [[Definition:Acquisition cost|acquisition costs]]) as the starting point and releasing that balance as [[Definition:Insurance revenue|revenue]] over the [[Definition:Coverage period|coverage period]], eliminating the need to track a [[Definition:Contractual service margin|CSM]].&lt;br /&gt;
* The [[Definition:Liability for incurred claims|liability for incurred claims]] is still measured using full [[Definition:Fulfilment cash flows|fulfilment cash flows]], [[Definition:Discounting|discounting]], and a [[Definition:Risk adjustment|risk adjustment]], and the [[Definition:Onerous contract|onerous contract]] test and [[Definition:Grouping contracts|grouping rules]] continue to apply.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The premium allocation approach/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23019</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23019"/>
		<updated>2026-04-06T18:00:12Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 340px;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 19px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 22px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.25rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
   Binary classification: &amp;quot;Adjusts CSM&amp;quot; vs &amp;quot;Hits P&amp;amp;L directly&amp;quot;.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 78. Decision Rule Banner ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-rule {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  background: #fefce8;&lt;br /&gt;
  border: 1px solid #fde68a;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 79. Score Badges ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-score-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  padding: 0.3rem 0.65rem;&lt;br /&gt;
  border-radius: 20px;&lt;br /&gt;
  border: 1px solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 80. Scenario Card ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-num {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-text {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-icon {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0.85rem;&lt;br /&gt;
  right: 0.85rem;&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card--correct { border-color: var(--wix-correct); }&lt;br /&gt;
.wix-is-card--wrong   { border-color: var(--wix-wrong); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 81. Choice Buttons ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px dashed;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    transform   0.15s ease,&lt;br /&gt;
    box-shadow  0.15s ease,&lt;br /&gt;
    background  0.15s ease;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:hover {&lt;br /&gt;
  transform: scale(1.02);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:active {&lt;br /&gt;
  transform: scale(0.98);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:disabled {&lt;br /&gt;
  opacity: 0.45;&lt;br /&gt;
  cursor: default;&lt;br /&gt;
  transform: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-icon { font-size: 1.4em; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-sub {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--csm {&lt;br /&gt;
  border-color: #bfdbfe;&lt;br /&gt;
  background: #eff6ff;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--csm .wix-is-choice-title { color: #2563eb; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--pl {&lt;br /&gt;
  border-color: #fecaca;&lt;br /&gt;
  background: #fef2f2;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--pl .wix-is-choice-title { color: #dc2626; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 82. Feedback Panel ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border: 1px solid var(--wix-correct-border, #82e0aa);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border: 1px solid var(--wix-wrong-border, #f1948a);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-fb-head {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin-bottom: 0.25rem;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 83. Final Screen ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-final {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  padding: 2rem 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-icon { font-size: 2.5rem; margin-bottom: 0.65rem; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-body {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  max-width: 500px;&lt;br /&gt;
  margin: 0 auto 1.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 84. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-is-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
   Sort 9 items into 3 IFRS 17 income statement sections.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
/* ── category colour tokens (scoped) ── */&lt;br /&gt;
[data-wix-module=&amp;quot;income-builder&amp;quot;] {&lt;br /&gt;
  --ib-rev:        #1d4ed8;&lt;br /&gt;
  --ib-rev-bg:     #eff6ff;&lt;br /&gt;
  --ib-rev-border: #bfdbfe;&lt;br /&gt;
  --ib-exp:        #b45309;&lt;br /&gt;
  --ib-exp-bg:     #fffbeb;&lt;br /&gt;
  --ib-exp-border: #fde68a;&lt;br /&gt;
  --ib-fin:        #7c3aed;&lt;br /&gt;
  --ib-fin-bg:     #f5f3ff;&lt;br /&gt;
  --ib-fin-border: #ddd6fe;&lt;br /&gt;
  --ib-res:        #15803d;&lt;br /&gt;
  --ib-res-bg:     #f0fdf4;&lt;br /&gt;
  --ib-res-border: #bbf7d0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 85. Tile (current item) ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.55rem 0.9rem;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile-desc {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  padding-left: 0.15rem;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 86. Choice Buttons (3-column) ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice {&lt;br /&gt;
  padding: 0.65rem 0.4rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px solid;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: transform 0.15s, opacity 0.15s;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice:active { transform: scale(0.97); }&lt;br /&gt;
.wix-ib-choice:disabled { opacity: 0.45; cursor: default; transform: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice--rev { background: var(--ib-rev-bg); border-color: var(--ib-rev-border); color: var(--ib-rev); }&lt;br /&gt;
.wix-ib-choice--exp { background: var(--ib-exp-bg); border-color: var(--ib-exp-border); color: var(--ib-exp); }&lt;br /&gt;
.wix-ib-choice--fin { background: var(--ib-fin-bg); border-color: var(--ib-fin-border); color: var(--ib-fin); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 87. Income Statement Skeleton ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-stmt {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.45rem;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-title {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-count {&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 88. Drop Area + Placed Chips ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop {&lt;br /&gt;
  min-height: 40px;&lt;br /&gt;
  border: 2px dashed var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.4rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop-ph {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: #b0b0b0;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  padding: 0.2rem 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.25rem;&lt;br /&gt;
  padding: 0.3rem 0.6rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.74em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip--rev { background: var(--ib-rev-bg); color: var(--ib-rev); border: 1px solid var(--ib-rev-border); }&lt;br /&gt;
.wix-ib-chip--exp { background: var(--ib-exp-bg); color: var(--ib-exp); border: 1px solid var(--ib-exp-border); }&lt;br /&gt;
.wix-ib-chip--fin { background: var(--ib-fin-bg); color: var(--ib-fin); border: 1px solid var(--ib-fin-border); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 89. Result Row ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result {&lt;br /&gt;
  background: var(--ib-res-bg);&lt;br /&gt;
  border-bottom: 1px solid var(--ib-res-border);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-eq {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 90. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ib-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GM vs PAA STEPPER — data-wix-module=&amp;quot;gm-paa&amp;quot;&lt;br /&gt;
   Side-by-side table: step through General Model vs PAA.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
[data-wix-module=&amp;quot;gm-paa&amp;quot;] {&lt;br /&gt;
  --gp-gm:  #1a5276;&lt;br /&gt;
  --gp-paa: #6b4c8a;&lt;br /&gt;
  --gp-paa-light: #f3eef8;&lt;br /&gt;
  --gp-yes: #217a4b;&lt;br /&gt;
  --gp-no:  #b8423a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 91. Scenario Callout ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-scenario {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  background: #fdf6e0;&lt;br /&gt;
  border: 1px solid #e6d9a0;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  color: #6b5a10;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 92. Comparison Table ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-table {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-thead {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 80px 80px;&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  border-bottom: 2px solid var(--wix-border);&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-th--gm  { color: var(--gp-gm); }&lt;br /&gt;
.wix-gp-th--paa { color: var(--gp-paa); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 93. Row ────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 80px 80px;&lt;br /&gt;
  padding: 0 1rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  padding: 0.65rem 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  transition: color 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row--revealed .wix-gp-row-label { color: var(--wix-text); }&lt;br /&gt;
.wix-gp-row--current { background: var(--gp-paa-light); }&lt;br /&gt;
.wix-gp-row--current .wix-gp-row-label { font-weight: 600; }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-num {&lt;br /&gt;
  font-size: 0.65em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  width: 18px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-mark {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  padding: 0.65rem 0;&lt;br /&gt;
  font-size: 1.05em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  opacity: 0;&lt;br /&gt;
  transition: opacity 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-row--revealed .wix-gp-mark { opacity: 1; }&lt;br /&gt;
.wix-gp-mark--yes { color: var(--gp-yes); }&lt;br /&gt;
.wix-gp-mark--no  { color: var(--gp-no); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 94. Explanation Box ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  min-height: 44px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain-step {&lt;br /&gt;
  font-size: 0.64em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--gp-paa);&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-explain-body {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 95. Counters Row ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-counters {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-num {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  transition: color 0.3s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-num--kept { color: var(--gp-yes); }&lt;br /&gt;
.wix-gp-cbox-num--skip { color: var(--gp-no); }&lt;br /&gt;
.wix-gp-cbox-num--pct  { color: var(--gp-paa); }&lt;br /&gt;
&lt;br /&gt;
.wix-gp-cbox-lbl {&lt;br /&gt;
  font-size: 0.62em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  margin-top: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 96. Controls ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 97. Footnote ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gp-footnote {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 98. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 520px) {&lt;br /&gt;
  .wix-gp-thead,&lt;br /&gt;
  .wix-gp-row {&lt;br /&gt;
    grid-template-columns: 1fr 64px 64px;&lt;br /&gt;
    padding-left: 0.6rem;&lt;br /&gt;
    padding-right: 0.6rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23018</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23018"/>
		<updated>2026-04-06T17:59:58Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   - &amp;quot;impact-sort&amp;quot;       Binary classification: CSM vs P&amp;amp;L scenario sorter&lt;br /&gt;
   - &amp;quot;income-builder&amp;quot;    Sort 9 items into IFRS 17 income statement sections&lt;br /&gt;
   - &amp;quot;gm-paa&amp;quot;            Step-through comparison: General Model vs PAA&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks,&lt;br /&gt;
    &#039;impact-sort&#039;:          initImpactSort,&lt;br /&gt;
    &#039;income-builder&#039;:       initIncomeBuilder,&lt;br /&gt;
    &#039;gm-paa&#039;:               initGmPaa&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
     Binary classification exercise: does the scenario adjust the CSM&lt;br /&gt;
     or hit P&amp;amp;L directly?  Six shuffled cards, score tracking, and a&lt;br /&gt;
     final results screen.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initImpactSort( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Scenario data ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var SCENARIOS = [&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a new longevity study shows policyholders are living &amp;lt;strong&amp;gt;2\u00A0years longer&amp;lt;/strong&amp;gt; than assumed \u2014 expected death claims over the remaining coverage period fall by \u20AC12M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;This change relates to mortality expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period \u2014 service the insurer has &amp;lt;strong&amp;gt;not yet delivered&amp;lt;/strong&amp;gt;. Because it concerns future service, the \u20AC12M favourable change increases the CSM, and will be released as profit gradually as coverage continues.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? No \u2014 these are death claims expected &amp;lt;em&amp;gt;in the future&amp;lt;/em&amp;gt;, over the remaining life of the policies. Because it concerns future service, the \u20AC12M favourable change increases the CSM rather than appearing in P&amp;amp;L immediately.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCB0&#039;,&lt;br /&gt;
        text: &#039;AXA Belgium unit-linked savings contracts: revised data shows policyholder lapse rates will &amp;lt;strong&amp;gt;rise by 15%&amp;lt;/strong&amp;gt; over the remaining contract term, reducing expected future fee income by \u20AC8M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;Unfavourable changes about future service are absorbed by the CSM, just like favourable ones. The CSM decreases by \u20AC8M because fewer policyholders will stay to generate fees. The CSM acts as a buffer in both directions \u2014 as long as it stays at or above zero.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;The change relates to lapses that have &amp;lt;em&amp;gt;not yet happened&amp;lt;/em&amp;gt; \u2014 it\u2019s about future service. The fees lost are fees the insurer has not yet earned. Unfavourable changes about the future are absorbed by the CSM (decreasing it by \u20AC8M). The key: the service hasn\u2019t been provided yet.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83C\uDFE5&#039;,&lt;br /&gt;
        text: &#039;AXA Germany group disability portfolio: a large employer reports a &amp;lt;strong&amp;gt;cluster of 40 new disability claims&amp;lt;/strong&amp;gt; during the current reporting quarter, all arising from a factory closure this year.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The insurer was providing disability coverage when these claims were incurred \u2014 the service has &amp;lt;strong&amp;gt;already been delivered&amp;lt;/strong&amp;gt; for this period. Since this relates to current service, the full amount goes straight to insurance service expenses in the income statement. The CSM cannot absorb it.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? Yes \u2014 the disabilities occurred during the current quarter while the insurer was on risk. This is current-period service, so the cost goes straight to insurance service expenses. The CSM only absorbs changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCC5&#039;,&lt;br /&gt;
        text: &#039;AXA Switzerland individual annuity book: a &amp;lt;strong&amp;gt;prior-year reserve for an annuitant who died in 2023&amp;lt;/strong&amp;gt; is re-estimated upward because final medical and estate costs were higher than provisioned.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;This relates to &amp;lt;strong&amp;gt;past service&amp;lt;/strong&amp;gt; \u2014 the annuitant died in a prior period and the claim event is long settled. Any re-estimate of an already-incurred claim bypasses the CSM entirely and flows directly into insurance service expenses. The CSM only represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The annuitant died in 2023 \u2014 the service has long since been provided. Re-estimates of already-incurred claims relate to past service and go straight to the income statement. Remember: the CSM represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;, not service already delivered.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83E\uDE7A&#039;,&lt;br /&gt;
        text: &#039;AXA Japan critical illness portfolio: following a screening campaign, the insurer estimates &amp;lt;strong&amp;gt;200 cancer diagnoses occurred during H1&amp;lt;/strong&amp;gt; but won\u2019t be reported until H2. The full IBNR provision is booked.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The diagnoses are &amp;lt;strong&amp;gt;incurred&amp;lt;/strong&amp;gt; in H1, even if not yet reported. Once incurred, the liability relates to current service \u2014 the insurer was providing critical illness cover when the diseases arose. Any estimates of these claims go straight to the income statement. IBNR doesn\u2019t change this: incurred means the service has been provided.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The cancers were diagnosed during H1 \u2014 the insurer was on risk when they occurred. Even though the claims are IBNR (incurred but not yet reported), they are still &amp;lt;em&amp;gt;incurred&amp;lt;/em&amp;gt;, meaning the service has been provided. All incurred claim estimates bypass the CSM and go to P&amp;amp;L.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a pandemic scenario causes expected mortality claims to &amp;lt;strong&amp;gt;rise so sharply that the CSM would go below zero&amp;lt;/strong&amp;gt;. The change relates entirely to future service.&#039;,&lt;br /&gt;
        answer: &#039;both&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 but there\u2019s a twist.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 It\u2019s actually a trick question \u2014 both answers are partially right.&#039;,&lt;br /&gt;
        bothBody: &#039;This change relates to future service, so it &amp;lt;em&amp;gt;starts&amp;lt;/em&amp;gt; by adjusting the CSM. But the CSM cannot go negative. The portion that brings the CSM to zero is absorbed normally; the &amp;lt;strong&amp;gt;excess&amp;lt;/strong&amp;gt; spills over into P&amp;amp;L as an immediate loss. The group becomes onerous and a loss component is established. This is the one scenario where the answer is \u201Cboth\u201D \u2014 CSM first, then P&amp;amp;L for the overflow.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
    var current    = 0;&lt;br /&gt;
    var correct    = 0;&lt;br /&gt;
    var wrong      = 0;&lt;br /&gt;
    var answered   = false;&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Where Does the Impact Land?&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Decision rule */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-rule&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;The key question:&amp;lt;/strong&amp;gt; \u201CHas the service already been provided?\u201D If yes \u2192 P&amp;amp;L. If no \u2192 CSM.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress bar */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge&#039;, style: { border: &#039;none&#039;, padding: &#039;0&#039;, background: &#039;none&#039;, color: &#039;&#039; } } );&lt;br /&gt;
    var progBar  = wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( progBar );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeCorrect = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeWrong   = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeCorrect, badgeWrong ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Card stage */&lt;br /&gt;
    var cardStage = wix.el( &#039;div&#039; );&lt;br /&gt;
    wrapper.appendChild( cardStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnCsm = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--csm&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDD04&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Adjusts the CSM&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Future service \u2014 profit recognised later&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var btnPl = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--pl&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDCC9&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Hits P&amp;amp;L directly&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Current or past service \u2014 recognised now&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-choices&#039; }, [ btnCsm, btnPl ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next scenario \u25B8&#039;, style: { marginTop: &#039;0.6rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Render helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeCorrect.textContent = &#039;\u2713 &#039; + correct + &#039; correct&#039;;&lt;br /&gt;
      badgeWrong.textContent   = &#039;\u2717 &#039; + wrong + &#039; wrong&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderCard() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( current &amp;gt;= order.length ) {&lt;br /&gt;
        showFinal();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      var card = wix.el( &#039;div&#039;, { className: &#039;wix-is-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-num&#039;, textContent: &#039;Scenario &#039; + ( current + 1 ) + &#039; of &#039; + order.length } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-is-card-icon&#039;, textContent: s.icon } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-text&#039;, innerHTML: s.text } )&lt;br /&gt;
      ] );&lt;br /&gt;
      cardStage.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( current / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = current + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = false;&lt;br /&gt;
      btnPl.disabled  = false;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
      var isCorrect = s.answer === &#039;both&#039; ? true : chosen === s.answer;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) correct++; else wrong++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Card border */&lt;br /&gt;
      var card = cardStage.firstChild;&lt;br /&gt;
      card.className = &#039;wix-is-card &#039; + ( isCorrect ? &#039;wix-is-card--correct&#039; : &#039;wix-is-card--wrong&#039; );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( s.answer === &#039;both&#039; ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = chosen === &#039;csm&#039; ? s.correctHead : s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML   = s.bothBody;&lt;br /&gt;
      } else if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent   = s.correctHead;&lt;br /&gt;
        fbBody.innerHTML     = s.correctBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent   = s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML     = s.wrongBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = true;&lt;br /&gt;
      btnPl.disabled  = true;&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = current &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next scenario \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( correct / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect score!&#039; : pct &amp;gt;= 67 ? &#039;Well done!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You got &amp;lt;strong&amp;gt;&#039; + correct + &#039; out of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; correct (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        ( pct === 100&lt;br /&gt;
          ? &#039;You\u2019ve nailed the future vs.\u00A0current/past service distinction \u2014 the key question IFRS\u00A017 asks at every re-estimate.&#039;&lt;br /&gt;
          : &#039;Remember the key question: &amp;lt;strong&amp;gt;\u201CHas the service already been provided?\u201D&amp;lt;/strong&amp;gt; If yes, the change bypasses the CSM and goes straight to P&amp;amp;L. If no, it adjusts the CSM.&#039; );&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order   = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
      current = 0;&lt;br /&gt;
      correct = 0;&lt;br /&gt;
      wrong   = 0;&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
      renderCard();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnCsm.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;csm&#039; ); } );&lt;br /&gt;
    btnPl.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;pl&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { current++; renderCard(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderCard();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
     Sort 9 line items into the correct section of the IFRS 17&lt;br /&gt;
     income statement: Revenue, Service Expenses, or Finance.&lt;br /&gt;
     Items accumulate as chips in the statement skeleton.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIncomeBuilder( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { id: &#039;csm-release&#039;, icon: &#039;\uD83C\uDF81&#039;, label: &#039;CSM release&#039;,&lt;br /&gt;
        desc: &#039;Share of unearned profit recognised as coverage is provided&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;The CSM release represents profit earned by delivering coverage during the period. It is one of the three components that build insurance revenue \u2014 alongside expected claims costs and the RA release.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The CSM release is the share of unearned profit recognised as the insurer delivers coverage. Revenue under IFRS 17 is built from three releases: expected claims costs, the RA release, and the CSM release. All three go to revenue.&#039; },&lt;br /&gt;
      { id: &#039;ra-release&#039;, icon: &#039;\uD83D\uDEE1\uFE0F&#039;, label: &#039;Risk adjustment release&#039;,&lt;br /&gt;
        desc: &#039;Reduction in RA as risk is borne over time&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;Bearing risk is part of the service the insurer provides. As each period passes and uncertainty diminishes, the released portion of the RA flows into insurance revenue \u2014 it represents compensation for risk the insurer has now borne.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The RA release reflects risk the insurer has already borne \u2014 that\u2019s a service delivered. Under IFRS 17, it is one of the three components of insurance revenue, not an expense or a finance item.&#039; },&lt;br /&gt;
      { id: &#039;claims-alloc&#039;, icon: &#039;\uD83D\uDCCB&#039;, label: &#039;Expected claims &amp;amp; expenses allocated to period&#039;,&lt;br /&gt;
        desc: &#039;Portion of estimated claims/expenses matching coverage provided (e.g.\u00A0the Lyon home contract at 6\u00A0months)&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;This is often the most surprising one. Under IFRS 17, the portion of expected claims cost allocated to the period is a component of revenue, not an expense. Think of the Lyon home contract: at six months, half the expected cost is released into revenue. The logic is that revenue measures the &amp;lt;em&amp;gt;value of service delivered&amp;lt;/em&amp;gt;, and the expected claims cost is part of that value. Actual claims incurred go to expenses.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This actually belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;Under IFRS 17, revenue is not premiums \u2014 it\u2019s the value of coverage delivered. That value includes the expected claims cost allocated to the period (like the Lyon home contract at 6\u00A0months), plus the RA release and CSM release. The &amp;lt;em&amp;gt;expected&amp;lt;/em&amp;gt; cost is a revenue component; &amp;lt;em&amp;gt;actual&amp;lt;/em&amp;gt; incurred claims go to expenses.&#039; },&lt;br /&gt;
      { id: &#039;claims-incurred&#039;, icon: &#039;\u26C8\uFE0F&#039;, label: &#039;Claims incurred&#039;,&lt;br /&gt;
        desc: &#039;Actual claim costs from events that occurred (e.g.\u00A0hailstorm damaging 200 cars in Bavaria)&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When the Bavaria hailstorm damages 200 cars, the cost of those actual claims is an insurance service expense. This is the cost of events that have happened \u2014 current or past service \u2014 hitting the income statement directly.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Claims incurred, like the Bavaria hailstorm damaging 200 cars, are the actual costs of insured events. These go to insurance service expenses \u2014 they\u2019re the cost side of underwriting, paired against revenue to produce the insurance service result.&#039; },&lt;br /&gt;
      { id: &#039;est-change-past&#039;, icon: &#039;\uD83D\uDD27&#039;, label: &#039;Changes in estimates for current/past service&#039;,&lt;br /&gt;
        desc: &#039;Re-estimates of claims already incurred or coverage already provided&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When estimates change for service already delivered \u2014 like revised repair costs on claims already incurred \u2014 the adjustment bypasses the CSM and goes straight to insurance service expenses. Only changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service adjust the CSM.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Changes in estimates for current or past service relate to coverage already provided. They cannot go through the CSM (which is about future profit) and they aren\u2019t a finance effect. They go directly to insurance service expenses in the income statement.&#039; },&lt;br /&gt;
      { id: &#039;onerous-loss&#039;, icon: &#039;\uD83D\uDEA8&#039;, label: &#039;Losses on onerous groups&#039;,&lt;br /&gt;
        desc: &#039;Initial losses at recognition and subsequent deterioration of onerous groups&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Losses on onerous contracts \u2014 whether recognised at day one or from subsequent deterioration \u2014 are part of insurance service expenses. They reflect the cost of underwriting contracts that are expected to be unprofitable, which is fundamentally a service-related cost.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Onerous group losses are an underwriting cost, not a finance effect. Whether it\u2019s a day-one loss or subsequent deterioration, these sit within insurance service expenses \u2014 they tell you about pricing and claims management, not market conditions.&#039; },&lt;br /&gt;
      { id: &#039;acq-costs&#039;, icon: &#039;\uD83E\uDD1D&#039;, label: &#039;Acquisition costs amortised&#039;,&lt;br /&gt;
        desc: &#039;Commissions to brokers (e.g.\u00A0in Belgium) and distribution costs (e.g.\u00A0in Spain), spread over the period&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Under IFRS 17, acquisition costs \u2014 like commissions paid to Belgian brokers or Spanish distribution costs \u2014 are amortised and included within insurance service expenses. They\u2019re not shown as a separate deduction; this keeps the insurance service result self-contained.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Acquisition costs (Belgian broker commissions, Spanish distribution costs) are amortised within insurance service expenses under IFRS 17 \u2014 not shown separately. The insurance service result captures the &amp;lt;em&amp;gt;full&amp;lt;/em&amp;gt; cost of acquiring, servicing, and settling contracts.&#039; },&lt;br /&gt;
      { id: &#039;discount-unwind&#039;, icon: &#039;\u23F3&#039;, label: &#039;Unwinding of the discount&#039;,&lt;br /&gt;
        desc: &#039;Liability grows as future payments get closer in time (accretion of interest)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;The discount unwind is a financing effect, not an underwriting cost. As future claim payments draw closer, the present value of the liability rises \u2014 this accretion of interest belongs in insurance finance income or expense, keeping the service result clean.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;A common mistake! The discount unwind feels like a cost of doing business, but IFRS 17 treats it as a financing effect. It goes to insurance finance income or expense \u2014 &amp;lt;em&amp;gt;not&amp;lt;/em&amp;gt; to the service result. This separation is deliberate: it keeps underwriting profitability free from time-value-of-money effects.&#039; },&lt;br /&gt;
      { id: &#039;rate-change&#039;, icon: &#039;\uD83D\uDCC9&#039;, label: &#039;Effect of discount rate changes&#039;,&lt;br /&gt;
        desc: &#039;Gains or losses when market interest rates move between reporting dates (e.g.\u00A0rates drop for AXA Germany long-tail liability contracts)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;When interest rates drop \u2014 as in the AXA Germany long-tail liability example \u2014 the present value of future claims increases, creating a financial expense. This has nothing to do with underwriting quality, so it sits in insurance finance income or expense. The insurer can also choose the OCI option to keep rate volatility out of reported profit entirely.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;Discount rate changes (like the AXA Germany long-tail scenario where rates drop sharply) are a market-driven effect, not underwriting performance. IFRS 17 places them in insurance finance income or expense to keep the service result undistorted. The insurer may also elect the OCI option to smooth this further.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
    var cur = 0, ok = 0, no = 0, answered = false;&lt;br /&gt;
    var placed = { revenue: [], expenses: [], finance: [] };&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Build the Income Statement&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { style: { fontSize: &#039;0.78em&#039;, fontWeight: &#039;600&#039;, color: &#039;var(--wix-text-muted)&#039;, whiteSpace: &#039;nowrap&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeOk = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeNo = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeOk, badgeNo ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Tile stage */&lt;br /&gt;
    var tileStage = wix.el( &#039;div&#039;, { style: { minHeight: &#039;60px&#039;, marginBottom: &#039;1rem&#039; } } );&lt;br /&gt;
    wrapper.appendChild( tileStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnRev = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--rev&#039;, innerHTML: &#039;Insurance&amp;lt;br&amp;gt;Revenue&#039; } );&lt;br /&gt;
    var btnExp = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--exp&#039;, innerHTML: &#039;Service&amp;lt;br&amp;gt;Expenses&#039; } );&lt;br /&gt;
    var btnFin = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--fin&#039;, innerHTML: &#039;Finance&amp;lt;br&amp;gt;Inc/Exp&#039; } );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-ib-choices&#039; }, [ btnRev, btnExp, btnFin ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Income statement skeleton */&lt;br /&gt;
    function makeSection( dotColor, titleColor, titleText, zoneKey ) {&lt;br /&gt;
      var countEl = wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-count&#039;, textContent: &#039;0 items&#039; } );&lt;br /&gt;
      var dropEl  = wix.el( &#039;div&#039;, { className: &#039;wix-ib-drop&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
      var section = wix.el( &#039;div&#039;, { className: &#039;wix-ib-section&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ib-sec-head&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-dot&#039;, style: { background: dotColor } } ),&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-title&#039;, style: { color: titleColor }, textContent: titleText } ),&lt;br /&gt;
          countEl&lt;br /&gt;
        ] ),&lt;br /&gt;
        dropEl&lt;br /&gt;
      ] );&lt;br /&gt;
      return { section: section, dropEl: dropEl, countEl: countEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var revSec = makeSection( &#039;var(--ib-rev)&#039;, &#039;var(--ib-rev)&#039;, &#039;Insurance Revenue&#039;, &#039;revenue&#039; );&lt;br /&gt;
    var expSec = makeSection( &#039;var(--ib-exp)&#039;, &#039;var(--ib-exp)&#039;, &#039;Insurance Service Expenses&#039;, &#039;expenses&#039; );&lt;br /&gt;
    var finSec = makeSection( &#039;var(--ib-fin)&#039;, &#039;var(--ib-fin)&#039;, &#039;Insurance Finance Income / Expense&#039;, &#039;finance&#039; );&lt;br /&gt;
&lt;br /&gt;
    var resultRow = wix.el( &#039;div&#039;, { className: &#039;wix-ib-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-label&#039;, textContent: &#039;= Insurance Service Result&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-eq&#039;, textContent: &#039;Revenue \u2212 Expenses&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-stmt&#039; }, [&lt;br /&gt;
      revSec.section, expSec.section, resultRow, finSec.section&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next item \u25B8&#039;, style: { marginTop: &#039;0.5rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ZONE_MAP = {&lt;br /&gt;
      revenue:  { sec: revSec,  chipCls: &#039;wix-ib-chip--rev&#039; },&lt;br /&gt;
      expenses: { sec: expSec,  chipCls: &#039;wix-ib-chip--exp&#039; },&lt;br /&gt;
      finance:  { sec: finSec,  chipCls: &#039;wix-ib-chip--fin&#039; }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeOk.textContent = &#039;\u2713 &#039; + ok;&lt;br /&gt;
      badgeNo.textContent = &#039;\u2717 &#039; + no;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateCounts() {&lt;br /&gt;
      revSec.countEl.textContent = placed.revenue.length + &#039; item&#039; + ( placed.revenue.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      expSec.countEl.textContent = placed.expenses.length + &#039; item&#039; + ( placed.expenses.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      finSec.countEl.textContent = placed.finance.length + &#039; item&#039; + ( placed.finance.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function toggleBtns( on ) {&lt;br /&gt;
      btnRev.disabled = !on;&lt;br /&gt;
      btnExp.disabled = !on;&lt;br /&gt;
      btnFin.disabled = !on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderTile() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( cur &amp;gt;= order.length ) { showFinal(); return; }&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.icon } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.label } )&lt;br /&gt;
      ] ) );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile-desc&#039;, textContent: it.desc } ) );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( cur / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = cur + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      toggleBtns( true );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
      toggleBtns( false );&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      var isCorrect = chosen === it.zone;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) ok++; else no++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Place chip in correct zone (always into the right section) */&lt;br /&gt;
      var target = ZONE_MAP[it.zone];&lt;br /&gt;
      var ph = target.sec.dropEl.querySelector( &#039;.wix-ib-drop-ph&#039; );&lt;br /&gt;
      if ( ph ) ph.parentNode.removeChild( ph );&lt;br /&gt;
&lt;br /&gt;
      var chip = wix.el( &#039;span&#039;, { className: &#039;wix-ib-chip &#039; + target.chipCls, textContent: it.icon + &#039; &#039; + it.label } );&lt;br /&gt;
      target.sec.dropEl.appendChild( chip );&lt;br /&gt;
      placed[it.zone].push( it.id );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      /* Hide tile */&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = it.okHead;&lt;br /&gt;
        fbBody.innerHTML   = it.okBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent = it.noHead;&lt;br /&gt;
        fbBody.innerHTML   = it.noBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = cur &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next item \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( ok / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect \u2014 you built it!&#039; : pct &amp;gt;= 67 ? &#039;Almost there!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You placed &amp;lt;strong&amp;gt;&#039; + ok + &#039; of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; items correctly (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        &#039;The completed income statement above is now your reference. Notice how the &amp;lt;strong&amp;gt;Insurance Service Result&amp;lt;/strong&amp;gt; sits between revenue and expenses \u2014 purely underwriting \u2014 while finance effects live below, keeping the two stories separate.&#039;;&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
      cur = 0; ok = 0; no = 0; answered = false;&lt;br /&gt;
      placed.revenue = []; placed.expenses = []; placed.finance = [];&lt;br /&gt;
&lt;br /&gt;
      /* Clear chips, restore placeholders */&lt;br /&gt;
      [ revSec, expSec, finSec ].forEach( function ( s ) {&lt;br /&gt;
        wix.empty( s.dropEl );&lt;br /&gt;
        s.dropEl.appendChild( wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } ) );&lt;br /&gt;
      } );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      renderTile();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnRev.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;revenue&#039; ); } );&lt;br /&gt;
    btnExp.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;expenses&#039; ); } );&lt;br /&gt;
    btnFin.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;finance&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { cur++; renderTile(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderTile();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GM vs PAA STEPPER — data-wix-module=&amp;quot;gm-paa&amp;quot;&lt;br /&gt;
     Side-by-side step-through: General Model vs PAA.  Click &amp;quot;Next&amp;quot;&lt;br /&gt;
     to reveal each row, see a ✔/✘ for PAA, read an explanation,&lt;br /&gt;
     and watch the kept/skipped/effort-saved counters build up.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGmPaa( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var STEPS = [&lt;br /&gt;
      { label: &#039;Collect premiums and deduct acquisition costs&#039;,               kept: true,&lt;br /&gt;
        explain: &#039;Both paths start identically. The insurer collects premiums from the German motor group and deducts acquisition costs paid.&#039; },&lt;br /&gt;
      { label: &#039;Project all future cash flows for remaining coverage&#039;,        kept: false,&lt;br /&gt;
        explain: &#039;The General Model requires probability-weighted projections of every future cash flow. The PAA skips this \u2014 the premium itself serves as the proxy for expected service.&#039; },&lt;br /&gt;
      { label: &#039;Discount projected cash flows to present value&#039;,              kept: false,&lt;br /&gt;
        explain: &#039;Because the PAA doesn\u2019t project future cash flows for remaining coverage, there is nothing to discount. For a one-year contract the time-value difference is immaterial.&#039; },&lt;br /&gt;
      { label: &#039;Calculate a risk adjustment on remaining coverage&#039;,           kept: false,&lt;br /&gt;
        explain: &#039;The General Model quantifies compensation for bearing uncertainty about future cash flows. The PAA does not require this on the Liability for Remaining Coverage \u2014 another layer of actuarial judgment avoided.&#039; },&lt;br /&gt;
      { label: &#039;Derive and track a Contractual Service Margin (CSM)&#039;,         kept: false,&lt;br /&gt;
        explain: &#039;The heart of the simplification. The General Model calculates the CSM as the residual between fulfilment cash flows and premiums, then tracks it over time. The PAA has no CSM \u2014 the premium-based liability replaces the entire mechanism.&#039; },&lt;br /&gt;
      { label: &#039;Release the CSM via coverage units each quarter&#039;,             kept: false,&lt;br /&gt;
        explain: &#039;Under the General Model the insurer defines coverage units and allocates the CSM to determine revenue. Under the PAA, proportional time passage does the same job \u2014 each quarter, one quarter of the liability is released as insurance revenue.&#039; },&lt;br /&gt;
      { label: &#039;Release remaining coverage as insurance revenue over time&#039;,   kept: true,&lt;br /&gt;
        explain: &#039;Both approaches recognise insurance revenue as coverage is delivered. The PAA simply releases the premium-based liability proportionally over the coverage period \u2014 same result, far fewer calculations.&#039; },&lt;br /&gt;
      { label: &#039;When a claim occurs, measure the Liability for Incurred Claims using fulfilment cash flows&#039;, kept: true,&lt;br /&gt;
        explain: &#039;Once a claim event happens, both paths converge. The insurer estimates the present value of future payments using probability-weighted cash flows. The PAA simplifies the \u201Cpromise outstanding\u201D side, not the \u201Cclaims already happened\u201D side.&#039; },&lt;br /&gt;
      { label: &#039;Discount the Liability for Incurred Claims to present value&#039;, kept: true,&lt;br /&gt;
        explain: &#039;Both the General Model and PAA require discounting on incurred claims. The simplification only applies to the Liability for Remaining Coverage.&#039; },&lt;br /&gt;
      { label: &#039;Add a risk adjustment to the Liability for Incurred Claims&#039;,  kept: true,&lt;br /&gt;
        explain: &#039;The PAA removes the risk adjustment only on the remaining coverage side. For incurred claims, the insurer still quantifies uncertainty. Both models are identical here.&#039; },&lt;br /&gt;
      { label: &#039;Apply the onerous contract test \u2014 recognise any loss immediately&#039;, kept: true,&lt;br /&gt;
        explain: &#039;If the group is expected to generate a loss, both approaches require immediate recognition. The PAA is a simplification, not an escape from prudent accounting.&#039; },&lt;br /&gt;
      { label: &#039;Follow IFRS 17 grouping rules (portfolios, profitability groups, annual cohorts)&#039;, kept: true,&lt;br /&gt;
        explain: &#039;Grouping requirements are unchanged. Portfolios, profitability groups, and annual cohorts apply in exactly the same way under the PAA as under the General Model.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var current = -1;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;General Model vs PAA \u2014 Side by Side&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Scenario callout */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-scenario&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;Scenario:&amp;lt;/strong&amp;gt; A group of one-year motor insurance contracts in Germany, measured under both approaches.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Table */&lt;br /&gt;
    var thead = wix.el( &#039;div&#039;, { className: &#039;wix-gp-thead&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th&#039;, textContent: &#039;Step&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th wix-gp-th--gm&#039;, textContent: &#039;General Model&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-gp-th wix-gp-th--paa&#039;, textContent: &#039;PAA (shortcut)&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    var rowEls = [];&lt;br /&gt;
    var gmMarks = [];&lt;br /&gt;
    var paaMarks = [];&lt;br /&gt;
&lt;br /&gt;
    STEPS.forEach( function ( s, i ) {&lt;br /&gt;
      var gm  = wix.el( &#039;div&#039;, { className: &#039;wix-gp-mark&#039; } );&lt;br /&gt;
      var paa = wix.el( &#039;div&#039;, { className: &#039;wix-gp-mark&#039; } );&lt;br /&gt;
      gmMarks.push( gm );&lt;br /&gt;
      paaMarks.push( paa );&lt;br /&gt;
&lt;br /&gt;
      var row = wix.el( &#039;div&#039;, { className: &#039;wix-gp-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-gp-row-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-gp-num&#039;, textContent: String( i + 1 ) } ),&lt;br /&gt;
          wix.el( &#039;span&#039;, { textContent: s.label } )&lt;br /&gt;
        ] ),&lt;br /&gt;
        gm,&lt;br /&gt;
        paa&lt;br /&gt;
      ] );&lt;br /&gt;
      rowEls.push( row );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    var rowsWrap = wix.el( &#039;div&#039;, {}, rowEls );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-table&#039; }, [ thead, rowsWrap ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation box */&lt;br /&gt;
    var eStep = wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain-step&#039; } );&lt;br /&gt;
    var eBody = wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain-body&#039;, innerHTML: &#039;Press &amp;lt;strong&amp;gt;Next&amp;lt;/strong&amp;gt; to begin.&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-explain&#039; }, [ eStep, eBody ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Counters */&lt;br /&gt;
    var ctKept = wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-num wix-gp-cbox-num--kept&#039;, textContent: &#039;0&#039; } );&lt;br /&gt;
    var ctSkip = wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-num wix-gp-cbox-num--skip&#039;, textContent: &#039;0&#039; } );&lt;br /&gt;
    var ctPct  = wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-num wix-gp-cbox-num--pct&#039;,  textContent: &#039;\u2014&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-counters&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctKept, wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: &#039;Steps kept&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctSkip, wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: &#039;Steps skipped&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox&#039; }, [ ctPct,  wix.el( &#039;div&#039;, { className: &#039;wix-gp-cbox-lbl&#039;, textContent: &#039;Effort saved&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Controls */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var btnNext  = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next \u2192&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gp-controls&#039; }, [ btnReset, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Footnote */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gp-footnote&#039;, textContent: &#039;The PAA simplifies the Liability for Remaining Coverage side \u2014 not the Liability for Incurred Claims side.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var kept = 0, skipped = 0;&lt;br /&gt;
&lt;br /&gt;
      STEPS.forEach( function ( s, i ) {&lt;br /&gt;
        var row = rowEls[i];&lt;br /&gt;
        if ( i &amp;lt;= current ) {&lt;br /&gt;
          row.className = &#039;wix-gp-row wix-gp-row--revealed&#039; + ( i === current ? &#039; wix-gp-row--current&#039; : &#039;&#039; );&lt;br /&gt;
          gmMarks[i].className  = &#039;wix-gp-mark wix-gp-mark--yes&#039;;&lt;br /&gt;
          gmMarks[i].textContent = &#039;\u2714&#039;;&lt;br /&gt;
          paaMarks[i].className  = s.kept ? &#039;wix-gp-mark wix-gp-mark--yes&#039; : &#039;wix-gp-mark wix-gp-mark--no&#039;;&lt;br /&gt;
          paaMarks[i].textContent = s.kept ? &#039;\u2714&#039; : &#039;\u2718&#039;;&lt;br /&gt;
          if ( s.kept ) kept++; else skipped++;&lt;br /&gt;
        } else {&lt;br /&gt;
          row.className = &#039;wix-gp-row&#039;;&lt;br /&gt;
          gmMarks[i].className  = &#039;wix-gp-mark&#039;;&lt;br /&gt;
          gmMarks[i].textContent = &#039;&#039;;&lt;br /&gt;
          paaMarks[i].className  = &#039;wix-gp-mark&#039;;&lt;br /&gt;
          paaMarks[i].textContent = &#039;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      /* Explanation */&lt;br /&gt;
      if ( current &amp;gt;= 0 ) {&lt;br /&gt;
        var s = STEPS[current];&lt;br /&gt;
        eStep.textContent = &#039;Step &#039; + ( current + 1 ) + &#039; of &#039; + STEPS.length +&lt;br /&gt;
          ( s.kept ? &#039; \u00B7 Kept by PAA&#039; : &#039; \u00B7 Skipped by PAA&#039; );&lt;br /&gt;
        eBody.textContent = s.explain;&lt;br /&gt;
      } else {&lt;br /&gt;
        eStep.textContent = &#039;&#039;;&lt;br /&gt;
        eBody.innerHTML   = &#039;Press &amp;lt;strong&amp;gt;Next&amp;lt;/strong&amp;gt; to begin.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Counters */&lt;br /&gt;
      ctKept.textContent = kept;&lt;br /&gt;
      ctSkip.textContent = skipped;&lt;br /&gt;
      var total = kept + skipped;&lt;br /&gt;
      ctPct.textContent  = total &amp;gt; 0 ? Math.round( skipped / STEPS.length * 100 ) + &#039;%&#039; : &#039;\u2014&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Button */&lt;br /&gt;
      if ( current &amp;gt;= STEPS.length - 1 ) {&lt;br /&gt;
        btnNext.disabled = true;&lt;br /&gt;
        btnNext.textContent = &#039;Complete \u2713&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNext.disabled = false;&lt;br /&gt;
        btnNext.textContent = &#039;Next \u2192&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( current &amp;lt; STEPS.length - 1 ) { current++; update(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      current = -1; update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_income_statement_under_IFRS_17&amp;diff=23017</id>
		<title>Internal:Training/IFRS17/The income statement under IFRS 17</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_income_statement_under_IFRS_17&amp;diff=23017"/>
		<updated>2026-04-06T17:39:48Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:General model|general model]] tracks an insurance group over time through unwinding the [[Definition:Discount rate|discount]], releasing the [[Definition:Risk adjustment|risk adjustment]], releasing the [[Definition:Contractual service margin|CSM]], and adjusting for changes in estimates. Now we build on that by asking: where do all these movements actually appear when the insurer publishes its financial results?&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* Why [[Definition:IFRS 17|IFRS 17]] replaces [[Definition:Premium|premiums]] with a new concept of [[Definition:Insurance revenue|insurance revenue]] based on service delivered, and how that revenue is calculated&lt;br /&gt;
* How insurance service expenses combine with insurance revenue to produce the [[Definition:Insurance service result|insurance service result]], the key profitability measure for underwriting&lt;br /&gt;
* What [[Definition:Insurance finance income or expense|insurance finance income and expense]] captures, and why the standard offers a choice between [[Definition:Profit or loss|profit or loss]] and [[Definition:Other comprehensive income|OCI]] for presenting the effect of [[Definition:Discount rate|discount rate]] changes&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Insurance revenue: not premiums, but service delivered ==&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;A fundamental shift in thinking.&#039;&#039;&#039; Under older accounting frameworks, an insurer&#039;s [[Definition:Income statement|income statement]] typically started with [[Definition:Gross written premium|gross written premiums]]: the total amount customers paid during the period. IFRS 17 abandons that approach entirely. Instead of showing cash collected from policyholders, the standard requires insurers to recognise [[Definition:Insurance revenue|insurance revenue]] based on the value of service delivered to the policyholder in each period. The logic mirrors how other industries work: a construction company does not report the full contract price the moment a client signs; it recognises revenue as it builds each floor. Insurance works the same way under IFRS 17, with the &amp;quot;service&amp;quot; being the provision of [[Definition:Insurance coverage|insurance coverage]] and the handling of [[Definition:Claims|claims]].&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;How insurance revenue is built.&#039;&#039;&#039; Insurance revenue for a period is not a single line pulled from a bank statement. It is assembled from the building blocks you already know. In each reporting period, the insurer calculates how much of the expected total service has been delivered, and revenue is made up of three components released from the [[Definition:Insurance contract liability|liability]]: the portion of expected [[Definition:Claims|claims]] and [[Definition:Expenses|expenses]] allocated to the period, the release of the [[Definition:Risk adjustment|risk adjustment]] reflecting the reduction in [[Definition:Risk|risk]] as time passes, and the release of the [[Definition:Contractual service margin|CSM]] representing the share of [[Definition:Profit|profit]] earned for the coverage provided. To illustrate, consider a one-year home insurance contract written in Lyon covering fire and water damage. If six months have passed, roughly half of the expected claims cost, half of the risk adjustment, and half of the CSM would be released into revenue, because approximately half of the coverage period has elapsed.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Many people assume that insurance revenue equals [[Definition:Premium|premiums]] received. This is incorrect. A policyholder might pay a €1,200 annual [[Definition:Premium|premium]] upfront in January, but the insurer cannot show €1,200 of revenue in January. Revenue is earned gradually as coverage is provided. Under IFRS 17, the premium itself never appears as a revenue line; it is simply a cash flow that reduces the [[Definition:Insurance contract liability|liability]]. If you look at an IFRS 17 income statement and search for &amp;quot;premiums&amp;quot; in the revenue section, you will not find it.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Why this matters for comparability.&#039;&#039;&#039; By tying revenue to service rather than to cash, IFRS 17 makes insurance companies comparable to businesses in other industries and, crucially, comparable to each other. Under previous standards, two insurers with identical risk portfolios could report very different revenue figures simply because one collected premiums annually and the other monthly. IFRS 17 eliminates that distortion. Revenue now tells you how much protection the insurer delivered during the period, not how much money it collected. For an insurer like AXA, operating across multiple countries with varying payment practices, this harmonisation is especially valuable because it allows meaningful comparisons between, say, the French and Spanish operations.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; Revenue tells you what the insurer earned for providing coverage. But an income statement also needs to show the cost of delivering that service. What costs does the insurer deduct from insurance revenue, and how does the standard present the resulting profit from pure underwriting activity?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Insurance service expenses and the insurance service result ==&lt;br /&gt;
&lt;br /&gt;
💸 &#039;&#039;&#039;The cost of keeping the promise.&#039;&#039;&#039; On the other side of the equation, [[Definition:Insurance service expenses|insurance service expenses]] capture everything the insurer spends to fulfil its [[Definition:Insurance contract|insurance contracts]] during the period. This line includes [[Definition:Claims incurred|claims incurred]], which are the costs of events that have actually happened, such as a hailstorm damaging 200 cars in Bavaria. It also includes changes in the [[Definition:Fulfilment cash flows|fulfilment cash flows]] that relate to current or past service, meaning adjustments to the estimated cost of claims that have already occurred or coverage that has already been provided. Finally, insurance service expenses capture any [[Definition:Onerous contract|losses on onerous groups]] of contracts, including both initial losses recognised at day one and any deterioration in onerous groups during the period.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Arriving at the insurance service result.&#039;&#039;&#039; When you subtract insurance service expenses from [[Definition:Insurance revenue|insurance revenue]], you arrive at the [[Definition:Insurance service result|insurance service result]]. This single number is the headline measure of underwriting profitability under IFRS 17, and it is designed to show how well the insurer priced and managed its [[Definition:Insurance coverage|insurance coverage]], stripped of any financial market effects. Think of it as the answer to a simple question: &amp;quot;Did we make money from the actual business of insuring people?&amp;quot; If an insurer like AXA writes property contracts across France and Germany, the insurance service result tells the board whether the [[Definition:Underwriting|underwriting]] activity, selling coverage and paying claims, was profitable on its own merits.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that the insurance service result is similar to the old [[Definition:Combined ratio|combined ratio]] or [[Definition:Underwriting result|underwriting result]] under previous standards. While it serves a comparable purpose, it is built on a fundamentally different foundation. The old underwriting result was driven by [[Definition:Premium|premiums earned]] and [[Definition:Claims|claims]] paid or reserved. The IFRS 17 insurance service result is driven by service-based revenue and [[Definition:Fulfilment cash flows|fulfilment cash flow]] movements. This means the timing of recognition can differ significantly. An expense that would have been recognised immediately under old rules might flow through the [[Definition:Contractual service margin|CSM]] first under IFRS 17 if it relates to future service, and never directly appear as an expense at all.&lt;br /&gt;
&lt;br /&gt;
🧩 &#039;&#039;&#039;Reading the result in practice.&#039;&#039;&#039; In a published IFRS 17 income statement, the insurance service result sits prominently near the top, giving the reader an immediate view of operational insurance performance. Below revenue, you will see the insurance service expenses, and then the result as a subtotal. Any [[Definition:Acquisition costs|acquisition costs]], such as [[Definition:Commission|commissions]] paid to brokers in Belgium or direct [[Definition:Distribution|distribution]] costs in Spain, are amortised and included within service expenses rather than shown as a separate deduction. This keeps the insurance service result self-contained: it captures the full cost of acquiring, servicing, and settling contracts in one place.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; The insurance service result isolates the underwriting story. But insurers also hold large pools of assets and discount their liabilities over time, which generates financial effects. Where do those financial movements appear, and does the insurer have any choice in how to present them?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Insurance finance income/expense and the OCI option ==&lt;br /&gt;
&lt;br /&gt;
📈 &#039;&#039;&#039;The financial side of insurance.&#039;&#039;&#039; Below the [[Definition:Insurance service result|insurance service result]], the income statement contains a separate section for [[Definition:Insurance finance income or expense|insurance finance income or expense]]. This line captures the financial effects of insurance contracts, primarily the unwinding of the [[Definition:Discount rate|discount]] on the [[Definition:Insurance contract liability|liability]] over time and the impact of changes in [[Definition:Discount rate|discount rates]] between reporting periods. To understand why this matters, recall that insurance liabilities are [[Definition:Discounting|discounted]] to reflect the [[Definition:Time value of money|time value of money]]. As each month passes, the liability grows slightly because the insurer is one month closer to paying claims; this growth is the &amp;quot;unwind&amp;quot; of the discount. Separately, if market [[Definition:Interest rate|interest rates]] rise or fall between two reporting dates, the present value of the entire liability shifts, creating a gain or loss that has nothing to do with underwriting performance.&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Why separation matters.&#039;&#039;&#039; Placing these financial effects in their own section keeps the insurance service result clean. Consider a scenario in which AXA Germany writes a block of long-tail [[Definition:Liability insurance|liability]] contracts. If interest rates drop sharply, the [[Definition:Present value|present value]] of future claims payments increases, creating a significant financial expense. Under previous frameworks, this could have been tangled with underwriting results, making it difficult to tell whether the business was poorly priced or simply affected by market movements. IFRS 17 separates these stories. The insurance service result answers &amp;quot;Did we underwrite well?&amp;quot; while insurance finance income or expense answers &amp;quot;How did financial conditions affect us?&amp;quot; This separation gives analysts and management a much clearer picture of what is actually happening inside the business.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners believe that insurance finance income or expense only includes [[Definition:Interest rate|interest rate]] effects. In fact, it also captures the financial effect of any changes in other assumptions that alter the [[Definition:Discount rate|discount rate]] or the [[Definition:Time value of money|time value of money]] component of the liability, including changes driven by currency effects on [[Definition:Fulfilment cash flows|fulfilment cash flows]] denominated in a foreign currency. The line is broader than pure interest rate movements, so be careful not to equate it with a simple &amp;quot;interest expense&amp;quot; entry.&lt;br /&gt;
&lt;br /&gt;
⚖️ &#039;&#039;&#039;The OCI option.&#039;&#039;&#039; IFRS 17 gives insurers a significant presentation choice for the effect of discount rate changes. The insurer can recognise all insurance finance income or expense in [[Definition:Profit or loss|profit or loss]], which means every discount rate movement flows straight through the income statement. Alternatively, the insurer can choose to disaggregate: it recognises a systematic portion in profit or loss (typically based on the rate locked in at [[Definition:Initial recognition|initial recognition]]) and parks the difference caused by subsequent rate changes in [[Definition:Other comprehensive income|other comprehensive income]], or OCI. The OCI option reduces [[Definition:Volatility|volatility]] in reported profit because discount rate swings, which are often large and driven by macroeconomic conditions beyond the insurer&#039;s control, are kept out of the bottom line. For a multi-country group, this choice is made at the [[Definition:Portfolio|portfolio]] level, meaning some portfolios can use the OCI option while others present everything in profit or loss. The choice, once made, is applied consistently.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;income-builder&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* [[Definition:Insurance revenue|Insurance revenue]] under IFRS 17 is not [[Definition:Premium|premiums]] received; it is the value of service delivered in each period, built from the release of expected [[Definition:Claims|claims]] costs, the [[Definition:Risk adjustment|risk adjustment]], and the [[Definition:Contractual service margin|CSM]].&lt;br /&gt;
* The [[Definition:Insurance service result|insurance service result]] isolates pure underwriting profitability by matching insurance revenue against [[Definition:Insurance service expenses|insurance service expenses]], giving a clear view of whether the insurer priced and managed its coverage well.&lt;br /&gt;
* [[Definition:Insurance finance income or expense|Insurance finance income or expense]] captures the financial effects of [[Definition:Discounting|discounting]] and rate changes separately from underwriting, and the insurer may choose the [[Definition:Other comprehensive income|OCI]] option to keep discount rate [[Definition:Volatility|volatility]] out of reported [[Definition:Profit or loss|profit or loss]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The income statement under IFRS 17/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23016</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23016"/>
		<updated>2026-04-06T17:39:04Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   - &amp;quot;impact-sort&amp;quot;       Binary classification: CSM vs P&amp;amp;L scenario sorter&lt;br /&gt;
   - &amp;quot;income-builder&amp;quot;    Sort 9 items into IFRS 17 income statement sections&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks,&lt;br /&gt;
    &#039;impact-sort&#039;:          initImpactSort,&lt;br /&gt;
    &#039;income-builder&#039;:       initIncomeBuilder&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
     Binary classification exercise: does the scenario adjust the CSM&lt;br /&gt;
     or hit P&amp;amp;L directly?  Six shuffled cards, score tracking, and a&lt;br /&gt;
     final results screen.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initImpactSort( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Scenario data ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var SCENARIOS = [&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a new longevity study shows policyholders are living &amp;lt;strong&amp;gt;2\u00A0years longer&amp;lt;/strong&amp;gt; than assumed \u2014 expected death claims over the remaining coverage period fall by \u20AC12M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;This change relates to mortality expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period \u2014 service the insurer has &amp;lt;strong&amp;gt;not yet delivered&amp;lt;/strong&amp;gt;. Because it concerns future service, the \u20AC12M favourable change increases the CSM, and will be released as profit gradually as coverage continues.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? No \u2014 these are death claims expected &amp;lt;em&amp;gt;in the future&amp;lt;/em&amp;gt;, over the remaining life of the policies. Because it concerns future service, the \u20AC12M favourable change increases the CSM rather than appearing in P&amp;amp;L immediately.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCB0&#039;,&lt;br /&gt;
        text: &#039;AXA Belgium unit-linked savings contracts: revised data shows policyholder lapse rates will &amp;lt;strong&amp;gt;rise by 15%&amp;lt;/strong&amp;gt; over the remaining contract term, reducing expected future fee income by \u20AC8M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;Unfavourable changes about future service are absorbed by the CSM, just like favourable ones. The CSM decreases by \u20AC8M because fewer policyholders will stay to generate fees. The CSM acts as a buffer in both directions \u2014 as long as it stays at or above zero.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;The change relates to lapses that have &amp;lt;em&amp;gt;not yet happened&amp;lt;/em&amp;gt; \u2014 it\u2019s about future service. The fees lost are fees the insurer has not yet earned. Unfavourable changes about the future are absorbed by the CSM (decreasing it by \u20AC8M). The key: the service hasn\u2019t been provided yet.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83C\uDFE5&#039;,&lt;br /&gt;
        text: &#039;AXA Germany group disability portfolio: a large employer reports a &amp;lt;strong&amp;gt;cluster of 40 new disability claims&amp;lt;/strong&amp;gt; during the current reporting quarter, all arising from a factory closure this year.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The insurer was providing disability coverage when these claims were incurred \u2014 the service has &amp;lt;strong&amp;gt;already been delivered&amp;lt;/strong&amp;gt; for this period. Since this relates to current service, the full amount goes straight to insurance service expenses in the income statement. The CSM cannot absorb it.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? Yes \u2014 the disabilities occurred during the current quarter while the insurer was on risk. This is current-period service, so the cost goes straight to insurance service expenses. The CSM only absorbs changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCC5&#039;,&lt;br /&gt;
        text: &#039;AXA Switzerland individual annuity book: a &amp;lt;strong&amp;gt;prior-year reserve for an annuitant who died in 2023&amp;lt;/strong&amp;gt; is re-estimated upward because final medical and estate costs were higher than provisioned.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;This relates to &amp;lt;strong&amp;gt;past service&amp;lt;/strong&amp;gt; \u2014 the annuitant died in a prior period and the claim event is long settled. Any re-estimate of an already-incurred claim bypasses the CSM entirely and flows directly into insurance service expenses. The CSM only represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The annuitant died in 2023 \u2014 the service has long since been provided. Re-estimates of already-incurred claims relate to past service and go straight to the income statement. Remember: the CSM represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;, not service already delivered.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83E\uDE7A&#039;,&lt;br /&gt;
        text: &#039;AXA Japan critical illness portfolio: following a screening campaign, the insurer estimates &amp;lt;strong&amp;gt;200 cancer diagnoses occurred during H1&amp;lt;/strong&amp;gt; but won\u2019t be reported until H2. The full IBNR provision is booked.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The diagnoses are &amp;lt;strong&amp;gt;incurred&amp;lt;/strong&amp;gt; in H1, even if not yet reported. Once incurred, the liability relates to current service \u2014 the insurer was providing critical illness cover when the diseases arose. Any estimates of these claims go straight to the income statement. IBNR doesn\u2019t change this: incurred means the service has been provided.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The cancers were diagnosed during H1 \u2014 the insurer was on risk when they occurred. Even though the claims are IBNR (incurred but not yet reported), they are still &amp;lt;em&amp;gt;incurred&amp;lt;/em&amp;gt;, meaning the service has been provided. All incurred claim estimates bypass the CSM and go to P&amp;amp;L.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a pandemic scenario causes expected mortality claims to &amp;lt;strong&amp;gt;rise so sharply that the CSM would go below zero&amp;lt;/strong&amp;gt;. The change relates entirely to future service.&#039;,&lt;br /&gt;
        answer: &#039;both&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 but there\u2019s a twist.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 It\u2019s actually a trick question \u2014 both answers are partially right.&#039;,&lt;br /&gt;
        bothBody: &#039;This change relates to future service, so it &amp;lt;em&amp;gt;starts&amp;lt;/em&amp;gt; by adjusting the CSM. But the CSM cannot go negative. The portion that brings the CSM to zero is absorbed normally; the &amp;lt;strong&amp;gt;excess&amp;lt;/strong&amp;gt; spills over into P&amp;amp;L as an immediate loss. The group becomes onerous and a loss component is established. This is the one scenario where the answer is \u201Cboth\u201D \u2014 CSM first, then P&amp;amp;L for the overflow.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
    var current    = 0;&lt;br /&gt;
    var correct    = 0;&lt;br /&gt;
    var wrong      = 0;&lt;br /&gt;
    var answered   = false;&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Where Does the Impact Land?&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Decision rule */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-rule&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;The key question:&amp;lt;/strong&amp;gt; \u201CHas the service already been provided?\u201D If yes \u2192 P&amp;amp;L. If no \u2192 CSM.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress bar */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge&#039;, style: { border: &#039;none&#039;, padding: &#039;0&#039;, background: &#039;none&#039;, color: &#039;&#039; } } );&lt;br /&gt;
    var progBar  = wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( progBar );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeCorrect = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeWrong   = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeCorrect, badgeWrong ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Card stage */&lt;br /&gt;
    var cardStage = wix.el( &#039;div&#039; );&lt;br /&gt;
    wrapper.appendChild( cardStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnCsm = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--csm&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDD04&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Adjusts the CSM&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Future service \u2014 profit recognised later&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var btnPl = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--pl&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDCC9&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Hits P&amp;amp;L directly&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Current or past service \u2014 recognised now&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-choices&#039; }, [ btnCsm, btnPl ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next scenario \u25B8&#039;, style: { marginTop: &#039;0.6rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Render helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeCorrect.textContent = &#039;\u2713 &#039; + correct + &#039; correct&#039;;&lt;br /&gt;
      badgeWrong.textContent   = &#039;\u2717 &#039; + wrong + &#039; wrong&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderCard() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( current &amp;gt;= order.length ) {&lt;br /&gt;
        showFinal();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      var card = wix.el( &#039;div&#039;, { className: &#039;wix-is-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-num&#039;, textContent: &#039;Scenario &#039; + ( current + 1 ) + &#039; of &#039; + order.length } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-is-card-icon&#039;, textContent: s.icon } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-text&#039;, innerHTML: s.text } )&lt;br /&gt;
      ] );&lt;br /&gt;
      cardStage.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( current / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = current + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = false;&lt;br /&gt;
      btnPl.disabled  = false;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
      var isCorrect = s.answer === &#039;both&#039; ? true : chosen === s.answer;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) correct++; else wrong++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Card border */&lt;br /&gt;
      var card = cardStage.firstChild;&lt;br /&gt;
      card.className = &#039;wix-is-card &#039; + ( isCorrect ? &#039;wix-is-card--correct&#039; : &#039;wix-is-card--wrong&#039; );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( s.answer === &#039;both&#039; ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = chosen === &#039;csm&#039; ? s.correctHead : s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML   = s.bothBody;&lt;br /&gt;
      } else if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent   = s.correctHead;&lt;br /&gt;
        fbBody.innerHTML     = s.correctBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent   = s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML     = s.wrongBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = true;&lt;br /&gt;
      btnPl.disabled  = true;&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = current &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next scenario \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( correct / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect score!&#039; : pct &amp;gt;= 67 ? &#039;Well done!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You got &amp;lt;strong&amp;gt;&#039; + correct + &#039; out of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; correct (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        ( pct === 100&lt;br /&gt;
          ? &#039;You\u2019ve nailed the future vs.\u00A0current/past service distinction \u2014 the key question IFRS\u00A017 asks at every re-estimate.&#039;&lt;br /&gt;
          : &#039;Remember the key question: &amp;lt;strong&amp;gt;\u201CHas the service already been provided?\u201D&amp;lt;/strong&amp;gt; If yes, the change bypasses the CSM and goes straight to P&amp;amp;L. If no, it adjusts the CSM.&#039; );&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order   = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
      current = 0;&lt;br /&gt;
      correct = 0;&lt;br /&gt;
      wrong   = 0;&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
      renderCard();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnCsm.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;csm&#039; ); } );&lt;br /&gt;
    btnPl.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;pl&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { current++; renderCard(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderCard();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
     Sort 9 line items into the correct section of the IFRS 17&lt;br /&gt;
     income statement: Revenue, Service Expenses, or Finance.&lt;br /&gt;
     Items accumulate as chips in the statement skeleton.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIncomeBuilder( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { id: &#039;csm-release&#039;, icon: &#039;\uD83C\uDF81&#039;, label: &#039;CSM release&#039;,&lt;br /&gt;
        desc: &#039;Share of unearned profit recognised as coverage is provided&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;The CSM release represents profit earned by delivering coverage during the period. It is one of the three components that build insurance revenue \u2014 alongside expected claims costs and the RA release.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The CSM release is the share of unearned profit recognised as the insurer delivers coverage. Revenue under IFRS 17 is built from three releases: expected claims costs, the RA release, and the CSM release. All three go to revenue.&#039; },&lt;br /&gt;
      { id: &#039;ra-release&#039;, icon: &#039;\uD83D\uDEE1\uFE0F&#039;, label: &#039;Risk adjustment release&#039;,&lt;br /&gt;
        desc: &#039;Reduction in RA as risk is borne over time&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;Bearing risk is part of the service the insurer provides. As each period passes and uncertainty diminishes, the released portion of the RA flows into insurance revenue \u2014 it represents compensation for risk the insurer has now borne.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;The RA release reflects risk the insurer has already borne \u2014 that\u2019s a service delivered. Under IFRS 17, it is one of the three components of insurance revenue, not an expense or a finance item.&#039; },&lt;br /&gt;
      { id: &#039;claims-alloc&#039;, icon: &#039;\uD83D\uDCCB&#039;, label: &#039;Expected claims &amp;amp; expenses allocated to period&#039;,&lt;br /&gt;
        desc: &#039;Portion of estimated claims/expenses matching coverage provided (e.g.\u00A0the Lyon home contract at 6\u00A0months)&#039;,&lt;br /&gt;
        zone: &#039;revenue&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Revenue.&#039;,&lt;br /&gt;
        okBody: &#039;This is often the most surprising one. Under IFRS 17, the portion of expected claims cost allocated to the period is a component of revenue, not an expense. Think of the Lyon home contract: at six months, half the expected cost is released into revenue. The logic is that revenue measures the &amp;lt;em&amp;gt;value of service delivered&amp;lt;/em&amp;gt;, and the expected claims cost is part of that value. Actual claims incurred go to expenses.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This actually belongs in Insurance Revenue.&#039;,&lt;br /&gt;
        noBody: &#039;Under IFRS 17, revenue is not premiums \u2014 it\u2019s the value of coverage delivered. That value includes the expected claims cost allocated to the period (like the Lyon home contract at 6\u00A0months), plus the RA release and CSM release. The &amp;lt;em&amp;gt;expected&amp;lt;/em&amp;gt; cost is a revenue component; &amp;lt;em&amp;gt;actual&amp;lt;/em&amp;gt; incurred claims go to expenses.&#039; },&lt;br /&gt;
      { id: &#039;claims-incurred&#039;, icon: &#039;\u26C8\uFE0F&#039;, label: &#039;Claims incurred&#039;,&lt;br /&gt;
        desc: &#039;Actual claim costs from events that occurred (e.g.\u00A0hailstorm damaging 200 cars in Bavaria)&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When the Bavaria hailstorm damages 200 cars, the cost of those actual claims is an insurance service expense. This is the cost of events that have happened \u2014 current or past service \u2014 hitting the income statement directly.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Claims incurred, like the Bavaria hailstorm damaging 200 cars, are the actual costs of insured events. These go to insurance service expenses \u2014 they\u2019re the cost side of underwriting, paired against revenue to produce the insurance service result.&#039; },&lt;br /&gt;
      { id: &#039;est-change-past&#039;, icon: &#039;\uD83D\uDD27&#039;, label: &#039;Changes in estimates for current/past service&#039;,&lt;br /&gt;
        desc: &#039;Re-estimates of claims already incurred or coverage already provided&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;When estimates change for service already delivered \u2014 like revised repair costs on claims already incurred \u2014 the adjustment bypasses the CSM and goes straight to insurance service expenses. Only changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service adjust the CSM.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Changes in estimates for current or past service relate to coverage already provided. They cannot go through the CSM (which is about future profit) and they aren\u2019t a finance effect. They go directly to insurance service expenses in the income statement.&#039; },&lt;br /&gt;
      { id: &#039;onerous-loss&#039;, icon: &#039;\uD83D\uDEA8&#039;, label: &#039;Losses on onerous groups&#039;,&lt;br /&gt;
        desc: &#039;Initial losses at recognition and subsequent deterioration of onerous groups&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Losses on onerous contracts \u2014 whether recognised at day one or from subsequent deterioration \u2014 are part of insurance service expenses. They reflect the cost of underwriting contracts that are expected to be unprofitable, which is fundamentally a service-related cost.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Onerous group losses are an underwriting cost, not a finance effect. Whether it\u2019s a day-one loss or subsequent deterioration, these sit within insurance service expenses \u2014 they tell you about pricing and claims management, not market conditions.&#039; },&lt;br /&gt;
      { id: &#039;acq-costs&#039;, icon: &#039;\uD83E\uDD1D&#039;, label: &#039;Acquisition costs amortised&#039;,&lt;br /&gt;
        desc: &#039;Commissions to brokers (e.g.\u00A0in Belgium) and distribution costs (e.g.\u00A0in Spain), spread over the period&#039;,&lt;br /&gt;
        zone: &#039;expenses&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Service Expenses.&#039;,&lt;br /&gt;
        okBody: &#039;Under IFRS 17, acquisition costs \u2014 like commissions paid to Belgian brokers or Spanish distribution costs \u2014 are amortised and included within insurance service expenses. They\u2019re not shown as a separate deduction; this keeps the insurance service result self-contained.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Service Expenses.&#039;,&lt;br /&gt;
        noBody: &#039;Acquisition costs (Belgian broker commissions, Spanish distribution costs) are amortised within insurance service expenses under IFRS 17 \u2014 not shown separately. The insurance service result captures the &amp;lt;em&amp;gt;full&amp;lt;/em&amp;gt; cost of acquiring, servicing, and settling contracts.&#039; },&lt;br /&gt;
      { id: &#039;discount-unwind&#039;, icon: &#039;\u23F3&#039;, label: &#039;Unwinding of the discount&#039;,&lt;br /&gt;
        desc: &#039;Liability grows as future payments get closer in time (accretion of interest)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;The discount unwind is a financing effect, not an underwriting cost. As future claim payments draw closer, the present value of the liability rises \u2014 this accretion of interest belongs in insurance finance income or expense, keeping the service result clean.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;A common mistake! The discount unwind feels like a cost of doing business, but IFRS 17 treats it as a financing effect. It goes to insurance finance income or expense \u2014 &amp;lt;em&amp;gt;not&amp;lt;/em&amp;gt; to the service result. This separation is deliberate: it keeps underwriting profitability free from time-value-of-money effects.&#039; },&lt;br /&gt;
      { id: &#039;rate-change&#039;, icon: &#039;\uD83D\uDCC9&#039;, label: &#039;Effect of discount rate changes&#039;,&lt;br /&gt;
        desc: &#039;Gains or losses when market interest rates move between reporting dates (e.g.\u00A0rates drop for AXA Germany long-tail liability contracts)&#039;,&lt;br /&gt;
        zone: &#039;finance&#039;,&lt;br /&gt;
        okHead: &#039;\u2705 Correct \u2014 Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        okBody: &#039;When interest rates drop \u2014 as in the AXA Germany long-tail liability example \u2014 the present value of future claims increases, creating a financial expense. This has nothing to do with underwriting quality, so it sits in insurance finance income or expense. The insurer can also choose the OCI option to keep rate volatility out of reported profit entirely.&#039;,&lt;br /&gt;
        noHead: &#039;\u2717 This belongs in Insurance Finance Income / Expense.&#039;,&lt;br /&gt;
        noBody: &#039;Discount rate changes (like the AXA Germany long-tail scenario where rates drop sharply) are a market-driven effect, not underwriting performance. IFRS 17 places them in insurance finance income or expense to keep the service result undistorted. The insurer may also elect the OCI option to smooth this further.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
    var cur = 0, ok = 0, no = 0, answered = false;&lt;br /&gt;
    var placed = { revenue: [], expenses: [], finance: [] };&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Build the Income Statement&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { style: { fontSize: &#039;0.78em&#039;, fontWeight: &#039;600&#039;, color: &#039;var(--wix-text-muted)&#039;, whiteSpace: &#039;nowrap&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeOk = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeNo = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeOk, badgeNo ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Tile stage */&lt;br /&gt;
    var tileStage = wix.el( &#039;div&#039;, { style: { minHeight: &#039;60px&#039;, marginBottom: &#039;1rem&#039; } } );&lt;br /&gt;
    wrapper.appendChild( tileStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnRev = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--rev&#039;, innerHTML: &#039;Insurance&amp;lt;br&amp;gt;Revenue&#039; } );&lt;br /&gt;
    var btnExp = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--exp&#039;, innerHTML: &#039;Service&amp;lt;br&amp;gt;Expenses&#039; } );&lt;br /&gt;
    var btnFin = wix.el( &#039;button&#039;, { className: &#039;wix-ib-choice wix-ib-choice--fin&#039;, innerHTML: &#039;Finance&amp;lt;br&amp;gt;Inc/Exp&#039; } );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-ib-choices&#039; }, [ btnRev, btnExp, btnFin ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Income statement skeleton */&lt;br /&gt;
    function makeSection( dotColor, titleColor, titleText, zoneKey ) {&lt;br /&gt;
      var countEl = wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-count&#039;, textContent: &#039;0 items&#039; } );&lt;br /&gt;
      var dropEl  = wix.el( &#039;div&#039;, { className: &#039;wix-ib-drop&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
      var section = wix.el( &#039;div&#039;, { className: &#039;wix-ib-section&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ib-sec-head&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-dot&#039;, style: { background: dotColor } } ),&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-ib-sec-title&#039;, style: { color: titleColor }, textContent: titleText } ),&lt;br /&gt;
          countEl&lt;br /&gt;
        ] ),&lt;br /&gt;
        dropEl&lt;br /&gt;
      ] );&lt;br /&gt;
      return { section: section, dropEl: dropEl, countEl: countEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var revSec = makeSection( &#039;var(--ib-rev)&#039;, &#039;var(--ib-rev)&#039;, &#039;Insurance Revenue&#039;, &#039;revenue&#039; );&lt;br /&gt;
    var expSec = makeSection( &#039;var(--ib-exp)&#039;, &#039;var(--ib-exp)&#039;, &#039;Insurance Service Expenses&#039;, &#039;expenses&#039; );&lt;br /&gt;
    var finSec = makeSection( &#039;var(--ib-fin)&#039;, &#039;var(--ib-fin)&#039;, &#039;Insurance Finance Income / Expense&#039;, &#039;finance&#039; );&lt;br /&gt;
&lt;br /&gt;
    var resultRow = wix.el( &#039;div&#039;, { className: &#039;wix-ib-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-label&#039;, textContent: &#039;= Insurance Service Result&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ib-result-eq&#039;, textContent: &#039;Revenue \u2212 Expenses&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-stmt&#039; }, [&lt;br /&gt;
      revSec.section, expSec.section, resultRow, finSec.section&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next item \u25B8&#039;, style: { marginTop: &#039;0.5rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ZONE_MAP = {&lt;br /&gt;
      revenue:  { sec: revSec,  chipCls: &#039;wix-ib-chip--rev&#039; },&lt;br /&gt;
      expenses: { sec: expSec,  chipCls: &#039;wix-ib-chip--exp&#039; },&lt;br /&gt;
      finance:  { sec: finSec,  chipCls: &#039;wix-ib-chip--fin&#039; }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeOk.textContent = &#039;\u2713 &#039; + ok;&lt;br /&gt;
      badgeNo.textContent = &#039;\u2717 &#039; + no;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateCounts() {&lt;br /&gt;
      revSec.countEl.textContent = placed.revenue.length + &#039; item&#039; + ( placed.revenue.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      expSec.countEl.textContent = placed.expenses.length + &#039; item&#039; + ( placed.expenses.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
      finSec.countEl.textContent = placed.finance.length + &#039; item&#039; + ( placed.finance.length !== 1 ? &#039;s&#039; : &#039;&#039; );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function toggleBtns( on ) {&lt;br /&gt;
      btnRev.disabled = !on;&lt;br /&gt;
      btnExp.disabled = !on;&lt;br /&gt;
      btnFin.disabled = !on;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderTile() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( cur &amp;gt;= order.length ) { showFinal(); return; }&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.icon } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { textContent: it.label } )&lt;br /&gt;
      ] ) );&lt;br /&gt;
      tileStage.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ib-tile-desc&#039;, textContent: it.desc } ) );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( cur / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = cur + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      toggleBtns( true );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
      toggleBtns( false );&lt;br /&gt;
&lt;br /&gt;
      var it = ITEMS[order[cur]];&lt;br /&gt;
      var isCorrect = chosen === it.zone;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) ok++; else no++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Place chip in correct zone (always into the right section) */&lt;br /&gt;
      var target = ZONE_MAP[it.zone];&lt;br /&gt;
      var ph = target.sec.dropEl.querySelector( &#039;.wix-ib-drop-ph&#039; );&lt;br /&gt;
      if ( ph ) ph.parentNode.removeChild( ph );&lt;br /&gt;
&lt;br /&gt;
      var chip = wix.el( &#039;span&#039;, { className: &#039;wix-ib-chip &#039; + target.chipCls, textContent: it.icon + &#039; &#039; + it.label } );&lt;br /&gt;
      target.sec.dropEl.appendChild( chip );&lt;br /&gt;
      placed[it.zone].push( it.id );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      /* Hide tile */&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = it.okHead;&lt;br /&gt;
        fbBody.innerHTML   = it.okBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent = it.noHead;&lt;br /&gt;
        fbBody.innerHTML   = it.noBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = cur &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next item \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( tileStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( ok / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect \u2014 you built it!&#039; : pct &amp;gt;= 67 ? &#039;Almost there!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You placed &amp;lt;strong&amp;gt;&#039; + ok + &#039; of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; items correctly (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        &#039;The completed income statement above is now your reference. Notice how the &amp;lt;strong&amp;gt;Insurance Service Result&amp;lt;/strong&amp;gt; sits between revenue and expenses \u2014 purely underwriting \u2014 while finance effects live below, keeping the two stories separate.&#039;;&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order = shuffle( makeRange( ITEMS.length ) );&lt;br /&gt;
      cur = 0; ok = 0; no = 0; answered = false;&lt;br /&gt;
      placed.revenue = []; placed.expenses = []; placed.finance = [];&lt;br /&gt;
&lt;br /&gt;
      /* Clear chips, restore placeholders */&lt;br /&gt;
      [ revSec, expSec, finSec ].forEach( function ( s ) {&lt;br /&gt;
        wix.empty( s.dropEl );&lt;br /&gt;
        s.dropEl.appendChild( wix.el( &#039;span&#039;, { className: &#039;wix-ib-drop-ph&#039;, textContent: &#039;Items will appear here&#039; } ) );&lt;br /&gt;
      } );&lt;br /&gt;
      updateCounts();&lt;br /&gt;
&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-ib-choices&#039;;&lt;br /&gt;
      renderTile();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnRev.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;revenue&#039; ); } );&lt;br /&gt;
    btnExp.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;expenses&#039; ); } );&lt;br /&gt;
    btnFin.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;finance&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { cur++; renderTile(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderTile();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23015</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23015"/>
		<updated>2026-04-06T17:38:14Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 340px;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 19px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 22px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.25rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
   Binary classification: &amp;quot;Adjusts CSM&amp;quot; vs &amp;quot;Hits P&amp;amp;L directly&amp;quot;.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 78. Decision Rule Banner ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-rule {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  background: #fefce8;&lt;br /&gt;
  border: 1px solid #fde68a;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 79. Score Badges ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-score-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  padding: 0.3rem 0.65rem;&lt;br /&gt;
  border-radius: 20px;&lt;br /&gt;
  border: 1px solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 80. Scenario Card ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-num {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-text {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-icon {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0.85rem;&lt;br /&gt;
  right: 0.85rem;&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card--correct { border-color: var(--wix-correct); }&lt;br /&gt;
.wix-is-card--wrong   { border-color: var(--wix-wrong); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 81. Choice Buttons ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px dashed;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    transform   0.15s ease,&lt;br /&gt;
    box-shadow  0.15s ease,&lt;br /&gt;
    background  0.15s ease;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:hover {&lt;br /&gt;
  transform: scale(1.02);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:active {&lt;br /&gt;
  transform: scale(0.98);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:disabled {&lt;br /&gt;
  opacity: 0.45;&lt;br /&gt;
  cursor: default;&lt;br /&gt;
  transform: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-icon { font-size: 1.4em; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-sub {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--csm {&lt;br /&gt;
  border-color: #bfdbfe;&lt;br /&gt;
  background: #eff6ff;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--csm .wix-is-choice-title { color: #2563eb; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--pl {&lt;br /&gt;
  border-color: #fecaca;&lt;br /&gt;
  background: #fef2f2;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--pl .wix-is-choice-title { color: #dc2626; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 82. Feedback Panel ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border: 1px solid var(--wix-correct-border, #82e0aa);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border: 1px solid var(--wix-wrong-border, #f1948a);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-fb-head {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin-bottom: 0.25rem;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 83. Final Screen ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-final {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  padding: 2rem 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-icon { font-size: 2.5rem; margin-bottom: 0.65rem; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-body {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  max-width: 500px;&lt;br /&gt;
  margin: 0 auto 1.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 84. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-is-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INCOME BUILDER — data-wix-module=&amp;quot;income-builder&amp;quot;&lt;br /&gt;
   Sort 9 items into 3 IFRS 17 income statement sections.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
/* ── category colour tokens (scoped) ── */&lt;br /&gt;
[data-wix-module=&amp;quot;income-builder&amp;quot;] {&lt;br /&gt;
  --ib-rev:        #1d4ed8;&lt;br /&gt;
  --ib-rev-bg:     #eff6ff;&lt;br /&gt;
  --ib-rev-border: #bfdbfe;&lt;br /&gt;
  --ib-exp:        #b45309;&lt;br /&gt;
  --ib-exp-bg:     #fffbeb;&lt;br /&gt;
  --ib-exp-border: #fde68a;&lt;br /&gt;
  --ib-fin:        #7c3aed;&lt;br /&gt;
  --ib-fin-bg:     #f5f3ff;&lt;br /&gt;
  --ib-fin-border: #ddd6fe;&lt;br /&gt;
  --ib-res:        #15803d;&lt;br /&gt;
  --ib-res-bg:     #f0fdf4;&lt;br /&gt;
  --ib-res-border: #bbf7d0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 85. Tile (current item) ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.55rem 0.9rem;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-tile-desc {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  padding-left: 0.15rem;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 86. Choice Buttons (3-column) ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice {&lt;br /&gt;
  padding: 0.65rem 0.4rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px solid;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition: transform 0.15s, opacity 0.15s;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice:active { transform: scale(0.97); }&lt;br /&gt;
.wix-ib-choice:disabled { opacity: 0.45; cursor: default; transform: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-choice--rev { background: var(--ib-rev-bg); border-color: var(--ib-rev-border); color: var(--ib-rev); }&lt;br /&gt;
.wix-ib-choice--exp { background: var(--ib-exp-bg); border-color: var(--ib-exp-border); color: var(--ib-exp); }&lt;br /&gt;
.wix-ib-choice--fin { background: var(--ib-fin-bg); border-color: var(--ib-fin-border); color: var(--ib-fin); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 87. Income Statement Skeleton ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-stmt {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-section:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.45rem;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-title {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-sec-count {&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 88. Drop Area + Placed Chips ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop {&lt;br /&gt;
  min-height: 40px;&lt;br /&gt;
  border: 2px dashed var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.4rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-drop-ph {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  color: #b0b0b0;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  padding: 0.2rem 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.25rem;&lt;br /&gt;
  padding: 0.3rem 0.6rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.74em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-chip--rev { background: var(--ib-rev-bg); color: var(--ib-rev); border: 1px solid var(--ib-rev-border); }&lt;br /&gt;
.wix-ib-chip--exp { background: var(--ib-exp-bg); color: var(--ib-exp); border: 1px solid var(--ib-exp-border); }&lt;br /&gt;
.wix-ib-chip--fin { background: var(--ib-fin-bg); color: var(--ib-fin); border: 1px solid var(--ib-fin-border); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 89. Result Row ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result {&lt;br /&gt;
  background: var(--ib-res-bg);&lt;br /&gt;
  border-bottom: 1px solid var(--ib-res-border);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ib-result-eq {&lt;br /&gt;
  font-size: 0.76em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--ib-res);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 90. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ib-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Wix:Training/IFRS17/The_general_model:_subsequent_measurement/quiz&amp;diff=23014</id>
		<title>Wix:Training/IFRS17/The general model: subsequent measurement/quiz</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Wix:Training/IFRS17/The_general_model:_subsequent_measurement/quiz&amp;diff=23014"/>
		<updated>2026-04-06T17:28:14Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quiz/start}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
| question       = AXA issues a group of 3,000 ten-year disability income contracts to employees of several large employers in Lyon, France. At the start of 2026, the group&#039;s fulfilment cash flows have a present value of €10 million, discounted at 3%. One year passes with no change in assumptions and no claims. What happens to the liability solely due to the passage of time?&lt;br /&gt;
| option_a       = It decreases by €300,000 because the remaining coverage period is shorter.&lt;br /&gt;
| option_b       = It increases by approximately €300,000 due to the unwinding of the discount.&lt;br /&gt;
| option_c       = It stays the same because no claims have occurred.&lt;br /&gt;
| option_d       = It decreases by €300,000 because the risk adjustment is released.&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The discount unwinds as future cash flows move one year closer to payment, increasing the present value of the liability by approximately €10 million × 3% = €300,000. This accretion occurs even when no claims happen and no assumptions change. Option (a) confuses the direction of the effect; option (d) describes a separate movement.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
| question       = For the same Lyon disability group, the risk adjustment at the start of 2026 was €600,000. During the year, a portion of risk is borne without adverse experience. Where does the released portion of the risk adjustment appear?&lt;br /&gt;
| option_a       = Insurance finance income or expense.&lt;br /&gt;
| option_b       = It reduces the contractual service margin.&lt;br /&gt;
| option_c       = Insurance revenue.&lt;br /&gt;
| option_d       = It is returned to policyholders as a premium refund.&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = Bearing risk is part of the service the insurer provides, so the released risk adjustment is recognised as insurance revenue. The unwinding of the discount, by contrast, appears in insurance finance income or expense, which is why option (a) is incorrect here.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
| question       = The Lyon disability group has a CSM of €2 million at the start of 2026 and provides roughly equal coverage over its eight remaining years. Approximately how much CSM is released into insurance revenue for 2026?&lt;br /&gt;
| option_a       = €2 million, because the insurer has earned all its profit by surviving the year.&lt;br /&gt;
| option_b       = €250,000, based on the coverage units for one of eight remaining years.&lt;br /&gt;
| option_c       = Nothing, because the CSM is only released when claims are paid.&lt;br /&gt;
| option_d       = €125,000, because only half the risk adjustment has been released.&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The CSM is released using coverage units. With eight years of equal coverage remaining, one-eighth of the €2 million CSM (€250,000) is released in 2026. The CSM is not linked to claim payments (option c) nor to the risk adjustment release (option d).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
| question       = A new analyst in the Lyon office classifies the €300,000 discount unwinding as part of insurance revenue when preparing the quarterly report. Is this correct?&lt;br /&gt;
| option_a       = Yes, because all changes in the liability are part of insurance revenue.&lt;br /&gt;
| option_b       = No, the unwinding of the discount is a financing effect and belongs in insurance finance income or expense.&lt;br /&gt;
| option_c       = Yes, because the unwinding represents earned premium.&lt;br /&gt;
| option_d       = No, the unwinding should be recorded as a reduction of the CSM.&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The unwinding of the discount is a financing effect, not a service result. It is presented in insurance finance income or expense, keeping it separate from the insurance service result. Mixing the two would distort the picture of how much profit the insurer earns from providing coverage.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L&lt;br /&gt;
| question       = In mid-2026, updated epidemiological data suggests that long-term disability incidence rates among the insured workforce in Lyon are trending lower than originally assumed. AXA&#039;s actuaries reduce expected future disability benefit payments for the group by €400,000. The change relates entirely to coverage not yet provided. How is this favourable change treated?&lt;br /&gt;
| option_a       = It is recognised immediately as a profit in the income statement.&lt;br /&gt;
| option_b       = It increases the CSM by €400,000, to be released over remaining coverage periods.&lt;br /&gt;
| option_c       = It reduces insurance revenue by €400,000 in the current period.&lt;br /&gt;
| option_d       = It is ignored until the claims actually fail to materialise.&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = Changes in estimates relating to future service adjust the CSM rather than hitting profit or loss immediately. The additional €400,000 of CSM will be released gradually as coverage is provided. Option (a) would front-load profit before the service is delivered, which IFRS 17 is designed to prevent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L&lt;br /&gt;
| question       = Later in 2026, a new occupational illness linked to a chemical exposure at a major Lyon employer sharply increases projected long-term disability claims. The actuaries raise expected future claims by €2.6 million. The CSM for the group currently stands at €2.2 million (after the earlier adjustments). What happens?&lt;br /&gt;
| option_a       = The CSM decreases to zero, and the remaining €400,000 is recognised as a loss in profit or loss.&lt;br /&gt;
| option_b       = The CSM decreases to negative €400,000, to be recovered later.&lt;br /&gt;
| option_c       = The entire €2.6 million is recognised as insurance service expense immediately.&lt;br /&gt;
| option_d       = The CSM absorbs the full €2.6 million because the change relates to future service.&lt;br /&gt;
| correct_answer = a&lt;br /&gt;
| explanation    = The CSM absorbs unfavourable changes relating to future service, but it cannot go below zero. The CSM absorbs €2.2 million, and the remaining €400,000 that would push it negative is recognised immediately as a loss. The group becomes onerous at that point. Option (d) is wrong because the CSM has insufficient capacity to absorb the full amount.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L&lt;br /&gt;
| question       = Separately, 45 members of the Lyon group are already receiving disability payments when, in late 2026, updated medical assessments raise the estimated cost of their ongoing benefits by €200,000. Where does this €200,000 adjustment land?&lt;br /&gt;
| option_a       = It adjusts the CSM because it changes the insurer&#039;s fulfilment cash flows.&lt;br /&gt;
| option_b       = It is deferred until the benefit payments are actually made.&lt;br /&gt;
| option_c       = It goes directly to insurance service expenses in the income statement as a cost relating to past or current service.&lt;br /&gt;
| option_d       = It reduces insurance revenue in the current period.&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = The disabilities have already occurred, meaning the service (being on risk when the disabilities were incurred) has been provided. Re-estimates of incurred claims relate to past service and bypass the CSM, flowing directly to insurance service expenses. Only changes relating to future service can adjust the CSM.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Claims incurred, settled, and derecognition&lt;br /&gt;
| question       = At the December 2026 reporting date, AXA&#039;s claims team knows from historical patterns that roughly 20 additional members of the Lyon group are likely disabled but have not yet filed claims. Should these unreported disabilities be reflected in the financial statements?&lt;br /&gt;
| option_a       = No, because the insurer cannot recognise what has not been reported.&lt;br /&gt;
| option_b       = Yes, the insurer must estimate incurred but not yet reported (IBNR) claims using actuarial methods and include them in the liability.&lt;br /&gt;
| option_c       = Only if the members file before the financial statements are published.&lt;br /&gt;
| option_d       = They are included only if the insurer has received informal notice of the disability.&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = Under IFRS 17, the liability must reflect all claims that have been incurred, regardless of whether they have been reported. The insurer uses actuarial techniques to estimate IBNR claims each reporting period. Waiting for formal notification (options a, c, and d) would understate the liability and mislead users of the financial statements.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Claims incurred, settled, and derecognition&lt;br /&gt;
| question       = In early 2027, one member of the Lyon group who had been receiving disability benefits returns to work earlier than expected. The remaining benefit reserve for this member was €15,000, but only €13,500 was ultimately paid. How is the €1,500 difference treated?&lt;br /&gt;
| option_a       = It adjusts the CSM because it changes fulfilment cash flows.&lt;br /&gt;
| option_b       = It is recognised as insurance finance income.&lt;br /&gt;
| option_c       = It is recognised as a favourable adjustment to insurance service expenses in the current period, since it relates to past service.&lt;br /&gt;
| option_d       = It is carried forward and netted against future unfavourable claim settlements.&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = The claim relates to a disability that already occurred (past service), so the difference between the estimate and the actual payments goes directly to insurance service expenses as a favourable variance. The CSM is not involved because there is no future service to adjust. Netting against future settlements (option d) is not permitted under IFRS 17.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Claims incurred, settled, and derecognition&lt;br /&gt;
| question       = By 2036, all contracts in the Lyon disability group have expired and all benefit payments have been completed. A small residual balance of €18,000 remains in the fulfilment cash flows due to a final estimation adjustment. What should the insurer do?&lt;br /&gt;
| option_a       = Keep the contract group on the balance sheet until the next reporting cycle in case late claims emerge.&lt;br /&gt;
| option_b       = Transfer the residual balance to the CSM of a new contract group.&lt;br /&gt;
| option_c       = Derecognise the contract group, releasing the remaining balance to the income statement.&lt;br /&gt;
| option_d       = Reclassify the residual balance as a provision under IAS 37.&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = Derecognition removes the contract group from the balance sheet when the obligation is extinguished. Any remaining balance at that point is released to the income statement. Keeping expired contracts on the balance sheet (option a) or transferring balances to unrelated groups (option b) would misrepresent the insurer&#039;s position. IAS 37 (option d) does not apply to contracts within the scope of IFRS 17.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Quiz/end}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23013</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23013"/>
		<updated>2026-04-06T17:22:53Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   - &amp;quot;impact-sort&amp;quot;       Binary classification: CSM vs P&amp;amp;L scenario sorter&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks,&lt;br /&gt;
    &#039;impact-sort&#039;:          initImpactSort&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
     Binary classification exercise: does the scenario adjust the CSM&lt;br /&gt;
     or hit P&amp;amp;L directly?  Six shuffled cards, score tracking, and a&lt;br /&gt;
     final results screen.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initImpactSort( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Scenario data ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var SCENARIOS = [&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a new longevity study shows policyholders are living &amp;lt;strong&amp;gt;2\u00A0years longer&amp;lt;/strong&amp;gt; than assumed \u2014 expected death claims over the remaining coverage period fall by \u20AC12M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;This change relates to mortality expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period \u2014 service the insurer has &amp;lt;strong&amp;gt;not yet delivered&amp;lt;/strong&amp;gt;. Because it concerns future service, the \u20AC12M favourable change increases the CSM, and will be released as profit gradually as coverage continues.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? No \u2014 these are death claims expected &amp;lt;em&amp;gt;in the future&amp;lt;/em&amp;gt;, over the remaining life of the policies. Because it concerns future service, the \u20AC12M favourable change increases the CSM rather than appearing in P&amp;amp;L immediately.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCB0&#039;,&lt;br /&gt;
        text: &#039;AXA Belgium unit-linked savings contracts: revised data shows policyholder lapse rates will &amp;lt;strong&amp;gt;rise by 15%&amp;lt;/strong&amp;gt; over the remaining contract term, reducing expected future fee income by \u20AC8M.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;Unfavourable changes about future service are absorbed by the CSM, just like favourable ones. The CSM decreases by \u20AC8M because fewer policyholders will stay to generate fees. The CSM acts as a buffer in both directions \u2014 as long as it stays at or above zero.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;The change relates to lapses that have &amp;lt;em&amp;gt;not yet happened&amp;lt;/em&amp;gt; \u2014 it\u2019s about future service. The fees lost are fees the insurer has not yet earned. Unfavourable changes about the future are absorbed by the CSM (decreasing it by \u20AC8M). The key: the service hasn\u2019t been provided yet.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83C\uDFE5&#039;,&lt;br /&gt;
        text: &#039;AXA Germany group disability portfolio: a large employer reports a &amp;lt;strong&amp;gt;cluster of 40 new disability claims&amp;lt;/strong&amp;gt; during the current reporting quarter, all arising from a factory closure this year.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The insurer was providing disability coverage when these claims were incurred \u2014 the service has &amp;lt;strong&amp;gt;already been delivered&amp;lt;/strong&amp;gt; for this period. Since this relates to current service, the full amount goes straight to insurance service expenses in the income statement. The CSM cannot absorb it.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? Yes \u2014 the disabilities occurred during the current quarter while the insurer was on risk. This is current-period service, so the cost goes straight to insurance service expenses. The CSM only absorbs changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDCC5&#039;,&lt;br /&gt;
        text: &#039;AXA Switzerland individual annuity book: a &amp;lt;strong&amp;gt;prior-year reserve for an annuitant who died in 2023&amp;lt;/strong&amp;gt; is re-estimated upward because final medical and estate costs were higher than provisioned.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;This relates to &amp;lt;strong&amp;gt;past service&amp;lt;/strong&amp;gt; \u2014 the annuitant died in a prior period and the claim event is long settled. Any re-estimate of an already-incurred claim bypasses the CSM entirely and flows directly into insurance service expenses. The CSM only represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The annuitant died in 2023 \u2014 the service has long since been provided. Re-estimates of already-incurred claims relate to past service and go straight to the income statement. Remember: the CSM represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;, not service already delivered.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83E\uDE7A&#039;,&lt;br /&gt;
        text: &#039;AXA Japan critical illness portfolio: following a screening campaign, the insurer estimates &amp;lt;strong&amp;gt;200 cancer diagnoses occurred during H1&amp;lt;/strong&amp;gt; but won\u2019t be reported until H2. The full IBNR provision is booked.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The diagnoses are &amp;lt;strong&amp;gt;incurred&amp;lt;/strong&amp;gt; in H1, even if not yet reported. Once incurred, the liability relates to current service \u2014 the insurer was providing critical illness cover when the diseases arose. Any estimates of these claims go straight to the income statement. IBNR doesn\u2019t change this: incurred means the service has been provided.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The cancers were diagnosed during H1 \u2014 the insurer was on risk when they occurred. Even though the claims are IBNR (incurred but not yet reported), they are still &amp;lt;em&amp;gt;incurred&amp;lt;/em&amp;gt;, meaning the service has been provided. All incurred claim estimates bypass the CSM and go to P&amp;amp;L.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDC94&#039;,&lt;br /&gt;
        text: &#039;AXA France whole-of-life portfolio: a pandemic scenario causes expected mortality claims to &amp;lt;strong&amp;gt;rise so sharply that the CSM would go below zero&amp;lt;/strong&amp;gt;. The change relates entirely to future service.&#039;,&lt;br /&gt;
        answer: &#039;both&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 but there\u2019s a twist.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 It\u2019s actually a trick question \u2014 both answers are partially right.&#039;,&lt;br /&gt;
        bothBody: &#039;This change relates to future service, so it &amp;lt;em&amp;gt;starts&amp;lt;/em&amp;gt; by adjusting the CSM. But the CSM cannot go negative. The portion that brings the CSM to zero is absorbed normally; the &amp;lt;strong&amp;gt;excess&amp;lt;/strong&amp;gt; spills over into P&amp;amp;L as an immediate loss. The group becomes onerous and a loss component is established. This is the one scenario where the answer is \u201Cboth\u201D \u2014 CSM first, then P&amp;amp;L for the overflow.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
    var current    = 0;&lt;br /&gt;
    var correct    = 0;&lt;br /&gt;
    var wrong      = 0;&lt;br /&gt;
    var answered   = false;&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Where Does the Impact Land?&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Decision rule */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-rule&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;The key question:&amp;lt;/strong&amp;gt; \u201CHas the service already been provided?\u201D If yes \u2192 P&amp;amp;L. If no \u2192 CSM.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress bar */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge&#039;, style: { border: &#039;none&#039;, padding: &#039;0&#039;, background: &#039;none&#039;, color: &#039;&#039; } } );&lt;br /&gt;
    var progBar  = wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( progBar );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeCorrect = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeWrong   = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeCorrect, badgeWrong ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Card stage */&lt;br /&gt;
    var cardStage = wix.el( &#039;div&#039; );&lt;br /&gt;
    wrapper.appendChild( cardStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnCsm = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--csm&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDD04&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Adjusts the CSM&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Future service \u2014 profit recognised later&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var btnPl = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--pl&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDCC9&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Hits P&amp;amp;L directly&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Current or past service \u2014 recognised now&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-choices&#039; }, [ btnCsm, btnPl ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next scenario \u25B8&#039;, style: { marginTop: &#039;0.6rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Render helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeCorrect.textContent = &#039;\u2713 &#039; + correct + &#039; correct&#039;;&lt;br /&gt;
      badgeWrong.textContent   = &#039;\u2717 &#039; + wrong + &#039; wrong&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderCard() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( current &amp;gt;= order.length ) {&lt;br /&gt;
        showFinal();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      var card = wix.el( &#039;div&#039;, { className: &#039;wix-is-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-num&#039;, textContent: &#039;Scenario &#039; + ( current + 1 ) + &#039; of &#039; + order.length } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-is-card-icon&#039;, textContent: s.icon } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-text&#039;, innerHTML: s.text } )&lt;br /&gt;
      ] );&lt;br /&gt;
      cardStage.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( current / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = current + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = false;&lt;br /&gt;
      btnPl.disabled  = false;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
      var isCorrect = s.answer === &#039;both&#039; ? true : chosen === s.answer;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) correct++; else wrong++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Card border */&lt;br /&gt;
      var card = cardStage.firstChild;&lt;br /&gt;
      card.className = &#039;wix-is-card &#039; + ( isCorrect ? &#039;wix-is-card--correct&#039; : &#039;wix-is-card--wrong&#039; );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( s.answer === &#039;both&#039; ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = chosen === &#039;csm&#039; ? s.correctHead : s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML   = s.bothBody;&lt;br /&gt;
      } else if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent   = s.correctHead;&lt;br /&gt;
        fbBody.innerHTML     = s.correctBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent   = s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML     = s.wrongBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = true;&lt;br /&gt;
      btnPl.disabled  = true;&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = current &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next scenario \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( correct / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect score!&#039; : pct &amp;gt;= 67 ? &#039;Well done!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You got &amp;lt;strong&amp;gt;&#039; + correct + &#039; out of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; correct (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        ( pct === 100&lt;br /&gt;
          ? &#039;You\u2019ve nailed the future vs.\u00A0current/past service distinction \u2014 the key question IFRS\u00A017 asks at every re-estimate.&#039;&lt;br /&gt;
          : &#039;Remember the key question: &amp;lt;strong&amp;gt;\u201CHas the service already been provided?\u201D&amp;lt;/strong&amp;gt; If yes, the change bypasses the CSM and goes straight to P&amp;amp;L. If no, it adjusts the CSM.&#039; );&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order   = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
      current = 0;&lt;br /&gt;
      correct = 0;&lt;br /&gt;
      wrong   = 0;&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
      renderCard();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnCsm.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;csm&#039; ); } );&lt;br /&gt;
    btnPl.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;pl&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { current++; renderCard(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderCard();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_subsequent_measurement&amp;diff=23012</id>
		<title>Internal:Training/IFRS17/The general model: subsequent measurement</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_subsequent_measurement&amp;diff=23012"/>
		<updated>2026-04-06T17:17:02Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:General model|general model]] measures an [[Definition:Insurance contract|insurance contract]] at [[Definition:Initial recognition|initial recognition]], setting up the four [[Definition:Building blocks|building blocks]] on day one. Now we turn to what happens next: how those building blocks evolve over time as the insurer delivers [[Definition:Coverage|coverage]], updates its assumptions, and settles [[Definition:Claims|claims]].&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* How the passage of time mechanically changes the [[Definition:Insurance contract liability|liability]] through [[Definition:Discount unwinding|unwinding the discount]], releasing the [[Definition:Risk adjustment|risk adjustment]], and releasing the [[Definition:Contractual service margin|contractual service margin]].&lt;br /&gt;
* How changes in [[Definition:Actuarial estimates|estimates]] about the future are treated differently depending on whether they relate to future, current, or past service.&lt;br /&gt;
* How [[Definition:Claims|claims]] move through the stages of incurred, settled, and [[Definition:Derecognition|derecognised]], and what each stage means for the [[Definition:Financial statements|financial statements]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Passage of time: unwinding discount, releasing RA, releasing CSM ==&lt;br /&gt;
&lt;br /&gt;
⏳ &#039;&#039;&#039;Time never stands still.&#039;&#039;&#039; Once an [[Definition:Insurance contract|insurance contract]] is on the books, the [[Definition:Insurance contract liability|liability]] does not simply sit unchanged until a [[Definition:Claim|claim]] arrives. Even if nothing unexpected happens, the mere passage of time triggers three automatic adjustments. These adjustments reflect that the insurer is steadily fulfilling its promise to the [[Definition:Policyholder|policyholder]], one day at a time. Understanding these three movements is the foundation of [[Definition:Subsequent measurement|subsequent measurement]] under the [[Definition:General model|general model]].&lt;br /&gt;
&lt;br /&gt;
📈 &#039;&#039;&#039;Unwinding the discount.&#039;&#039;&#039; When you first measured the liability, you [[Definition:Discounting|discounted]] future [[Definition:Cash flows|cash flows]] back to their [[Definition:Present value|present value]]. As time passes and those cash flows draw closer, the [[Definition:Present value|present value]] increases, even if the expected amounts stay the same. This increase is called [[Definition:Discount unwinding|unwinding the discount]], sometimes described as the &amp;quot;accretion of interest.&amp;quot; Suppose AXA measured a group of [[Definition:Property insurance|property insurance]] contracts in Belgium at initial recognition with [[Definition:Fulfilment cash flows|fulfilment cash flows]] of €8 million, discounted at 2%. One year later, even with no change in expectations, the liability grows by roughly €160,000 (€8 million × 2%) simply because those future payments are now one year closer. This accretion is recognised as [[Definition:Insurance finance expense|insurance finance expense]], not as a cost of delivering service.&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;Releasing the risk adjustment.&#039;&#039;&#039; At [[Definition:Initial recognition|initial recognition]], the [[Definition:Risk adjustment|risk adjustment]] reflected the full uncertainty the insurer faced over the entire [[Definition:Coverage period|coverage period]]. As each period passes without the worst scenarios materialising, a slice of that uncertainty has been borne and is gone. The insurer releases a portion of the [[Definition:Risk adjustment|risk adjustment]] to reflect the reduction in remaining risk. That released amount flows into [[Definition:Insurance revenue|insurance revenue]], because bearing risk is part of the service the insurer provides. Think of it like a security deposit on a rental flat in Lyon: each month you live there without damaging anything, a portion of the deposit is effectively &amp;quot;earned&amp;quot; by the landlord. When the lease ends, any deposit still held is returned or recognised.&lt;br /&gt;
&lt;br /&gt;
🎁 &#039;&#039;&#039;Releasing the CSM.&#039;&#039;&#039; The [[Definition:Contractual service margin|contractual service margin]] is the unearned [[Definition:Profit|profit]] locked away on day one. As the insurer delivers [[Definition:Coverage|coverage]], it releases a portion of the [[Definition:Contractual service margin|CSM]] into [[Definition:Insurance revenue|insurance revenue]]. The pattern of release is determined by [[Definition:Coverage units|coverage units]], which measure how much service is provided in each period relative to the total expected service remaining. If a five-year [[Definition:Life insurance|life insurance]] group provides equal coverage each year, roughly one-fifth of the [[Definition:Contractual service margin|CSM]] is released each year. The key principle is that [[Definition:Profit|profit]] appears in the [[Definition:Income statement|income statement]] only as service is delivered, never all at once.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Many learners assume that the [[Definition:Discount unwinding|unwinding of the discount]] is part of [[Definition:Insurance revenue|insurance revenue]]. It is not. Unwinding is a [[Definition:Insurance finance expense|financing effect]], not a [[Definition:Insurance service result|service result]]. It appears separately in [[Definition:Insurance finance income or expense|insurance finance income or expense]], keeping the service picture clean.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; So far we have assumed that nothing changes except the calendar date. But what happens when the insurer&#039;s expectations about future [[Definition:Cash flows|cash flows]] turn out to be wrong, and estimates need updating?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L ==&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;Assumptions are living things.&#039;&#039;&#039; Insurance is built on [[Definition:Actuarial estimates|estimates]]: how many [[Definition:Claims|claims]] will occur, how large they will be, when they will be paid. These estimates are updated every [[Definition:Reporting period|reporting period]] using the latest information. When the updated numbers differ from the previous ones, the insurer must decide where the impact lands. IFRS 17 draws a sharp line based on the period of service the change relates to. This distinction is one of the most important concepts in the entire standard.&lt;br /&gt;
&lt;br /&gt;
📅 &#039;&#039;&#039;Future service adjusts the CSM.&#039;&#039;&#039; If a change in [[Definition:Actuarial estimates|estimates]] relates to service the insurer has not yet delivered, the impact is absorbed by the [[Definition:Contractual service margin|CSM]]. For example, imagine AXA insures a group of [[Definition:Motor insurance|motor insurance]] contracts in Germany and originally expected total [[Definition:Claims|claims]] of €5 million over the remaining [[Definition:Coverage period|coverage period]]. New data from the first winter suggests that claims will actually total €4.5 million, a favourable change of €500,000. Rather than recognising an immediate [[Definition:Profit|profit]], the insurer increases the [[Definition:Contractual service margin|CSM]] by €500,000, which will then be released gradually as coverage continues. The logic is elegant: if the change affects future service, it should affect future [[Definition:Profit|profit]], not today&#039;s.&lt;br /&gt;
&lt;br /&gt;
📉 &#039;&#039;&#039;Unfavourable changes work the same way, up to a point.&#039;&#039;&#039; If the same group&#039;s expected [[Definition:Claims|claims]] had risen by €500,000 instead, the [[Definition:Contractual service margin|CSM]] would decrease by that amount. The [[Definition:Contractual service margin|CSM]] acts as a buffer, absorbing bad news about the future just as it absorbs good news. However, the [[Definition:Contractual service margin|CSM]] cannot go below zero. If the unfavourable change is so large that it would push the [[Definition:Contractual service margin|CSM]] into negative territory, the excess is recognised immediately as a [[Definition:Loss|loss]] in [[Definition:Profit and loss|profit or loss]]. At that point, the group becomes [[Definition:Onerous contracts|onerous]], and a [[Definition:Loss component|loss component]] is established to track the shortfall.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent error is thinking that all changes in [[Definition:Actuarial estimates|estimates]] adjust the [[Definition:Contractual service margin|CSM]]. They do not. Only changes relating to future service go through the [[Definition:Contractual service margin|CSM]]. Changes relating to current or past service, such as a re-estimate of a [[Definition:Claim|claim]] that has already been incurred, go directly to the [[Definition:Income statement|income statement]]. The question to ask is always: &amp;quot;Has the service already been provided?&amp;quot; If yes, the [[Definition:Contractual service margin|CSM]] cannot absorb it, because the [[Definition:Contractual service margin|CSM]] represents profit on service still to come.&lt;br /&gt;
&lt;br /&gt;
⚖️ &#039;&#039;&#039;Current and past service hit P&amp;amp;L directly.&#039;&#039;&#039; Suppose a severe hailstorm strikes a region in Spain during the current reporting period, and the insurer needs to increase its [[Definition:Best estimate|best estimate]] of [[Definition:Claims|claims]] for damage that has already occurred. This change relates to service already provided (the insurer was on risk when the storm happened), so the full amount goes straight to [[Definition:Insurance service expenses|insurance service expenses]] in the [[Definition:Income statement|income statement]]. Similarly, if a [[Definition:Claim|claim]] from a prior year is re-estimated upward because repair costs were higher than initially thought, that adjustment also bypasses the [[Definition:Contractual service margin|CSM]] and flows directly into the [[Definition:Income statement|income statement]] as a cost of past service.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; We have now seen how estimates change and where the impact lands. But what actually happens when a [[Definition:Claim|claim]] event occurs and the insurer begins the process of paying out? How does the liability move through its final stages?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;impact-sort&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Claims incurred, settled, and derecognition ==&lt;br /&gt;
&lt;br /&gt;
🌧️ &#039;&#039;&#039;From coverage to claim.&#039;&#039;&#039; The entire purpose of an [[Definition:Insurance contract|insurance contract]] is to pay [[Definition:Claims|claims]] when covered events occur. When a [[Definition:Claim|claim]] is incurred, the nature of the [[Definition:Insurance contract liability|liability]] changes. It is no longer about providing future [[Definition:Coverage|coverage]]; it is about settling a specific obligation. Under IFRS 17, this shift matters because the liability now relates to past service, and any further adjustments affect the [[Definition:Income statement|income statement]] directly rather than the [[Definition:Contractual service margin|CSM]].&lt;br /&gt;
&lt;br /&gt;
📝 &#039;&#039;&#039;Incurrence and estimation.&#039;&#039;&#039; A [[Definition:Claim|claim]] is incurred when the insured event happens, regardless of whether the [[Definition:Policyholder|policyholder]] has reported it yet. If a January storm damages 200 roofs in Brittany, those [[Definition:Claims|claims]] are incurred in January even if some homeowners do not file until March. At the point of incurrence, the insurer estimates the expected [[Definition:Claim cost|claim cost]] and reflects it in the [[Definition:Fulfilment cash flows|fulfilment cash flows]]. This estimate includes the cost of [[Definition:Claims handling|claims handling]] and considers the timing of future payments, which continues to be [[Definition:Discounting|discounted]]. The [[Definition:Liability for incurred claims|liability for incurred claims]] is measured using the same building-block approach, but the [[Definition:Contractual service margin|CSM]] is no longer involved because the service (being on risk during the storm) has already been delivered.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners believe that a [[Definition:Claim|claim]] is only recognised when the [[Definition:Policyholder|policyholder]] reports it. Under IFRS 17, the [[Definition:Insurance contract liability|liability]] must reflect all [[Definition:Claims|claims]] that have been incurred, including those [[Definition:IBNR|incurred but not yet reported (IBNR)]]. The insurer uses [[Definition:Actuarial methods|actuarial methods]] to estimate these unreported claims every [[Definition:Reporting period|reporting period]], ensuring the [[Definition:Financial statements|financial statements]] present a complete picture.&lt;br /&gt;
&lt;br /&gt;
💶 &#039;&#039;&#039;Settlement and cash outflow.&#039;&#039;&#039; When the insurer pays a [[Definition:Claim|claim]], cash leaves the business. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] decrease by the amount paid, and the [[Definition:Insurance contract liability|liability]] falls accordingly. If a homeowner&#039;s roof repair in Brittany costs €12,000 and AXA pays the contractor directly, the [[Definition:Insurance contract liability|liability]] drops by €12,000 and cash on the [[Definition:Balance sheet|balance sheet]] decreases by the same amount. Settlement is straightforward in accounting terms: it is simply the discharge of an obligation that was already measured and waiting to be paid. If the actual payment differs from the previous estimate, the difference is an adjustment to [[Definition:Insurance service expenses|insurance service expenses]] in the current period, because it relates to past service.&lt;br /&gt;
&lt;br /&gt;
🚪 &#039;&#039;&#039;Derecognition: closing the book.&#039;&#039;&#039; [[Definition:Derecognition|Derecognition]] means removing the [[Definition:Insurance contract|insurance contract]] from the [[Definition:Balance sheet|balance sheet]] entirely. This happens when the obligation is extinguished, typically because all [[Definition:Claims|claims]] have been settled and the [[Definition:Coverage period|coverage period]] has ended. It can also occur if the contract is cancelled or transferred. Once derecognised, the contract no longer contributes to the [[Definition:Insurance contract liability|liability]], the [[Definition:Contractual service margin|CSM]], or the [[Definition:Risk adjustment|risk adjustment]]. Any remaining balances at the point of [[Definition:Derecognition|derecognition]] are released to the [[Definition:Income statement|income statement]]. The lifecycle is complete: the contract was recognised, measured, fulfilled, and finally removed.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* The passage of time triggers three automatic movements: the [[Definition:Discount unwinding|discount unwinds]] (a financing effect), the [[Definition:Risk adjustment|risk adjustment]] releases (reflecting reduced uncertainty), and the [[Definition:Contractual service margin|CSM]] releases (recognising earned [[Definition:Profit|profit]]).&lt;br /&gt;
* Changes in [[Definition:Actuarial estimates|estimates]] about future service adjust the [[Definition:Contractual service margin|CSM]], preserving the link between profit and service delivery, while changes relating to current or past service go directly to the [[Definition:Income statement|income statement]].&lt;br /&gt;
* [[Definition:Claims|Claims]] progress from incurrence (including [[Definition:IBNR|IBNR]]) through settlement to [[Definition:Derecognition|derecognition]], and once incurred, any re-estimates bypass the [[Definition:Contractual service margin|CSM]] and hit [[Definition:Profit and loss|profit or loss]] immediately.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The general model: subsequent measurement/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23011</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23011"/>
		<updated>2026-04-06T17:15:53Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   - &amp;quot;impact-sort&amp;quot;       Binary classification: CSM vs P&amp;amp;L scenario sorter&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks,&lt;br /&gt;
    &#039;impact-sort&#039;:          initImpactSort&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
     Binary classification exercise: does the scenario adjust the CSM&lt;br /&gt;
     or hit P&amp;amp;L directly?  Six shuffled cards, score tracking, and a&lt;br /&gt;
     final results screen.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initImpactSort( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Scenario data ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var SCENARIOS = [&lt;br /&gt;
      { icon: &#039;\uD83D\uDE97&#039;,&lt;br /&gt;
        text: &#039;AXA Germany motor insurance: new winter data suggests total claims over the remaining coverage period will be &amp;lt;strong&amp;gt;\u20AC4.5M instead of \u20AC5M&amp;lt;/strong&amp;gt; \u2014 a favourable change of \u20AC500,000.&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;This change relates to claims expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period \u2014 service the insurer has &amp;lt;strong&amp;gt;not yet delivered&amp;lt;/strong&amp;gt;. Because it concerns future service, the \u20AC500,000 favourable change increases the CSM, and will be released as profit gradually as coverage continues.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? No \u2014 this change relates to claims expected over the &amp;lt;em&amp;gt;remaining&amp;lt;/em&amp;gt; coverage period. Because it concerns future service, the \u20AC500,000 favourable change increases the CSM rather than appearing in P&amp;amp;L immediately.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDE97&#039;,&lt;br /&gt;
        text: &#039;AXA Germany motor insurance: revised data shows expected claims will &amp;lt;strong&amp;gt;rise by \u20AC500,000&amp;lt;/strong&amp;gt; over the remaining coverage period (future claims, not yet incurred).&#039;,&lt;br /&gt;
        answer: &#039;csm&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 adjusts the CSM.&#039;,&lt;br /&gt;
        correctBody: &#039;Unfavourable changes about future service are absorbed by the CSM, just like favourable ones. The CSM decreases by \u20AC500,000. The CSM acts as a buffer in both directions \u2014 as long as it stays at or above zero.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one adjusts the CSM.&#039;,&lt;br /&gt;
        wrongBody: &#039;The change relates to claims that have &amp;lt;em&amp;gt;not yet been incurred&amp;lt;/em&amp;gt; \u2014 it\u2019s about future service. Unfavourable changes about the future are absorbed by the CSM (decreasing it by \u20AC500,000), just as favourable ones increase it. The key: the service hasn\u2019t been provided yet.&#039; },&lt;br /&gt;
      { icon: &#039;\u26C8\uFE0F&#039;,&lt;br /&gt;
        text: &#039;A severe hailstorm strikes Spain &amp;lt;strong&amp;gt;during the current reporting period&amp;lt;/strong&amp;gt;. The insurer must increase its estimate of claims for damage that has already occurred.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The insurer was on risk when the storm happened \u2014 the service (providing coverage during that period) has &amp;lt;strong&amp;gt;already been delivered&amp;lt;/strong&amp;gt;. Since this relates to current service, the full amount goes straight to insurance service expenses in the income statement. The CSM cannot absorb it.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;Ask the key question: has the service already been provided? Yes \u2014 the insurer was on risk when the storm struck. This is current-period service, so the increase goes straight to insurance service expenses. The CSM only absorbs changes about &amp;lt;em&amp;gt;future&amp;lt;/em&amp;gt; service.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDD27&#039;,&lt;br /&gt;
        text: &#039;A claim from a &amp;lt;strong&amp;gt;prior year&amp;lt;/strong&amp;gt; is re-estimated upward because repair costs turned out to be higher than initially thought.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;This relates to &amp;lt;strong&amp;gt;past service&amp;lt;/strong&amp;gt; \u2014 the claim event already happened in a prior period. Any re-estimate of an already-incurred claim bypasses the CSM entirely and flows directly into insurance service expenses. The CSM only represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The claim was incurred in a prior year \u2014 the service has long since been provided. Re-estimates of already-incurred claims relate to past service and go straight to the income statement. Remember: the CSM represents profit on service &amp;lt;em&amp;gt;still to come&amp;lt;/em&amp;gt;, not service already delivered.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83C\uDF0A&#039;,&lt;br /&gt;
        text: &#039;Brittany, France: a January storm damages 200 roofs. Some homeowners don\u2019t report until March, but the insurer estimates the &amp;lt;strong&amp;gt;full cost of incurred claims including IBNR&amp;lt;/strong&amp;gt;.&#039;,&lt;br /&gt;
        answer: &#039;pl&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        correctBody: &#039;The claims are &amp;lt;strong&amp;gt;incurred&amp;lt;/strong&amp;gt; in January, even if not yet reported. Once incurred, the liability relates to past service \u2014 the insurer was on risk during the storm. Any estimates or re-estimates of these claims go straight to the income statement. IBNR doesn\u2019t change this: incurred means the service has been provided.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 Not quite \u2014 this one hits P&amp;amp;L directly.&#039;,&lt;br /&gt;
        wrongBody: &#039;The storm already happened \u2014 those 200 roofs were damaged while the insurer was on risk. Even though some claims are IBNR (incurred but not yet reported), they are still &amp;lt;em&amp;gt;incurred&amp;lt;/em&amp;gt;, meaning the service has been provided. All incurred claim estimates bypass the CSM and go to P&amp;amp;L.&#039; },&lt;br /&gt;
      { icon: &#039;\uD83D\uDE97&#039;,&lt;br /&gt;
        text: &#039;AXA Germany motor insurance: expected claims rise so dramatically that the &amp;lt;strong&amp;gt;CSM would go below zero&amp;lt;/strong&amp;gt;. The change relates entirely to future service.&#039;,&lt;br /&gt;
        answer: &#039;both&#039;,&lt;br /&gt;
        correctHead: &#039;\u2705 Correct \u2014 but there\u2019s a twist.&#039;,&lt;br /&gt;
        wrongHead: &#039;\u2717 It\u2019s actually a trick question \u2014 both answers are partially right.&#039;,&lt;br /&gt;
        bothBody: &#039;This change relates to future service, so it &amp;lt;em&amp;gt;starts&amp;lt;/em&amp;gt; by adjusting the CSM. But the CSM cannot go negative. The portion that brings the CSM to zero is absorbed normally; the &amp;lt;strong&amp;gt;excess&amp;lt;/strong&amp;gt; spills over into P&amp;amp;L as an immediate loss. The group becomes onerous and a loss component is established. This is the one scenario where the answer is \u201Cboth\u201D \u2014 CSM first, then P&amp;amp;L for the overflow.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var order = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
    var current    = 0;&lt;br /&gt;
    var correct    = 0;&lt;br /&gt;
    var wrong      = 0;&lt;br /&gt;
    var answered   = false;&lt;br /&gt;
&lt;br /&gt;
    function makeRange( n ) { var a = []; for ( var i = 0; i &amp;lt; n; i++ ) a.push( i ); return a; }&lt;br /&gt;
&lt;br /&gt;
    function shuffle( arr ) {&lt;br /&gt;
      for ( var i = arr.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
        var j = Math.floor( Math.random() * ( i + 1 ) );&lt;br /&gt;
        var t = arr[i]; arr[i] = arr[j]; arr[j] = t;&lt;br /&gt;
      }&lt;br /&gt;
      return arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Where Does the Impact Land?&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Decision rule */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-rule&#039;, innerHTML: &#039;&amp;lt;strong&amp;gt;The key question:&amp;lt;/strong&amp;gt; \u201CHas the service already been provided?\u201D If yes \u2192 P&amp;amp;L. If no \u2192 CSM.&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Progress bar */&lt;br /&gt;
    var progFill = wix.el( &#039;div&#039;, { className: &#039;wix-progress-fill&#039;, style: { width: &#039;0%&#039; } } );&lt;br /&gt;
    var progText = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge&#039;, style: { border: &#039;none&#039;, padding: &#039;0&#039;, background: &#039;none&#039;, color: &#039;&#039; } } );&lt;br /&gt;
    var progBar  = wix.el( &#039;div&#039;, { className: &#039;wix-progress-wrap&#039;, style: { marginBottom: &#039;1rem&#039; } }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-progress-track&#039; }, [ progFill ] ),&lt;br /&gt;
      progText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( progBar );&lt;br /&gt;
&lt;br /&gt;
    /* Score badges */&lt;br /&gt;
    var badgeCorrect = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--correct&#039; } );&lt;br /&gt;
    var badgeWrong   = wix.el( &#039;span&#039;, { className: &#039;wix-is-badge wix-is-badge--wrong&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-is-score-row&#039; }, [ badgeCorrect, badgeWrong ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Card stage */&lt;br /&gt;
    var cardStage = wix.el( &#039;div&#039; );&lt;br /&gt;
    wrapper.appendChild( cardStage );&lt;br /&gt;
&lt;br /&gt;
    /* Choice buttons */&lt;br /&gt;
    var btnCsm = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--csm&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDD04&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Adjusts the CSM&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Future service \u2014 profit recognised later&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var btnPl = wix.el( &#039;button&#039;, { className: &#039;wix-is-choice wix-is-choice--pl&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-icon&#039;, textContent: &#039;\uD83D\uDCC9&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-title&#039;, textContent: &#039;Hits P&amp;amp;L directly&#039; } ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-is-choice-sub&#039;, textContent: &#039;Current or past service \u2014 recognised now&#039; } )&lt;br /&gt;
    ] );&lt;br /&gt;
    var choicesEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-choices&#039; }, [ btnCsm, btnPl ] );&lt;br /&gt;
    wrapper.appendChild( choicesEl );&lt;br /&gt;
&lt;br /&gt;
    /* Feedback */&lt;br /&gt;
    var fbHead = wix.el( &#039;div&#039;, { className: &#039;wix-is-fb-head&#039; } );&lt;br /&gt;
    var fbBody = wix.el( &#039;div&#039; );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Next scenario \u25B8&#039;, style: { marginTop: &#039;0.6rem&#039; } } );&lt;br /&gt;
    var feedbackEl = wix.el( &#039;div&#039;, { className: &#039;wix-is-feedback wix-hidden&#039; }, [ fbHead, fbBody, btnNext ] );&lt;br /&gt;
    wrapper.appendChild( feedbackEl );&lt;br /&gt;
&lt;br /&gt;
    /* Final screen */&lt;br /&gt;
    var finalIcon  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-icon&#039; } );&lt;br /&gt;
    var finalTitle = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-title&#039; } );&lt;br /&gt;
    var finalBody  = wix.el( &#039;div&#039;, { className: &#039;wix-is-final-body&#039; } );&lt;br /&gt;
    var btnRestart = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Try again&#039; } );&lt;br /&gt;
    var finalEl    = wix.el( &#039;div&#039;, { className: &#039;wix-is-final wix-hidden&#039; }, [ finalIcon, finalTitle, finalBody, btnRestart ] );&lt;br /&gt;
    wrapper.appendChild( finalEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Render helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateScores() {&lt;br /&gt;
      badgeCorrect.textContent = &#039;\u2713 &#039; + correct + &#039; correct&#039;;&lt;br /&gt;
      badgeWrong.textContent   = &#039;\u2717 &#039; + wrong + &#039; wrong&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderCard() {&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      answered = false;&lt;br /&gt;
&lt;br /&gt;
      if ( current &amp;gt;= order.length ) {&lt;br /&gt;
        showFinal();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      var card = wix.el( &#039;div&#039;, { className: &#039;wix-is-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-num&#039;, textContent: &#039;Scenario &#039; + ( current + 1 ) + &#039; of &#039; + order.length } ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-is-card-icon&#039;, textContent: s.icon } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-is-card-text&#039;, innerHTML: s.text } )&lt;br /&gt;
      ] );&lt;br /&gt;
      cardStage.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
      progFill.style.width = ( current / order.length * 100 ) + &#039;%&#039;;&lt;br /&gt;
      progText.textContent = current + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = false;&lt;br /&gt;
      btnPl.disabled  = false;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
&lt;br /&gt;
      updateScores();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function handleAnswer( chosen ) {&lt;br /&gt;
      if ( answered ) return;&lt;br /&gt;
      answered = true;&lt;br /&gt;
&lt;br /&gt;
      var s = SCENARIOS[order[current]];&lt;br /&gt;
      var isCorrect = s.answer === &#039;both&#039; ? true : chosen === s.answer;&lt;br /&gt;
&lt;br /&gt;
      if ( isCorrect ) correct++; else wrong++;&lt;br /&gt;
      updateScores();&lt;br /&gt;
&lt;br /&gt;
      /* Card border */&lt;br /&gt;
      var card = cardStage.firstChild;&lt;br /&gt;
      card.className = &#039;wix-is-card &#039; + ( isCorrect ? &#039;wix-is-card--correct&#039; : &#039;wix-is-card--wrong&#039; );&lt;br /&gt;
&lt;br /&gt;
      /* Feedback */&lt;br /&gt;
      if ( s.answer === &#039;both&#039; ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent = chosen === &#039;csm&#039; ? s.correctHead : s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML   = s.bothBody;&lt;br /&gt;
      } else if ( isCorrect ) {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--correct&#039;;&lt;br /&gt;
        fbHead.textContent   = s.correctHead;&lt;br /&gt;
        fbBody.innerHTML     = s.correctBody;&lt;br /&gt;
      } else {&lt;br /&gt;
        feedbackEl.className = &#039;wix-is-feedback wix-is-feedback--wrong&#039;;&lt;br /&gt;
        fbHead.textContent   = s.wrongHead;&lt;br /&gt;
        fbBody.innerHTML     = s.wrongBody;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      btnCsm.disabled = true;&lt;br /&gt;
      btnPl.disabled  = true;&lt;br /&gt;
&lt;br /&gt;
      btnNext.textContent = current &amp;gt;= order.length - 1 ? &#039;See results \u25B8&#039; : &#039;Next scenario \u25B8&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showFinal() {&lt;br /&gt;
      wix.empty( cardStage );&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices wix-hidden&#039;;&lt;br /&gt;
      feedbackEl.className = &#039;wix-is-feedback wix-hidden&#039;;&lt;br /&gt;
      progFill.style.width = &#039;100%&#039;;&lt;br /&gt;
      progText.textContent = order.length + &#039; / &#039; + order.length;&lt;br /&gt;
&lt;br /&gt;
      var pct = Math.round( correct / order.length * 100 );&lt;br /&gt;
      finalIcon.textContent  = pct === 100 ? &#039;\uD83C\uDFC6&#039; : pct &amp;gt;= 67 ? &#039;\uD83D\uDC4F&#039; : &#039;\uD83D\uDCDA&#039;;&lt;br /&gt;
      finalTitle.textContent = pct === 100 ? &#039;Perfect score!&#039; : pct &amp;gt;= 67 ? &#039;Well done!&#039; : &#039;Keep practising!&#039;;&lt;br /&gt;
      finalBody.innerHTML    = &#039;You got &amp;lt;strong&amp;gt;&#039; + correct + &#039; out of &#039; + order.length + &#039;&amp;lt;/strong&amp;gt; correct (&#039; + pct + &#039;%).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
        ( pct === 100&lt;br /&gt;
          ? &#039;You\u2019ve nailed the future vs.\u00A0current/past service distinction \u2014 the key question IFRS\u00A017 asks at every re-estimate.&#039;&lt;br /&gt;
          : &#039;Remember the key question: &amp;lt;strong&amp;gt;\u201CHas the service already been provided?\u201D&amp;lt;/strong&amp;gt; If yes, the change bypasses the CSM and goes straight to P&amp;amp;L. If no, it adjusts the CSM.&#039; );&lt;br /&gt;
&lt;br /&gt;
      finalEl.className = &#039;wix-is-final&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function restart() {&lt;br /&gt;
      order   = shuffle( makeRange( SCENARIOS.length ) );&lt;br /&gt;
      current = 0;&lt;br /&gt;
      correct = 0;&lt;br /&gt;
      wrong   = 0;&lt;br /&gt;
      finalEl.className  = &#039;wix-is-final wix-hidden&#039;;&lt;br /&gt;
      choicesEl.className = &#039;wix-is-choices&#039;;&lt;br /&gt;
      renderCard();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnCsm.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;csm&#039; ); } );&lt;br /&gt;
    btnPl.addEventListener( &#039;click&#039;, function () { handleAnswer( &#039;pl&#039; ); } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () { current++; renderCard(); } );&lt;br /&gt;
    btnRestart.addEventListener( &#039;click&#039;, restart );&lt;br /&gt;
&lt;br /&gt;
    renderCard();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23010</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23010"/>
		<updated>2026-04-06T17:15:39Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 340px;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 19px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 22px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.25rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IMPACT SORT — data-wix-module=&amp;quot;impact-sort&amp;quot;&lt;br /&gt;
   Binary classification: &amp;quot;Adjusts CSM&amp;quot; vs &amp;quot;Hits P&amp;amp;L directly&amp;quot;.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 78. Decision Rule Banner ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-rule {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  background: #fefce8;&lt;br /&gt;
  border: 1px solid #fde68a;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.6rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 79. Score Badges ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-score-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  padding: 0.3rem 0.65rem;&lt;br /&gt;
  border-radius: 20px;&lt;br /&gt;
  border: 1px solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-badge--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 80. Scenario Card ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 2px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-num {&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-text {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card-icon {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0.85rem;&lt;br /&gt;
  right: 0.85rem;&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-card--correct { border-color: var(--wix-correct); }&lt;br /&gt;
.wix-is-card--wrong   { border-color: var(--wix-wrong); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 81. Choice Buttons ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-choices {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 2px dashed;&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    transform   0.15s ease,&lt;br /&gt;
    box-shadow  0.15s ease,&lt;br /&gt;
    background  0.15s ease;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:hover {&lt;br /&gt;
  transform: scale(1.02);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:active {&lt;br /&gt;
  transform: scale(0.98);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice:disabled {&lt;br /&gt;
  opacity: 0.45;&lt;br /&gt;
  cursor: default;&lt;br /&gt;
  transform: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-icon { font-size: 1.4em; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice-sub {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--csm {&lt;br /&gt;
  border-color: #bfdbfe;&lt;br /&gt;
  background: #eff6ff;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--csm .wix-is-choice-title { color: #2563eb; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-choice--pl {&lt;br /&gt;
  border-color: #fecaca;&lt;br /&gt;
  background: #fef2f2;&lt;br /&gt;
}&lt;br /&gt;
.wix-is-choice--pl .wix-is-choice-title { color: #dc2626; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 82. Feedback Panel ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem 1.15rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  animation: wixFadeIn 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--correct {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border: 1px solid var(--wix-correct-border, #82e0aa);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-feedback--wrong {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border: 1px solid var(--wix-wrong-border, #f1948a);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-fb-head {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin-bottom: 0.25rem;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 83. Final Screen ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-is-final {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  padding: 2rem 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-icon { font-size: 2.5rem; margin-bottom: 0.65rem; }&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-is-final-body {&lt;br /&gt;
  font-size: 0.88em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  max-width: 500px;&lt;br /&gt;
  margin: 0 auto 1.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 84. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-is-choices {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23009</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23009"/>
		<updated>2026-04-06T17:06:12Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 340px;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 19px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 22px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 20px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.25rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_initial_recognition&amp;diff=23008</id>
		<title>Internal:Training/IFRS17/The general model: initial recognition</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_initial_recognition&amp;diff=23008"/>
		<updated>2026-04-06T17:03:18Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how to group [[Definition:Insurance contract|insurance contracts]] into [[Definition:Portfolio|portfolios]], [[Definition:Profitability group|profitability groups]], and [[Definition:Annual cohort|annual cohorts]] so that each group can be measured separately. Now we put that knowledge to work: for each group, you need to measure the [[Definition:Insurance contract liability|liability]] on day one. This page shows you exactly how.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* How to measure the four [[Definition:Building block|building blocks]] at the moment an [[Definition:Insurance contract|insurance contract]] group is first recognised on the [[Definition:Balance sheet|balance sheet]].&lt;br /&gt;
* What happens when the expected [[Definition:Cash flow|cash flows]] indicate a profitable group, and how the [[Definition:Contractual service margin|contractual service margin]] stores that unearned [[Definition:Profit|profit]].&lt;br /&gt;
* What happens when the numbers indicate an [[Definition:Onerous contract|onerous]] group, why the [[Definition:Contractual service margin|CSM]] cannot go below zero, and how the [[Definition:Loss|loss]] is recognised immediately.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Day one: measuring the four building blocks ==&lt;br /&gt;
&lt;br /&gt;
📅 &#039;&#039;&#039;The moment of truth.&#039;&#039;&#039; [[Definition:Initial recognition|Initial recognition]] is the first time an [[Definition:Insurance contract|insurance contract]] group appears on the [[Definition:Insurer|insurer&#039;s]] [[Definition:Balance sheet|balance sheet]]. Under the [[Definition:General model|general model]] of [[Definition:IFRS 17|IFRS 17]], this happens at the earliest of three dates: when the [[Definition:Coverage period|coverage period]] begins, when the first [[Definition:Premium|premium]] payment from the [[Definition:Policyholder|policyholder]] is due, or, for an [[Definition:Onerous contract|onerous]] group, the moment the insurer determines the group is onerous. Think of it like a stopwatch: once any of these triggers fires, the clock starts and the insurer must record the group on its books.&lt;br /&gt;
&lt;br /&gt;
🧱 &#039;&#039;&#039;Building the measurement, piece by piece.&#039;&#039;&#039; At that trigger date, the insurer calculates each of the four [[Definition:Building block|building blocks]] you have already studied. First, it estimates all [[Definition:Future cash flows|future cash flows]], which are the [[Definition:Probability-weighted estimate|probability-weighted]] [[Definition:Cash inflow|cash inflows]] (mainly [[Definition:Premium|premiums]]) and [[Definition:Cash outflow|cash outflows]] (mainly [[Definition:Claim|claims]] and [[Definition:Expense|expenses]]) expected over the life of the contracts. Second, it [[Definition:Discounting|discounts]] those cash flows to [[Definition:Present value|present value]] using an appropriate [[Definition:Discount rate|discount rate]]. Third, it adds a [[Definition:Risk adjustment|risk adjustment]] for non-financial risk to reflect the compensation the insurer requires for bearing the uncertainty in those cash flows. These three pieces together form the [[Definition:Fulfilment cash flows|fulfilment cash flows]]: the amount the insurer believes it will need to fulfil its promises.&lt;br /&gt;
&lt;br /&gt;
🔢 &#039;&#039;&#039;Putting numbers to the idea.&#039;&#039;&#039; Imagine AXA writes a group of 10,000 one-year [[Definition:Home insurance|home insurance]] contracts in Belgium, each charging a [[Definition:Premium|premium]] of €300. The total expected [[Definition:Cash inflow|premium inflow]] is €3,000,000. After estimating expected [[Definition:Claim|claims]], [[Definition:Acquisition cost|acquisition costs]], and [[Definition:Maintenance cost|maintenance expenses]], suppose the [[Definition:Present value|present value]] of all [[Definition:Future cash flows|future cash outflows]] is €2,600,000 and the [[Definition:Risk adjustment|risk adjustment]] is €120,000. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] are the sum of the [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash flows]] (outflows minus inflows) and the [[Definition:Risk adjustment|risk adjustment]]. The fourth and final [[Definition:Building block|building block]], the [[Definition:Contractual service margin|contractual service margin]], is then set to exactly offset the [[Definition:Fulfilment cash flows|fulfilment cash flows]], so that no [[Definition:Profit|profit]] or [[Definition:Loss|loss]] appears in the [[Definition:Income statement|income statement]] on day one. In this example, the [[Definition:Contractual service margin|CSM]] would be €280,000, representing the unearned profit the insurer expects to make.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;building-blocks&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Many learners assume that [[Definition:Initial recognition|initial recognition]] always happens when the [[Definition:Policyholder|policyholder]] signs the contract. In reality, the trigger can come earlier: if [[Definition:Premium|premiums]] are due before coverage starts, or if the group is identified as [[Definition:Onerous contract|onerous]] before either of those dates, recognition kicks in at that earlier point. The signature date matters for legal purposes, but [[Definition:IFRS 17|IFRS 17]] cares about economic substance, not paperwork.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the four [[Definition:Building block|building blocks]] are designed so that the [[Definition:Balance sheet|balance sheet]] shows no profit on day one, what happens when the numbers suggest the group will actually be profitable? Where does that future [[Definition:Profit|profit]] go?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Profitable contracts: CSM is positive ==&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Locking away the profit.&#039;&#039;&#039; When the [[Definition:Present value|present value]] of expected [[Definition:Cash inflow|inflows]] exceeds the [[Definition:Present value|present value]] of expected [[Definition:Cash outflow|outflows]] plus the [[Definition:Risk adjustment|risk adjustment]], the group is considered profitable. In that case, the [[Definition:Contractual service margin|contractual service margin]] is set to a positive amount that exactly offsets the day-one gain. The logic is simple: the insurer has not yet done anything for the [[Definition:Policyholder|policyholders]]; it has not settled a single [[Definition:Claim|claim]] or provided a single day of [[Definition:Coverage period|coverage]]. Recognising [[Definition:Profit|profit]] before delivering the service would be misleading, so [[Definition:IFRS 17|IFRS 17]] requires the insurer to store that expected profit in the [[Definition:Contractual service margin|CSM]] and release it gradually as service is provided.&lt;br /&gt;
&lt;br /&gt;
🏠 &#039;&#039;&#039;Seeing it in action.&#039;&#039;&#039; Return to the Belgian [[Definition:Home insurance|home insurance]] example. The [[Definition:Present value|present value]] of [[Definition:Cash inflow|premium inflows]] is €3,000,000. The [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash outflows]] is €2,600,000, and the [[Definition:Risk adjustment|risk adjustment]] is €120,000. The net [[Definition:Future cash flows|future cash flows]] (outflows minus inflows, in present-value terms) equal negative €400,000, meaning the group expects to receive €400,000 more than it expects to pay out. After adding the [[Definition:Risk adjustment|risk adjustment]] of €120,000, the [[Definition:Fulfilment cash flows|fulfilment cash flows]] amount to negative €280,000, indicating an expected gain of €280,000. The [[Definition:Contractual service margin|CSM]] is set at exactly €280,000, making the total [[Definition:Insurance contract liability|liability]] on the [[Definition:Balance sheet|balance sheet]] equal to zero initial [[Definition:Profit|profit]].&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;The balance sheet on day one.&#039;&#039;&#039; At [[Definition:Initial recognition|initial recognition]], the [[Definition:Insurance contract liability|insurance contract liability]] for this group equals the sum of two components: the [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|CSM]]. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] themselves consist of the [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash flows]] (outflows minus inflows) plus the [[Definition:Risk adjustment|risk adjustment]]. For the Belgian example, that total is €2,600,000 (outflows) − €3,000,000 (inflows) + €120,000 ([[Definition:Risk adjustment|RA]]) + €280,000 ([[Definition:Contractual service margin|CSM]]) = €0 net. In practice, the liability is not literally zero because the insurer typically records the [[Definition:Premium|premiums]] received as a [[Definition:Cash inflow|cash asset]] on the other side. The point is that no [[Definition:Profit|profit]] or [[Definition:Loss|loss]] hits the [[Definition:Income statement|income statement]]. The [[Definition:Contractual service margin|CSM]] acts like a reservoir: it holds the expected profit until the insurer earns it by delivering [[Definition:Coverage period|coverage]] over time.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that a larger [[Definition:Contractual service margin|CSM]] is always better. While a large CSM signals high expected [[Definition:Profit|profitability]], it also means the insurer cannot recognise that [[Definition:Profit|profit]] immediately. The CSM must be released over the [[Definition:Coverage period|coverage period]] through [[Definition:Coverage unit|coverage units]], so a very large CSM on a long-duration contract means profit appears slowly. Profitability on the [[Definition:Income statement|income statement]] depends on the pattern of release, not just the size of the pool.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; We have seen what happens when the numbers work in the insurer&#039;s favour. But what if the expected [[Definition:Cash outflow|outflows]] and [[Definition:Risk adjustment|risk adjustment]] exceed the expected [[Definition:Cash inflow|inflows]]? Can the [[Definition:Contractual service margin|CSM]] go negative?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Onerous contracts: CSM is zero, loss recognized immediately ==&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;When the maths turns negative.&#039;&#039;&#039; Sometimes the expected [[Definition:Cash outflow|outflows]] plus the [[Definition:Risk adjustment|risk adjustment]] exceed the expected [[Definition:Cash inflow|inflows]], even before the insurer provides any [[Definition:Coverage period|coverage]]. In this situation, there is no expected [[Definition:Profit|profit]] to store; instead, the group is expected to make a [[Definition:Loss|loss]]. Under [[Definition:IFRS 17|IFRS 17]], the [[Definition:Contractual service margin|CSM]] cannot be negative. It is floored at zero because the CSM represents unearned profit, and you cannot have negative unearned profit. The shortfall, the amount by which the [[Definition:Fulfilment cash flows|fulfilment cash flows]] exceed zero, must be recognised as a [[Definition:Loss|loss]] in the [[Definition:Income statement|income statement]] immediately at [[Definition:Initial recognition|initial recognition]].&lt;br /&gt;
&lt;br /&gt;
🌊 &#039;&#039;&#039;A concrete scenario.&#039;&#039;&#039; Suppose an insurer like AXA launches a [[Definition:Property insurance|property insurance]] product for 5,000 homes along the Atlantic coast in Brittany, France. Each [[Definition:Policyholder|policyholder]] pays a [[Definition:Premium|premium]] of €250, giving total expected [[Definition:Cash inflow|inflows]] of €1,250,000 in [[Definition:Present value|present value]] terms. However, updated [[Definition:Climate risk|climate models]] forecast a severe storm season, pushing the [[Definition:Present value|present value]] of expected [[Definition:Claim|claims]] and [[Definition:Expense|expenses]] to €1,300,000. The [[Definition:Risk adjustment|risk adjustment]] adds another €80,000, reflecting the high uncertainty around coastal storm damage. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] are €1,300,000 − €1,250,000 + €80,000 = €130,000. Since this is positive (meaning the insurer expects to pay out more than it receives), the [[Definition:Contractual service margin|CSM]] cannot absorb the shortfall and is set to zero. The insurer recognises the €130,000 as a [[Definition:Loss|loss]] on day one. This [[Definition:Loss|loss]] appears in the [[Definition:Income statement|income statement]] as part of [[Definition:Insurance service expense|insurance service expenses]].&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners believe that identifying a group as [[Definition:Onerous contract|onerous]] means the insurer made a pricing mistake. That is not necessarily true. A group may become onerous because of a change in conditions after pricing, such as new weather data or an unexpected regulatory cost. Additionally, remember that [[Definition:Grouping contracts|grouping rules]] require separating contracts expected to be [[Definition:Onerous contract|onerous]] from those expected to be [[Definition:Profitable contract|profitable]]. Even if the [[Definition:Portfolio|portfolio]] as a whole is profitable, the onerous subgroup must reveal its [[Definition:Loss|losses]] separately, preventing profitable contracts from masking problems.&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Why immediate recognition matters.&#039;&#039;&#039; The rationale behind this asymmetry, where gains are deferred but [[Definition:Loss|losses]] are recognised immediately, is rooted in the accounting principle of [[Definition:Prudence|prudence]]. Investors and regulators want early warning when an insurer faces expected [[Definition:Loss|losses]]. If the insurer could hide the shortfall inside a negative [[Definition:Contractual service margin|CSM]] and spread it over years, the [[Definition:Financial statement|financial statements]] would paint a misleadingly rosy picture. By forcing immediate [[Definition:Loss|loss]] recognition, [[Definition:IFRS 17|IFRS 17]] ensures that bad news reaches stakeholders as soon as the insurer itself knows about it. This makes the [[Definition:Balance sheet|balance sheet]] a more honest snapshot of the insurer&#039;s obligations and helps maintain trust in [[Definition:Financial reporting|financial reporting]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* At [[Definition:Initial recognition|initial recognition]], the insurer measures all four [[Definition:Building block|building blocks]] (estimates of [[Definition:Future cash flows|future cash flows]], [[Definition:Discounting|discounting]], [[Definition:Risk adjustment|risk adjustment]], and [[Definition:Contractual service margin|CSM]]) and records the [[Definition:Insurance contract liability|liability]] on the [[Definition:Balance sheet|balance sheet]], with the [[Definition:Contractual service margin|CSM]] set so that no [[Definition:Profit|profit]] appears on day one. The first three building blocks together form the [[Definition:Fulfilment cash flows|fulfilment cash flows]].&lt;br /&gt;
* For profitable groups, the [[Definition:Contractual service margin|CSM]] stores the expected gain as unearned [[Definition:Profit|profit]], to be released gradually as the insurer delivers [[Definition:Coverage period|coverage]].&lt;br /&gt;
* For [[Definition:Onerous contract|onerous]] groups, the [[Definition:Contractual service margin|CSM]] is floored at zero and the expected [[Definition:Loss|loss]] is recognised immediately in the [[Definition:Income statement|income statement]], reflecting the accounting principle of [[Definition:Prudence|prudence]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The general model: initial recognition/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23007</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23007"/>
		<updated>2026-04-06T17:02:51Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   - &amp;quot;building-blocks&amp;quot;   Stacked-bar initial recognition building blocks&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward,&lt;br /&gt;
    &#039;building-blocks&#039;:      initBuildingBlocks&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
     Stacked-bar visualisation of IFRS 17 initial recognition.&lt;br /&gt;
     Two sliders control outflows and risk adjustment; the chart&lt;br /&gt;
     shows inflows vs outflows+RA+CSM and flips between profitable&lt;br /&gt;
     and onerous states with a day-one loss bar.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBuildingBlocks( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var INFLOWS = 3000000;&lt;br /&gt;
    var MAX_BAR = 260;&lt;br /&gt;
    var C_INFLOW  = &#039;#2b6cb0&#039;;&lt;br /&gt;
    var C_OUTFLOW = &#039;#c05621&#039;;&lt;br /&gt;
    var C_RA      = &#039;#9b59b6&#039;;&lt;br /&gt;
    var C_CSM     = &#039;#27ae60&#039;;&lt;br /&gt;
    var C_LOSS    = &#039;#e74c3c&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v ).toLocaleString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtShort( v ) {&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000000 ) return &#039;\u20AC&#039; + ( v / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      if ( Math.abs( v ) &amp;gt;= 1000 )    return &#039;\u20AC&#039; + ( v / 1000 ).toFixed( 0 ) + &#039;K&#039;;&lt;br /&gt;
      return &#039;\u20AC&#039; + v;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Building Block Stacker&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Status banner */&lt;br /&gt;
    var bannerIcon = wix.el( &#039;span&#039; );&lt;br /&gt;
    var bannerText = wix.el( &#039;span&#039; );&lt;br /&gt;
    var banner = wix.el( &#039;div&#039;, { className: &#039;wix-bb-banner wix-bb-banner--profit&#039; }, [&lt;br /&gt;
      bannerIcon, bannerText&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( banner );&lt;br /&gt;
&lt;br /&gt;
    /* Chart area */&lt;br /&gt;
    function makeSeg( color ) {&lt;br /&gt;
      var valEl = wix.el( &#039;span&#039;, { className: &#039;wix-bb-seg-val&#039; } );&lt;br /&gt;
      var seg   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-seg&#039;, style: { background: color, height: &#039;0px&#039; } }, [ valEl ] );&lt;br /&gt;
      return { seg: seg, valEl: valEl };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeGroup( labelHTML, stack, extra ) {&lt;br /&gt;
      var label = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039;, innerHTML: labelHTML } );&lt;br /&gt;
      var grp   = wix.el( &#039;div&#039;,  { className: &#039;wix-bb-group&#039; }, [ stack, label ] );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { grp.style[k] = extra[k]; } );&lt;br /&gt;
      return grp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeOp( text, extra ) {&lt;br /&gt;
      var op = wix.el( &#039;span&#039;, { className: &#039;wix-bb-op&#039;, textContent: text } );&lt;br /&gt;
      if ( extra ) Object.keys( extra ).forEach( function ( k ) { op.style[k] = extra[k]; } );&lt;br /&gt;
      return op;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Inflow bar */&lt;br /&gt;
    var inflow = makeSeg( C_INFLOW );&lt;br /&gt;
    var stackInflow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ inflow.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Outflow + RA + CSM stacked bar */&lt;br /&gt;
    var csmSeg     = makeSeg( C_CSM );&lt;br /&gt;
    var raSeg      = makeSeg( C_RA );&lt;br /&gt;
    var outflowSeg = makeSeg( C_OUTFLOW );&lt;br /&gt;
    var stackRight = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [&lt;br /&gt;
      csmSeg.seg, raSeg.seg, outflowSeg.seg&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Result bar */&lt;br /&gt;
    var resultSeg   = makeSeg( C_CSM );&lt;br /&gt;
    var resultLabel = wix.el( &#039;span&#039;, { className: &#039;wix-bb-bar-label&#039; } );&lt;br /&gt;
    var stackResult = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ resultSeg.seg ] );&lt;br /&gt;
&lt;br /&gt;
    /* Loss bar */&lt;br /&gt;
    var lossSeg    = makeSeg( C_LOSS );&lt;br /&gt;
    var stackLoss  = wix.el( &#039;div&#039;, { className: &#039;wix-bb-stack&#039; }, [ lossSeg.seg ] );&lt;br /&gt;
    var lossOp     = makeOp( &#039;+&#039;, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
    var lossGroup  = makeGroup( &#039;Day-one&amp;lt;br&amp;gt;loss&#039;, stackLoss, { visibility: &#039;hidden&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartRow = wix.el( &#039;div&#039;, { className: &#039;wix-bb-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-bb-zero&#039;, textContent: &#039;\u20AC0&#039; } ),&lt;br /&gt;
      makeGroup( &#039;Inflows&amp;lt;br&amp;gt;(Premiums)&#039;, stackInflow ),&lt;br /&gt;
      makeOp( &#039;vs&#039; ),&lt;br /&gt;
      makeGroup( &#039;Outflows + RA&amp;lt;br&amp;gt;+ CSM&#039;, stackRight ),&lt;br /&gt;
      makeOp( &#039;=&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-group&#039; }, [ stackResult, resultLabel ] ),&lt;br /&gt;
      lossOp,&lt;br /&gt;
      lossGroup&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function legendItem( color, text ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-legend-swatch&#039;, style: { background: color } } ),&lt;br /&gt;
        text&lt;br /&gt;
      ] );&lt;br /&gt;
    }&lt;br /&gt;
    var legend = wix.el( &#039;div&#039;, { className: &#039;wix-bb-legend&#039; }, [&lt;br /&gt;
      legendItem( C_INFLOW, &#039;PV of inflows&#039; ),&lt;br /&gt;
      legendItem( C_OUTFLOW, &#039;PV of outflows&#039; ),&lt;br /&gt;
      legendItem( C_RA, &#039;Risk adjustment&#039; ),&lt;br /&gt;
      legendItem( C_CSM, &#039;CSM&#039; ),&lt;br /&gt;
      legendItem( C_LOSS, &#039;Loss&#039; )&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-chart&#039; }, [ chartRow, legend ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider controls */&lt;br /&gt;
    var slOutflow = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1500000&#039;, max: &#039;3800000&#039;, step: &#039;10000&#039;, value: &#039;2600000&#039; } );&lt;br /&gt;
    var svOutflow = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
    var slRa      = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;500000&#039;, step: &#039;5000&#039;, value: &#039;120000&#039; } );&lt;br /&gt;
    var svRa      = wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-val&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-controls-title&#039;, textContent: &#039;Adjust the assumptions&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_OUTFLOW } } ),&lt;br /&gt;
          &#039;PV of outflows&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slOutflow, svOutflow&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-bb-slider-row&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-label&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-bb-slider-dot&#039;, style: { background: C_RA } } ),&lt;br /&gt;
          &#039;Risk adjustment&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        slRa, svRa&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Reset button */&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;\u21BA Reset to Belgian example&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { style: { marginBottom: &#039;1.25rem&#039; } }, [ btnReset ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Insight */&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-bb-insight&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
    /* ── Update logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var outflow = Number( slOutflow.value );&lt;br /&gt;
      var ra      = Number( slRa.value );&lt;br /&gt;
      var netFC       = outflow - INFLOWS;&lt;br /&gt;
      var fulfilment  = netFC + ra;&lt;br /&gt;
      var csm         = Math.max( 0, -fulfilment );&lt;br /&gt;
      var loss        = Math.max( 0, fulfilment );&lt;br /&gt;
      var isOnerous   = fulfilment &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
      /* Slider readouts */&lt;br /&gt;
      svOutflow.textContent = fmt( outflow );&lt;br /&gt;
      svRa.textContent      = fmt( ra );&lt;br /&gt;
&lt;br /&gt;
      /* Bar heights */&lt;br /&gt;
      var leftTotal  = INFLOWS;&lt;br /&gt;
      var rightTotal = outflow + ra + csm;&lt;br /&gt;
      var maxVal     = Math.max( leftTotal, rightTotal, 1 );&lt;br /&gt;
&lt;br /&gt;
      inflow.seg.style.height     = ( INFLOWS / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      inflow.valEl.textContent    = fmtShort( INFLOWS );&lt;br /&gt;
&lt;br /&gt;
      outflowSeg.seg.style.height = ( outflow / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      outflowSeg.valEl.textContent = fmtShort( outflow );&lt;br /&gt;
&lt;br /&gt;
      raSeg.seg.style.height      = ( ra / maxVal * MAX_BAR ) + &#039;px&#039;;&lt;br /&gt;
      raSeg.valEl.textContent     = fmtShort( ra );&lt;br /&gt;
&lt;br /&gt;
      var hCsm = ( csm / maxVal * MAX_BAR );&lt;br /&gt;
      csmSeg.seg.style.height     = hCsm + &#039;px&#039;;&lt;br /&gt;
      csmSeg.valEl.textContent    = csm &amp;gt; 0 ? fmtShort( csm ) : &#039;&#039;;&lt;br /&gt;
      csmSeg.seg.style.display    = csm &amp;gt; 0 ? &#039;block&#039; : &#039;none&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Result bar */&lt;br /&gt;
      resultSeg.seg.style.height  = &#039;28px&#039;;&lt;br /&gt;
      resultSeg.valEl.textContent = &#039;\u20AC0&#039;;&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        resultSeg.seg.style.background = C_CSM;&lt;br /&gt;
        resultLabel.innerHTML = &#039;No day-one&amp;lt;br&amp;gt;profit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        resultSeg.seg.style.background = C_LOSS;&lt;br /&gt;
        resultLabel.innerHTML = &#039;CSM&amp;lt;br&amp;gt;= \u20AC0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Loss bar */&lt;br /&gt;
      if ( isOnerous ) {&lt;br /&gt;
        lossGroup.style.visibility = &#039;visible&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;visible&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = Math.max( loss / maxVal * MAX_BAR, 18 ) + &#039;px&#039;;&lt;br /&gt;
        lossSeg.valEl.textContent  = fmtShort( loss );&lt;br /&gt;
      } else {&lt;br /&gt;
        lossGroup.style.visibility = &#039;hidden&#039;;&lt;br /&gt;
        lossOp.style.visibility    = &#039;hidden&#039;;&lt;br /&gt;
        lossSeg.seg.style.height   = &#039;0px&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Banner */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--profit&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\u2705&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Profitable group \u2014 CSM of &amp;lt;strong&amp;gt;&#039; + fmt( csm ) + &#039;&amp;lt;/strong&amp;gt; absorbs the expected gain.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        banner.className = &#039;wix-bb-banner wix-bb-banner--onerous&#039;;&lt;br /&gt;
        bannerIcon.textContent = &#039;\uD83D\uDEA8&#039;;&lt;br /&gt;
        bannerText.innerHTML   = &#039;Onerous group \u2014 CSM is zero. Day-one loss of &amp;lt;strong&amp;gt;&#039; + fmt( loss ) + &#039;&amp;lt;/strong&amp;gt; hits the income statement.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Insight */&lt;br /&gt;
      if ( !isOnerous ) {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is negative (inflows exceed outflows + RA), the group is profitable. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-csm&amp;quot;&amp;gt;CSM is set to &#039; + fmt( csm ) + &#039;&amp;lt;/span&amp;gt; to absorb this gain, so no profit appears on day one. &#039; +&lt;br /&gt;
          &#039;That unearned profit will be released gradually as coverage is provided.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.innerHTML =&lt;br /&gt;
          &#039;&amp;lt;strong&amp;gt;How it works:&amp;lt;/strong&amp;gt; The present value of future cash flows (outflows minus inflows) is &amp;lt;strong&amp;gt;&#039; + fmt( netFC ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Adding the risk adjustment of &amp;lt;strong&amp;gt;&#039; + fmt( ra ) + &#039;&amp;lt;/strong&amp;gt; gives fulfilment cash flows of &amp;lt;strong&amp;gt;&#039; + fmt( fulfilment ) + &#039;&amp;lt;/strong&amp;gt;. &#039; +&lt;br /&gt;
          &#039;Since this is positive (outflows + RA exceed inflows), there is no profit to store. &#039; +&lt;br /&gt;
          &#039;The CSM cannot go negative, so it is &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;floored at zero&amp;lt;/span&amp;gt;. &#039; +&lt;br /&gt;
          &#039;The &amp;lt;span class=&amp;quot;wix-bb-hl-loss&amp;quot;&amp;gt;&#039; + fmt( loss ) + &#039; shortfall is recognised as a loss&amp;lt;/span&amp;gt; in the income statement immediately \u2014 the principle of prudence demands early warning.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slOutflow.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    slRa.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      slOutflow.value = &#039;2600000&#039;;&lt;br /&gt;
      slRa.value      = &#039;120000&#039;;&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23006</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23006"/>
		<updated>2026-04-06T17:02:39Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BUILDING BLOCKS — data-wix-module=&amp;quot;building-blocks&amp;quot;&lt;br /&gt;
   Stacked-bar visualisation of initial recognition building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 69. Status Banner ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  border: 1px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background var(--wix-transition),&lt;br /&gt;
    color      var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
  border-color: var(--wix-correct-border, #82e0aa);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner--onerous {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong-border, #f1948a);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-banner-detail {&lt;br /&gt;
  font-weight: 400;&lt;br /&gt;
  opacity: 0.85;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 70. Chart Area ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-chart {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem 1rem 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 71. Bar Row ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: flex-end;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  gap: 1.4rem;&lt;br /&gt;
  height: 300px;&lt;br /&gt;
  padding-bottom: 36px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-row::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 35px;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  right: 0;&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-zero {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 38px;&lt;br /&gt;
  left: 6px;&lt;br /&gt;
  font-size: 0.7em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 72. Bar Groups + Stacks ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-group {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
  width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-stack {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  width: 62px;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-radius: 0;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  transition: height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg:first-child {&lt;br /&gt;
  border-radius: var(--wix-radius) var(--wix-radius) 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-seg-val {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translate(-50%, -50%);&lt;br /&gt;
  font-size: 0.68em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-bar-label {&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 73. Operator Signs ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-op {&lt;br /&gt;
  font-size: 1.5rem;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
  padding-bottom: 36px;&lt;br /&gt;
  opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 74. Legend ──────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.85rem;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
  font-size: 0.72em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-legend-swatch {&lt;br /&gt;
  width: 12px;&lt;br /&gt;
  height: 12px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 75. Slider Controls ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls {&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-controls-title {&lt;br /&gt;
  font-size: 0.78em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.06em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-label {&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  width: 160px;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-slider-val {&lt;br /&gt;
  width: 100px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  font-size: 0.82em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 76. Insight Box ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bb-insight strong { font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-csm  { color: #27ae60; font-weight: 700; }&lt;br /&gt;
.wix-bb-hl-loss { color: #e74c3c; font-weight: 700; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 77. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-bb-row { gap: 0.5rem; }&lt;br /&gt;
  .wix-bb-group { width: 68px; }&lt;br /&gt;
  .wix-bb-stack { width: 44px; }&lt;br /&gt;
  .wix-bb-bar-label { font-size: 0.62em; }&lt;br /&gt;
  .wix-bb-slider-label { width: 120px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-slider-val { width: 85px; font-size: 0.76em; }&lt;br /&gt;
  .wix-bb-op { font-size: 1.2rem; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23005</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23005"/>
		<updated>2026-04-06T16:53:25Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Title */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;AXA CSM rollforward FY24\u201325 (\u20AC\u00A0million)&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_contractual_service_margin&amp;diff=23004</id>
		<title>Internal:Training/IFRS17/The contractual service margin</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_contractual_service_margin&amp;diff=23004"/>
		<updated>2026-04-06T16:50:25Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:Risk adjustment|risk adjustment]] compensates the insurer for bearing uncertainty, and how it releases gradually as risk expires. Now we turn to the final building block, the one that captures the profit the insurer expects to earn from a group of contracts: the contractual service margin.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* What the contractual service margin represents and why IFRS 17 locks expected profit away on the first day of a contract rather than recognising it immediately.&lt;br /&gt;
* How the CSM acts as a buffer that absorbs changes in estimates about future service, preventing those changes from creating artificial swings in [[Definition:Profit or loss|profit or loss]].&lt;br /&gt;
* How the CSM releases into [[Definition:Revenue|revenue]] over time through a mechanism called [[Definition:Coverage units|coverage units]], and why the pattern of release matters.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== What the CSM represents: unearned profit locked away on day one ==&lt;br /&gt;
&lt;br /&gt;
🔒 &#039;&#039;&#039;Profit you have not yet earned.&#039;&#039;&#039; Imagine AXA writes a portfolio of five-year [[Definition:Life insurance|life insurance]] contracts in France. On the day those contracts are signed, the insurer can already calculate that it expects to collect more in [[Definition:Premium|premiums]] and [[Definition:Investment income|investment income]] than it expects to pay in [[Definition:Claims|claims]], [[Definition:Expenses|expenses]], and the [[Definition:Risk adjustment|risk adjustment]]. That surplus, the expected profit, is the contractual service margin, commonly abbreviated as CSM. Under IFRS 17, this profit is not reported in the [[Definition:Income statement|income statement]] on day one. Instead, it is recorded as a [[Definition:Liability|liability]] on the [[Definition:Balance sheet|balance sheet]], effectively locked away until the insurer actually delivers the promised [[Definition:Coverage|coverage]]. The logic is simple: you cannot claim to have earned profit for a service you have not yet provided.&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;Why it is a liability.&#039;&#039;&#039; At first glance, calling expected profit a liability may seem strange. A liability normally represents something you owe, not something positive. But the CSM reflects an obligation to provide future service. Think of it like a contractor who receives payment before building a house: the money is in the bank, but the contractor owes the client a finished building. Until the work is done, that payment is a liability, not revenue. In the same way, the CSM sits on the balance sheet as a reminder that the insurer has collected premiums for service it still needs to deliver. Each period that passes and coverage is provided, a portion of the CSM moves from the balance sheet into the income statement as earned [[Definition:Revenue|revenue]].&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume the CSM is cash set aside in a separate account. It is not. The CSM is a purely accounting construct, a number within the [[Definition:Insurance contract liability|insurance contract liability]] that tracks how much unearned profit remains. No money is physically ring-fenced. The cash from premiums is invested alongside all other assets. The CSM simply tells you how much of the total liability represents future profit rather than future obligations to pay claims.&lt;br /&gt;
&lt;br /&gt;
💡 &#039;&#039;&#039;What happens when there is no profit.&#039;&#039;&#039; Not every group of contracts is expected to be profitable. If the insurer&#039;s best estimate of future outflows (including the [[Definition:Risk adjustment|risk adjustment]]) exceeds the expected inflows, there is no surplus to lock away. In that case, the CSM is set to zero, and the expected loss is recognised immediately in the [[Definition:Income statement|income statement]]. IFRS 17 is deliberately asymmetric here: expected profits are deferred and released over time, but expected losses hit the accounts right away. This protects users of [[Definition:Financial statements|financial statements]] from being misled by a balance sheet that hides known losses behind future hopes.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; Once the CSM is set on day one, what happens if reality turns out differently from the original assumptions? If claims are expected to be lower than first thought, does the insurer immediately book extra profit, or does something else happen?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the CSM absorbs changes in estimates ==&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;Estimates change constantly.&#039;&#039;&#039; Insurance is a business of long-term promises and uncertain outcomes. The assumptions made when a contract is first written, about [[Definition:Claims frequency|claim frequency]], average [[Definition:Claims severity|claim severity]], [[Definition:Lapse rate|lapse rates]], [[Definition:Expenses|expenses]], and more, will almost certainly prove imperfect over time. New data arrives, trends shift, and the insurer revises its [[Definition:Fulfilment cash flows|fulfilment cash flows]] at every [[Definition:Reporting date|reporting date]]. Under IFRS 17, the way these revisions flow through the accounts depends on a critical distinction: do the revised assumptions relate to future service that the insurer has not yet delivered, or to current and past service already provided?&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;The CSM as a buffer for future service.&#039;&#039;&#039; When a change in estimates relates to future service, it adjusts the CSM rather than hitting the [[Definition:Income statement|income statement]]. Consider a portfolio of [[Definition:Home insurance|home insurance]] contracts in Belgium. Suppose at the end of year one the insurer revises its assumptions and now expects fewer [[Definition:Claims|claims]] than originally projected for the remaining coverage period. This improvement means the contracts are more profitable than initially thought. Rather than booking that windfall as an immediate gain, IFRS 17 requires the insurer to increase the CSM. The extra profit is stored on the [[Definition:Balance sheet|balance sheet]] and released gradually as coverage continues. The reverse also applies: if revised assumptions indicate higher future claims, the CSM decreases. As long as the CSM remains positive, the income statement is shielded from these estimate changes.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent error is believing that the CSM can absorb all changes in estimates, regardless of direction or magnitude. In fact, the CSM cannot go below zero. If unfavourable changes exceed the remaining CSM, the excess is recognised immediately as a loss in the [[Definition:Income statement|income statement]]. At that point, the group of contracts has become [[Definition:Onerous contract|onerous]], meaning the insurer now expects to lose money. Once onerous, any further deterioration also goes directly to profit or loss. The CSM is a one-way floor at zero: it can absorb bad news only up to the point where expected profit runs out.&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;A concrete illustration.&#039;&#039;&#039; Imagine AXA holds a group of five-year [[Definition:Employers&#039; liability insurance|employers&#039; liability]] contracts in Germany with an initial CSM of €5 million. At the end of year one, updated [[Definition:Claims|claims]] data suggests that future claims will be €2 million lower than expected. The CSM rises to €7 million (before any release). At the end of year two, however, a new court ruling on [[Definition:Bodily injury|bodily injury]] compensation increases expected future claims by €9 million. The CSM, which stood at roughly €7 million before release, cannot absorb the full €9 million. It drops to zero, and the remaining shortfall, approximately €2 million, flows straight into the income statement as a loss. This example shows the CSM acting as a shock absorber: it smooths out moderate swings, but it cannot hide genuine losses.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; The CSM stores unearned profit and releases it as coverage is provided. But how does the insurer decide how much to release each period? If a five-year contract provides more coverage in some years than others, should the release be equal each year, or should it follow the pattern of service?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;csm-rollforward&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the CSM releases into revenue: coverage units ==&lt;br /&gt;
&lt;br /&gt;
📏 &#039;&#039;&#039;Matching profit to service.&#039;&#039;&#039; The CSM does not sit on the [[Definition:Balance sheet|balance sheet]] forever. Each reporting period, a portion is released into the [[Definition:Income statement|income statement]] as part of [[Definition:Insurance revenue|insurance revenue]]. The amount released must reflect the service the insurer has provided during that period relative to the total service it expects to provide over the remaining life of the contracts. IFRS 17 operationalises this through a concept called [[Definition:Coverage units|coverage units]]. A coverage unit is a measure of the quantity of service delivered to [[Definition:Policyholders|policyholders]] in a given period. The insurer defines what a coverage unit means for each group of contracts, then uses those units to allocate the CSM across periods.&lt;br /&gt;
&lt;br /&gt;
🏠 &#039;&#039;&#039;A simple example.&#039;&#039;&#039; Take a group of 2,000 [[Definition:Home insurance|home insurance]] policies in Spain, each providing one year of [[Definition:Coverage|coverage]]. If coverage is uniform across the year, each policy contributes one coverage unit per quarter. At the start of the year, the group has 2,000 × 4 = 8,000 total coverage units. In the first quarter, 2,000 units are provided, which is 25% of the total. So 25% of the CSM is released into revenue for that quarter. If 100 policies lapse at the end of the first quarter, the remaining coverage units drop: only 1,900 policies contribute for the remaining three quarters. The insurer recalculates the allocation based on the updated total, ensuring the release pattern always reflects the actual service delivered.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to assume that coverage units are always based on the passage of time, resulting in a straight-line release. This is often the case for simple annual [[Definition:Property insurance|property]] or [[Definition:Motor insurance|motor]] policies, but it is not a universal rule. For contracts where the level of service varies over time, for example a [[Definition:Life insurance|life insurance]] policy where the [[Definition:Sum insured|sum insured]] decreases each year as the policyholder ages, coverage units should reflect that changing level of service. A policy with a higher sum insured in early years provides more coverage per period than one with a lower sum insured later. The release pattern must follow the service, not simply the calendar.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Why the pattern matters.&#039;&#039;&#039; The choice of coverage units directly shapes the timing of [[Definition:Profit|profit]] recognition. If coverage units are defined too aggressively early on, the insurer front-loads profit. If they are spread too evenly when risk is concentrated in later years, profit appears later than the economic reality warrants. Getting the pattern right ensures that the [[Definition:Income statement|income statement]] faithfully represents when the insurer is actually providing value to [[Definition:Policyholders|policyholders]]. This is the heart of IFRS 17&#039;s philosophy: profit should emerge as service is delivered, not before and not after. Every reporting period, the balance sheet shows the unearned profit still to come, and the income statement shows the profit justly attributable to the period that has passed.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* The CSM captures the expected profit from a group of [[Definition:Insurance contract|insurance contracts]] and holds it on the [[Definition:Balance sheet|balance sheet]] as a [[Definition:Liability|liability]] until the service is delivered; if a group is expected to be loss-making, the loss is recognised immediately instead.&lt;br /&gt;
* Changes in estimates that relate to future service adjust the CSM rather than the [[Definition:Income statement|income statement]], but the CSM cannot fall below zero: once it is exhausted, further adverse changes are recognised as losses immediately.&lt;br /&gt;
* The CSM releases into [[Definition:Revenue|revenue]] each period in proportion to [[Definition:Coverage units|coverage units]], ensuring that profit recognition follows the pattern of service provided to [[Definition:Policyholders|policyholders]] rather than the timing of cash received.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The contractual service margin/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23003</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=23003"/>
		<updated>2026-04-06T16:49:44Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
   Horizontal waterfall: FY24 opening → movements → FY25 closing.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 64. Slider Grid ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-sliders {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));&lt;br /&gt;
  gap: 12px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-group label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  display: block;&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-slider-val {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  min-width: 52px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 65. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 66. Explainer Panel ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer {&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-explainer--hidden {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-title {&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-val {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-csm-ex-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 67. Hint ───────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-csm-hint {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 68. Mobile ─────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-csm-sliders {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23002</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23002"/>
		<updated>2026-04-06T16:49:31Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   - &amp;quot;csm-rollforward&amp;quot;   Horizontal waterfall: CSM opening → movements → closing&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel,&lt;br /&gt;
    &#039;csm-rollforward&#039;:      initCsmRollforward&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     CSM ROLLFORWARD — data-wix-module=&amp;quot;csm-rollforward&amp;quot;&lt;br /&gt;
     Horizontal waterfall chart: FY24 opening balance through six&lt;br /&gt;
     movement items to FY25 closing balance.  Sliders let the user&lt;br /&gt;
     adjust each component; click any bar for an explanation.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initCsmRollforward( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Item definitions ────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var ITEMS = [&lt;br /&gt;
      { key: &#039;nb&#039;,  label: &#039;New business CSM&#039;,   val: 2199,  min: 0,     max: 5000,  step: 50, color: &#039;#1D9E75&#039;,&lt;br /&gt;
        explain: &#039;The CSM recognised at inception of new insurance contracts written during the year. It represents the present value of future unearned profit that the insurer expects to earn from these new policies. A higher figure signals strong commercial momentum.&#039; },&lt;br /&gt;
      { key: &#039;roi&#039;, label: &#039;Return on inforce&#039;,   val: 1328,  min: 0,     max: 3000,  step: 50, color: &#039;#378ADD&#039;,&lt;br /&gt;
        explain: &#039;Sometimes called the &amp;quot;unwind of discount rate&amp;quot;, this is the interest accretion on the opening CSM balance. Because future cash flows were discounted at inception, the passage of time increases their present value. Think of it as the CSM earning a return simply by getting one year closer to settlement.&#039; },&lt;br /&gt;
      { key: &#039;rel&#039;, label: &#039;CSM release&#039;,          val: -2954, min: -5000, max: 0,     step: 50, color: &#039;#D85A30&#039;,&lt;br /&gt;
        explain: &#039;The portion of CSM released to the income statement as profit in the period. Under IFRS 17, profit is recognised as services are delivered to policyholders \u2014 so this is the primary mechanism that turns the CSM balance into reported earnings. It is always negative in the rollforward because it reduces the remaining stock of unearned profit.&#039; },&lt;br /&gt;
      { key: &#039;eco&#039;, label: &#039;Economic variance&#039;,    val: 594,   min: -2000, max: 2000,  step: 50, color: &#039;#534AB7&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM caused by movements in financial assumptions \u2014 interest rates, equity markets, credit spreads, and foreign exchange. Under the Variable Fee Approach (VFA), changes in the insurer\u2019s share of underlying asset returns adjust the CSM rather than hitting P&amp;amp;L directly. Positive values mean financial conditions improved for the insurer.&#039; },&lt;br /&gt;
      { key: &#039;opv&#039;, label: &#039;Operating variance&#039;,   val: -316,  min: -2000, max: 2000,  step: 50, color: &#039;#D4537E&#039;,&lt;br /&gt;
        explain: &#039;Changes in the CSM driven by updates to non-financial (operating) assumptions \u2014 mortality, morbidity, lapse rates, and expenses. When actual experience or updated projections differ from what was assumed at inception, the CSM absorbs the difference. Negative means experience or updated assumptions were worse than expected.&#039; },&lt;br /&gt;
      { key: &#039;oth&#039;, label: &#039;Other&#039;,                val: -1451, min: -3000, max: 1000,  step: 50, color: &#039;#888780&#039;,&lt;br /&gt;
        explain: &#039;A catch-all for items such as foreign exchange translation effects on non-euro subsidiaries, scope changes (acquisitions or disposals of portfolios), model or methodology changes, and any other adjustments that don\u2019t fit neatly into the categories above.&#039; }&lt;br /&gt;
    ];&lt;br /&gt;
    var FY24 = 33853;&lt;br /&gt;
    var TOTAL_COLOR = &#039;#3266ad&#039;;&lt;br /&gt;
    var TOTALS_EXPLAIN = &#039;The opening (FY24) and closing (FY25) CSM balance represents the total stock of unearned profit the insurer expects to recognise in future periods. The rollforward reconciles how the balance moved from one year-end to the next through the components shown above.&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Live values ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var vals = {};&lt;br /&gt;
    ITEMS.forEach( function ( it ) { vals[it.key] = it.val; } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return ( v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039; ) + &#039;\u20AC&#039; + Math.abs( Math.round( v ) ).toLocaleString() + &#039;m&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (grid / axis) ──────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text&#039; ).trim()          || &#039;#202122&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider grid */&lt;br /&gt;
    var sliderGrid = wix.el( &#039;div&#039;, { className: &#039;wix-csm-sliders&#039; } );&lt;br /&gt;
    var sliderRefs = {};&lt;br /&gt;
    var valRefs    = {};&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      var sl = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: String( it.min ), max: String( it.max ),&lt;br /&gt;
                                    step: String( it.step ), value: String( it.val ) } );&lt;br /&gt;
      var vl = wix.el( &#039;span&#039;, { className: &#039;wix-csm-slider-val&#039;, textContent: it.val.toLocaleString() } );&lt;br /&gt;
      sliderRefs[it.key] = sl;&lt;br /&gt;
      valRefs[it.key]    = vl;&lt;br /&gt;
&lt;br /&gt;
      sliderGrid.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-group&#039; }, [&lt;br /&gt;
        wix.el( &#039;label&#039;, { textContent: it.label } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-csm-slider-row&#039; }, [ sl, vl ] )&lt;br /&gt;
      ] ) );&lt;br /&gt;
    } );&lt;br /&gt;
    wrapper.appendChild( sliderGrid );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var chartWrap = wix.el( &#039;div&#039;, { className: &#039;wix-csm-chart&#039; }, [ canvas ] );&lt;br /&gt;
    wrapper.appendChild( chartWrap );&lt;br /&gt;
&lt;br /&gt;
    /* Explainer */&lt;br /&gt;
    var exDot   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-dot&#039; } );&lt;br /&gt;
    var exTitle = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-title&#039; } );&lt;br /&gt;
    var exVal   = wix.el( &#039;span&#039;, { className: &#039;wix-csm-ex-val&#039; } );&lt;br /&gt;
    var exBody  = wix.el( &#039;p&#039;,    { className: &#039;wix-csm-ex-body&#039; } );&lt;br /&gt;
    var explainer = wix.el( &#039;div&#039;, { className: &#039;wix-csm-explainer wix-csm-explainer--hidden&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-csm-ex-head&#039; }, [ exDot, exTitle, exVal ] ),&lt;br /&gt;
      exBody&lt;br /&gt;
    ] );&lt;br /&gt;
    wrapper.appendChild( explainer );&lt;br /&gt;
&lt;br /&gt;
    /* Hint */&lt;br /&gt;
    var hint = wix.el( &#039;p&#039;, { className: &#039;wix-csm-hint&#039;, textContent: &#039;Click any bar for an explanation of that component.&#039; } );&lt;br /&gt;
    wrapper.appendChild( hint );&lt;br /&gt;
&lt;br /&gt;
    /* ── Waterfall data ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function getRows() {&lt;br /&gt;
      var rows = [];&lt;br /&gt;
      rows.push( { label: &#039;FY24&#039;, val: FY24, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      var running = FY24;&lt;br /&gt;
      ITEMS.forEach( function ( it ) {&lt;br /&gt;
        var v = vals[it.key];&lt;br /&gt;
        rows.push( { label: it.label, val: v, color: it.color, base: v &amp;gt;= 0 ? running : running + v } );&lt;br /&gt;
        running += v;&lt;br /&gt;
      } );&lt;br /&gt;
      rows.push( { label: &#039;FY25&#039;, val: running, color: TOTAL_COLOR, isTotal: true } );&lt;br /&gt;
      return rows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit regions for click ───────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var hitBoxes = [];&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var rows = getRows();&lt;br /&gt;
      var numBars = rows.length;&lt;br /&gt;
&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = chartWrap.getBoundingClientRect();&lt;br /&gt;
      var W    = rect.width;&lt;br /&gt;
      if ( W === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      var BAR_H   = 38;&lt;br /&gt;
      var GAP     = 10;&lt;br /&gt;
      var totalH  = numBars * ( BAR_H + GAP ) + 40;&lt;br /&gt;
      chartWrap.style.height = totalH + &#039;px&#039;;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = totalH * dpr;&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
      ctx.clearRect( 0, 0, W, totalH );&lt;br /&gt;
&lt;br /&gt;
      /* Compute axis range */&lt;br /&gt;
      var allVals = rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base;&lt;br /&gt;
      } );&lt;br /&gt;
      allVals = allVals.concat( rows.map( function ( r ) {&lt;br /&gt;
        if ( r.isTotal ) return r.val;&lt;br /&gt;
        return r.base + Math.abs( r.val );&lt;br /&gt;
      } ) );&lt;br /&gt;
      var dataMax = Math.max.apply( null, allVals ) * 1.12;&lt;br /&gt;
      var dataMin = 0;&lt;br /&gt;
&lt;br /&gt;
      var padL = 130, padR = 16, padT = 6, padB = 30;&lt;br /&gt;
      var cw = W - padL - padR;&lt;br /&gt;
&lt;br /&gt;
      function tx( v ) { return padL + ( v - dataMin ) / ( dataMax - dataMin ) * cw; }&lt;br /&gt;
&lt;br /&gt;
      /* Grid lines */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      var step = 5000;&lt;br /&gt;
      if ( dataMax &amp;gt; 50000 ) step = 10000;&lt;br /&gt;
      if ( dataMax &amp;lt; 15000 ) step = 2000;&lt;br /&gt;
      for ( var g = 0; g &amp;lt;= dataMax; g += step ) {&lt;br /&gt;
        var gx = tx( g );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( gx, padT ); ctx.lineTo( gx, totalH - padB ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.fillText( fmt( g ), gx, totalH - padB + 16 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Bars */&lt;br /&gt;
      hitBoxes = [];&lt;br /&gt;
      rows.forEach( function ( r, i ) {&lt;br /&gt;
        var y = padT + i * ( BAR_H + GAP );&lt;br /&gt;
        var barBase = r.isTotal ? 0 : r.base;&lt;br /&gt;
        var barVal  = r.isTotal ? r.val : Math.abs( r.val );&lt;br /&gt;
        var x0 = tx( barBase );&lt;br /&gt;
        var x1 = tx( barBase + barVal );&lt;br /&gt;
        var bw = Math.max( x1 - x0, 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Row label */&lt;br /&gt;
        ctx.fillStyle = colorText;&lt;br /&gt;
        ctx.font = &#039;12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        ctx.fillText( r.label, padL - 10, y + BAR_H / 2 );&lt;br /&gt;
&lt;br /&gt;
        /* Bar */&lt;br /&gt;
        ctx.fillStyle = r.color;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.roundRect( x0, y, bw, BAR_H, 3 );&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
&lt;br /&gt;
        /* Value label on bar */&lt;br /&gt;
        var valText = fmt( r.isTotal ? r.val : r.val );&lt;br /&gt;
        ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
        ctx.font = &#039;500 11px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( bw &amp;gt; 60 ) {&lt;br /&gt;
          ctx.fillText( valText, x0 + bw / 2, y + BAR_H / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.fillStyle = r.color;&lt;br /&gt;
          ctx.textAlign = &#039;left&#039;;&lt;br /&gt;
          ctx.fillText( valText, x0 + bw + 4, y + BAR_H / 2 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Connector line to next row */&lt;br /&gt;
        if ( !r.isTotal &amp;amp;&amp;amp; i &amp;lt; rows.length - 1 ) {&lt;br /&gt;
          var endX = tx( barBase + ( r.val &amp;gt;= 0 ? Math.abs( r.val ) : 0 ) );&lt;br /&gt;
          ctx.strokeStyle = colorGrid;&lt;br /&gt;
          ctx.lineWidth = 1;&lt;br /&gt;
          ctx.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx.beginPath();&lt;br /&gt;
          ctx.moveTo( endX, y + BAR_H );&lt;br /&gt;
          ctx.lineTo( endX, y + BAR_H + GAP );&lt;br /&gt;
          ctx.stroke();&lt;br /&gt;
          ctx.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Hit box */&lt;br /&gt;
        hitBoxes.push( { x: x0, y: y, w: bw, h: BAR_H, idx: i } );&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Click → explainer ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var mx   = ( e.clientX - rect.left );&lt;br /&gt;
      var my   = ( e.clientY - rect.top );&lt;br /&gt;
&lt;br /&gt;
      for ( var i = 0; i &amp;lt; hitBoxes.length; i++ ) {&lt;br /&gt;
        var b = hitBoxes[i];&lt;br /&gt;
        if ( mx &amp;gt;= b.x &amp;amp;&amp;amp; mx &amp;lt;= b.x + b.w &amp;amp;&amp;amp; my &amp;gt;= b.y &amp;amp;&amp;amp; my &amp;lt;= b.y + b.h ) {&lt;br /&gt;
          var idx = b.idx;&lt;br /&gt;
          if ( idx === 0 || idx === ITEMS.length + 1 ) {&lt;br /&gt;
            exDot.style.background = TOTAL_COLOR;&lt;br /&gt;
            exTitle.textContent = idx === 0 ? &#039;FY24 opening balance&#039; : &#039;FY25 closing balance&#039;;&lt;br /&gt;
            exVal.textContent   = idx === 0 ? fmt( FY24 ) : fmt( getRows()[ITEMS.length + 1].val );&lt;br /&gt;
            exBody.textContent  = TOTALS_EXPLAIN;&lt;br /&gt;
          } else {&lt;br /&gt;
            var item = ITEMS[idx - 1];&lt;br /&gt;
            exDot.style.background = item.color;&lt;br /&gt;
            exTitle.textContent    = item.label;&lt;br /&gt;
            exVal.textContent      = fmt( vals[item.key] );&lt;br /&gt;
            exBody.textContent     = item.explain;&lt;br /&gt;
          }&lt;br /&gt;
          explainer.className = &#039;wix-csm-explainer&#039;;&lt;br /&gt;
          hint.style.display  = &#039;none&#039;;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Slider events ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    ITEMS.forEach( function ( it ) {&lt;br /&gt;
      sliderRefs[it.key].addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
        vals[it.key] = Number( sliderRefs[it.key].value );&lt;br /&gt;
        valRefs[it.key].textContent = vals[it.key].toLocaleString();&lt;br /&gt;
        draw();&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* ── Resize ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_initial_recognition&amp;diff=23001</id>
		<title>Internal:Training/IFRS17/The general model: initial recognition</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_general_model:_initial_recognition&amp;diff=23001"/>
		<updated>2026-04-06T16:32:15Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how to group [[Definition:Insurance contract|insurance contracts]] into [[Definition:Portfolio|portfolios]], [[Definition:Profitability group|profitability groups]], and [[Definition:Annual cohort|annual cohorts]] so that each group can be measured separately. Now we put that knowledge to work: for each group, you need to measure the [[Definition:Insurance contract liability|liability]] on day one. This page shows you exactly how.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* How to measure the four [[Definition:Building block|building blocks]] at the moment an [[Definition:Insurance contract|insurance contract]] group is first recognised on the [[Definition:Balance sheet|balance sheet]].&lt;br /&gt;
* What happens when the expected [[Definition:Cash flow|cash flows]] indicate a profitable group, and how the [[Definition:Contractual service margin|contractual service margin]] stores that unearned [[Definition:Profit|profit]].&lt;br /&gt;
* What happens when the numbers indicate an [[Definition:Onerous contract|onerous]] group, why the [[Definition:Contractual service margin|CSM]] cannot go below zero, and how the [[Definition:Loss|loss]] is recognised immediately.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Day one: measuring the four building blocks ==&lt;br /&gt;
&lt;br /&gt;
📅 &#039;&#039;&#039;The moment of truth.&#039;&#039;&#039; [[Definition:Initial recognition|Initial recognition]] is the first time an [[Definition:Insurance contract|insurance contract]] group appears on the [[Definition:Insurer|insurer&#039;s]] [[Definition:Balance sheet|balance sheet]]. Under the [[Definition:General model|general model]] of [[Definition:IFRS 17|IFRS 17]], this happens at the earliest of three dates: when the [[Definition:Coverage period|coverage period]] begins, when the first [[Definition:Premium|premium]] payment from the [[Definition:Policyholder|policyholder]] is due, or, for an [[Definition:Onerous contract|onerous]] group, the moment the insurer determines the group is onerous. Think of it like a stopwatch: once any of these triggers fires, the clock starts and the insurer must record the group on its books.&lt;br /&gt;
&lt;br /&gt;
🧱 &#039;&#039;&#039;Building the measurement, piece by piece.&#039;&#039;&#039; At that trigger date, the insurer calculates each of the four [[Definition:Building block|building blocks]] you have already studied. First, it estimates all [[Definition:Future cash flows|future cash flows]], which are the [[Definition:Probability-weighted estimate|probability-weighted]] [[Definition:Cash inflow|cash inflows]] (mainly [[Definition:Premium|premiums]]) and [[Definition:Cash outflow|cash outflows]] (mainly [[Definition:Claim|claims]] and [[Definition:Expense|expenses]]) expected over the life of the contracts. Second, it [[Definition:Discounting|discounts]] those cash flows to [[Definition:Present value|present value]] using an appropriate [[Definition:Discount rate|discount rate]]. Third, it adds a [[Definition:Risk adjustment|risk adjustment]] for non-financial risk to reflect the compensation the insurer requires for bearing the uncertainty in those cash flows. These three pieces together form the [[Definition:Fulfilment cash flows|fulfilment cash flows]]: the amount the insurer believes it will need to fulfil its promises.&lt;br /&gt;
&lt;br /&gt;
🔢 &#039;&#039;&#039;Putting numbers to the idea.&#039;&#039;&#039; Imagine AXA writes a group of 10,000 one-year [[Definition:Home insurance|home insurance]] contracts in Belgium, each charging a [[Definition:Premium|premium]] of €300. The total expected [[Definition:Cash inflow|premium inflow]] is €3,000,000. After estimating expected [[Definition:Claim|claims]], [[Definition:Acquisition cost|acquisition costs]], and [[Definition:Maintenance cost|maintenance expenses]], suppose the [[Definition:Present value|present value]] of all [[Definition:Future cash flows|future cash outflows]] is €2,600,000 and the [[Definition:Risk adjustment|risk adjustment]] is €120,000. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] are the sum of the [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash flows]] (outflows minus inflows) and the [[Definition:Risk adjustment|risk adjustment]]. The fourth and final [[Definition:Building block|building block]], the [[Definition:Contractual service margin|contractual service margin]], is then set to exactly offset the [[Definition:Fulfilment cash flows|fulfilment cash flows]], so that no [[Definition:Profit|profit]] or [[Definition:Loss|loss]] appears in the [[Definition:Income statement|income statement]] on day one. In this example, the [[Definition:Contractual service margin|CSM]] would be €280,000, representing the unearned profit the insurer expects to make.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Many learners assume that [[Definition:Initial recognition|initial recognition]] always happens when the [[Definition:Policyholder|policyholder]] signs the contract. In reality, the trigger can come earlier: if [[Definition:Premium|premiums]] are due before coverage starts, or if the group is identified as [[Definition:Onerous contract|onerous]] before either of those dates, recognition kicks in at that earlier point. The signature date matters for legal purposes, but [[Definition:IFRS 17|IFRS 17]] cares about economic substance, not paperwork.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the four [[Definition:Building block|building blocks]] are designed so that the [[Definition:Balance sheet|balance sheet]] shows no profit on day one, what happens when the numbers suggest the group will actually be profitable? Where does that future [[Definition:Profit|profit]] go?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Profitable contracts: CSM is positive ==&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Locking away the profit.&#039;&#039;&#039; When the [[Definition:Present value|present value]] of expected [[Definition:Cash inflow|inflows]] exceeds the [[Definition:Present value|present value]] of expected [[Definition:Cash outflow|outflows]] plus the [[Definition:Risk adjustment|risk adjustment]], the group is considered profitable. In that case, the [[Definition:Contractual service margin|contractual service margin]] is set to a positive amount that exactly offsets the day-one gain. The logic is simple: the insurer has not yet done anything for the [[Definition:Policyholder|policyholders]]; it has not settled a single [[Definition:Claim|claim]] or provided a single day of [[Definition:Coverage period|coverage]]. Recognising [[Definition:Profit|profit]] before delivering the service would be misleading, so [[Definition:IFRS 17|IFRS 17]] requires the insurer to store that expected profit in the [[Definition:Contractual service margin|CSM]] and release it gradually as service is provided.&lt;br /&gt;
&lt;br /&gt;
🏠 &#039;&#039;&#039;Seeing it in action.&#039;&#039;&#039; Return to the Belgian [[Definition:Home insurance|home insurance]] example. The [[Definition:Present value|present value]] of [[Definition:Cash inflow|premium inflows]] is €3,000,000. The [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash outflows]] is €2,600,000, and the [[Definition:Risk adjustment|risk adjustment]] is €120,000. The net [[Definition:Future cash flows|future cash flows]] (outflows minus inflows, in present-value terms) equal negative €400,000, meaning the group expects to receive €400,000 more than it expects to pay out. After adding the [[Definition:Risk adjustment|risk adjustment]] of €120,000, the [[Definition:Fulfilment cash flows|fulfilment cash flows]] amount to negative €280,000, indicating an expected gain of €280,000. The [[Definition:Contractual service margin|CSM]] is set at exactly €280,000, making the total [[Definition:Insurance contract liability|liability]] on the [[Definition:Balance sheet|balance sheet]] equal to zero initial [[Definition:Profit|profit]].&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;The balance sheet on day one.&#039;&#039;&#039; At [[Definition:Initial recognition|initial recognition]], the [[Definition:Insurance contract liability|insurance contract liability]] for this group equals the sum of two components: the [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|CSM]]. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] themselves consist of the [[Definition:Present value|present value]] of [[Definition:Future cash flows|future cash flows]] (outflows minus inflows) plus the [[Definition:Risk adjustment|risk adjustment]]. For the Belgian example, that total is €2,600,000 (outflows) − €3,000,000 (inflows) + €120,000 ([[Definition:Risk adjustment|RA]]) + €280,000 ([[Definition:Contractual service margin|CSM]]) = €0 net. In practice, the liability is not literally zero because the insurer typically records the [[Definition:Premium|premiums]] received as a [[Definition:Cash inflow|cash asset]] on the other side. The point is that no [[Definition:Profit|profit]] or [[Definition:Loss|loss]] hits the [[Definition:Income statement|income statement]]. The [[Definition:Contractual service margin|CSM]] acts like a reservoir: it holds the expected profit until the insurer earns it by delivering [[Definition:Coverage period|coverage]] over time.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that a larger [[Definition:Contractual service margin|CSM]] is always better. While a large CSM signals high expected [[Definition:Profit|profitability]], it also means the insurer cannot recognise that [[Definition:Profit|profit]] immediately. The CSM must be released over the [[Definition:Coverage period|coverage period]] through [[Definition:Coverage unit|coverage units]], so a very large CSM on a long-duration contract means profit appears slowly. Profitability on the [[Definition:Income statement|income statement]] depends on the pattern of release, not just the size of the pool.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; We have seen what happens when the numbers work in the insurer&#039;s favour. But what if the expected [[Definition:Cash outflow|outflows]] and [[Definition:Risk adjustment|risk adjustment]] exceed the expected [[Definition:Cash inflow|inflows]]? Can the [[Definition:Contractual service margin|CSM]] go negative?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Onerous contracts: CSM is zero, loss recognized immediately ==&lt;br /&gt;
&lt;br /&gt;
🚨 &#039;&#039;&#039;When the maths turns negative.&#039;&#039;&#039; Sometimes the expected [[Definition:Cash outflow|outflows]] plus the [[Definition:Risk adjustment|risk adjustment]] exceed the expected [[Definition:Cash inflow|inflows]], even before the insurer provides any [[Definition:Coverage period|coverage]]. In this situation, there is no expected [[Definition:Profit|profit]] to store; instead, the group is expected to make a [[Definition:Loss|loss]]. Under [[Definition:IFRS 17|IFRS 17]], the [[Definition:Contractual service margin|CSM]] cannot be negative. It is floored at zero because the CSM represents unearned profit, and you cannot have negative unearned profit. The shortfall, the amount by which the [[Definition:Fulfilment cash flows|fulfilment cash flows]] exceed zero, must be recognised as a [[Definition:Loss|loss]] in the [[Definition:Income statement|income statement]] immediately at [[Definition:Initial recognition|initial recognition]].&lt;br /&gt;
&lt;br /&gt;
🌊 &#039;&#039;&#039;A concrete scenario.&#039;&#039;&#039; Suppose an insurer like AXA launches a [[Definition:Property insurance|property insurance]] product for 5,000 homes along the Atlantic coast in Brittany, France. Each [[Definition:Policyholder|policyholder]] pays a [[Definition:Premium|premium]] of €250, giving total expected [[Definition:Cash inflow|inflows]] of €1,250,000 in [[Definition:Present value|present value]] terms. However, updated [[Definition:Climate risk|climate models]] forecast a severe storm season, pushing the [[Definition:Present value|present value]] of expected [[Definition:Claim|claims]] and [[Definition:Expense|expenses]] to €1,300,000. The [[Definition:Risk adjustment|risk adjustment]] adds another €80,000, reflecting the high uncertainty around coastal storm damage. The [[Definition:Fulfilment cash flows|fulfilment cash flows]] are €1,300,000 − €1,250,000 + €80,000 = €130,000. Since this is positive (meaning the insurer expects to pay out more than it receives), the [[Definition:Contractual service margin|CSM]] cannot absorb the shortfall and is set to zero. The insurer recognises the €130,000 as a [[Definition:Loss|loss]] on day one. This [[Definition:Loss|loss]] appears in the [[Definition:Income statement|income statement]] as part of [[Definition:Insurance service expense|insurance service expenses]].&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners believe that identifying a group as [[Definition:Onerous contract|onerous]] means the insurer made a pricing mistake. That is not necessarily true. A group may become onerous because of a change in conditions after pricing, such as new weather data or an unexpected regulatory cost. Additionally, remember that [[Definition:Grouping contracts|grouping rules]] require separating contracts expected to be [[Definition:Onerous contract|onerous]] from those expected to be [[Definition:Profitable contract|profitable]]. Even if the [[Definition:Portfolio|portfolio]] as a whole is profitable, the onerous subgroup must reveal its [[Definition:Loss|losses]] separately, preventing profitable contracts from masking problems.&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Why immediate recognition matters.&#039;&#039;&#039; The rationale behind this asymmetry, where gains are deferred but [[Definition:Loss|losses]] are recognised immediately, is rooted in the accounting principle of [[Definition:Prudence|prudence]]. Investors and regulators want early warning when an insurer faces expected [[Definition:Loss|losses]]. If the insurer could hide the shortfall inside a negative [[Definition:Contractual service margin|CSM]] and spread it over years, the [[Definition:Financial statement|financial statements]] would paint a misleadingly rosy picture. By forcing immediate [[Definition:Loss|loss]] recognition, [[Definition:IFRS 17|IFRS 17]] ensures that bad news reaches stakeholders as soon as the insurer itself knows about it. This makes the [[Definition:Balance sheet|balance sheet]] a more honest snapshot of the insurer&#039;s obligations and helps maintain trust in [[Definition:Financial reporting|financial reporting]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* At [[Definition:Initial recognition|initial recognition]], the insurer measures all four [[Definition:Building block|building blocks]] (estimates of [[Definition:Future cash flows|future cash flows]], [[Definition:Discounting|discounting]], [[Definition:Risk adjustment|risk adjustment]], and [[Definition:Contractual service margin|CSM]]) and records the [[Definition:Insurance contract liability|liability]] on the [[Definition:Balance sheet|balance sheet]], with the [[Definition:Contractual service margin|CSM]] set so that no [[Definition:Profit|profit]] appears on day one. The first three building blocks together form the [[Definition:Fulfilment cash flows|fulfilment cash flows]].&lt;br /&gt;
* For profitable groups, the [[Definition:Contractual service margin|CSM]] stores the expected gain as unearned [[Definition:Profit|profit]], to be released gradually as the insurer delivers [[Definition:Coverage period|coverage]].&lt;br /&gt;
* For [[Definition:Onerous contract|onerous]] groups, the [[Definition:Contractual service margin|CSM]] is floored at zero and the expected [[Definition:Loss|loss]] is recognised immediately in the [[Definition:Income statement|income statement]], reflecting the accounting principle of [[Definition:Prudence|prudence]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The general model: initial recognition/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23000</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=23000"/>
		<updated>2026-04-06T15:09:47Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   - &amp;quot;grouping-funnel&amp;quot;   3-step IFRS 17 contract grouping walkthrough&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment,&lt;br /&gt;
    &#039;grouping-funnel&#039;:      initGroupingFunnel&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
     3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initGroupingFunnel( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Step data ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var labels = [&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 1 \u2014 Portfolio:&amp;lt;/b&amp;gt; group contracts with similar risks managed together&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 2 \u2014 Profitability:&amp;lt;/b&amp;gt; separate onerous from profitable at initial recognition&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;Step 3 \u2014 Annual cohort:&amp;lt;/b&amp;gt; contracts issued more than 12\u00A0months apart cannot mix&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var counts = [&lt;br /&gt;
      &#039;AXA writes &amp;lt;b&amp;gt;5,000&amp;lt;/b&amp;gt; home insurance contracts in coastal Brittany \u2014 plus a separate motor book in Spain&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;3 groups&amp;lt;/b&amp;gt; within the Brittany portfolio based on expected profitability&#039;,&lt;br /&gt;
      &#039;&amp;lt;b&amp;gt;6 measurement groups&amp;lt;/b&amp;gt; \u2014 each profitability bucket split into 2025 and 2026 cohorts&#039;&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var step = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Progress steps */&lt;br /&gt;
    var stepEls = [];&lt;br /&gt;
    for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
      stepEls.push( wix.el( &#039;div&#039;, { className: &#039;wix-gf-step&#039; } ) );&lt;br /&gt;
    }&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-steps&#039; }, stepEls ) );&lt;br /&gt;
&lt;br /&gt;
    /* Label */&lt;br /&gt;
    var labelEl = wix.el( &#039;p&#039;, { className: &#039;wix-gf-label&#039; } );&lt;br /&gt;
    wrapper.appendChild( labelEl );&lt;br /&gt;
&lt;br /&gt;
    /* Visual area */&lt;br /&gt;
    var visualEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-visual&#039; } );&lt;br /&gt;
    wrapper.appendChild( visualEl );&lt;br /&gt;
&lt;br /&gt;
    /* Count box */&lt;br /&gt;
    var countEl = wix.el( &#039;div&#039;, { className: &#039;wix-gf-count&#039; } );&lt;br /&gt;
    wrapper.appendChild( countEl );&lt;br /&gt;
&lt;br /&gt;
    /* Nav buttons */&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, innerHTML: &#039;\u25C2 Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, innerHTML: &#039;Next \u25B8&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function makeSeg( flex, bg, text, textColor, extra ) {&lt;br /&gt;
      var s = wix.el( &#039;div&#039;, { className: &#039;wix-gf-seg&#039; } );&lt;br /&gt;
      s.style.flex = flex;&lt;br /&gt;
      s.style.background = bg;&lt;br /&gt;
      s.style.color = textColor;&lt;br /&gt;
      s.textContent = text;&lt;br /&gt;
      if ( extra ) {&lt;br /&gt;
        Object.keys( extra ).forEach( function ( k ) { s.style[k] = extra[k]; } );&lt;br /&gt;
      }&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeBarRow( label, segments, groupLabel ) {&lt;br /&gt;
      var bar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar&#039; }, segments );&lt;br /&gt;
      var children = [&lt;br /&gt;
        wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: label } ),&lt;br /&gt;
        bar&lt;br /&gt;
      ];&lt;br /&gt;
      if ( groupLabel ) {&lt;br /&gt;
        children.push( wix.el( &#039;p&#039;, { className: &#039;wix-gf-group-label&#039;, textContent: groupLabel } ) );&lt;br /&gt;
      }&lt;br /&gt;
      return wix.el( &#039;div&#039;, { className: &#039;wix-gf-bar-row&#039; }, children );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      /* Progress dots */&lt;br /&gt;
      for ( var i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
        stepEls[i].className = &#039;wix-gf-step&#039; + ( i &amp;lt;= step ? &#039; wix-gf-step--done&#039; : &#039;&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Label + count */&lt;br /&gt;
      labelEl.innerHTML  = labels[step];&lt;br /&gt;
      countEl.innerHTML  = counts[step];&lt;br /&gt;
&lt;br /&gt;
      /* Nav state */&lt;br /&gt;
      btnPrev.disabled = step === 0;&lt;br /&gt;
      btnNext.disabled = step === 2;&lt;br /&gt;
&lt;br /&gt;
      /* Visual */&lt;br /&gt;
      wix.empty( visualEl );&lt;br /&gt;
&lt;br /&gt;
      if ( step === 0 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [ makeSeg( 5000, &#039;#EEEDFE&#039;, &#039;5,000 contracts&#039;, &#039;#3C3489&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 1 \u2014 same weather risks, same underwriting team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;8px&#039; } } ) );&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;3,000 contracts&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          &#039;Portfolio 2 \u2014 different risk drivers, different team&#039;&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 1 ) {&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Home insurance \u2014 Brittany, France&#039;,&lt;br /&gt;
          [&lt;br /&gt;
            makeSeg( 4200, &#039;#E1F5EE&#039;, &#039;4,200 profitable&#039;, &#039;#085041&#039; ),&lt;br /&gt;
            makeSeg( 500,  &#039;#FAEEDA&#039;, &#039;500 borderline&#039;,   &#039;#633806&#039; ),&lt;br /&gt;
            makeSeg( 300,  &#039;#FCEBEB&#039;, &#039;300 onerous&#039;,      &#039;#791F1F&#039; )&lt;br /&gt;
          ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
&lt;br /&gt;
        /* Annotation row */&lt;br /&gt;
        var annotData = [&lt;br /&gt;
          { flex: 4200, text: &#039;CSM stores profit&#039;, color: &#039;#0F6E56&#039; },&lt;br /&gt;
          { flex: 500,  text: &#039;Monitor&#039;,           color: &#039;#854F0B&#039; },&lt;br /&gt;
          { flex: 300,  text: &#039;Loss recognised&#039;,   color: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var annotChildren = [];&lt;br /&gt;
        annotData.forEach( function ( a ) {&lt;br /&gt;
          var item = wix.el( &#039;div&#039;, {&lt;br /&gt;
            className: &#039;wix-gf-annot-item&#039;,&lt;br /&gt;
            textContent: a.text&lt;br /&gt;
          } );&lt;br /&gt;
          item.style.flex  = a.flex;&lt;br /&gt;
          item.style.color = a.color;&lt;br /&gt;
          return annotChildren.push( item );&lt;br /&gt;
        } );&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-annot&#039; }, annotChildren ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;div&#039;, { style: { height: &#039;12px&#039; } } ) );&lt;br /&gt;
&lt;br /&gt;
        visualEl.appendChild( makeBarRow(&lt;br /&gt;
          &#039;Motor third-party liability \u2014 Spain&#039;,&lt;br /&gt;
          [ makeSeg( 3000, &#039;#F1EFE8&#039;, &#039;Separate portfolio \u2014 own profitability split&#039;, &#039;#5F5E5A&#039; ) ],&lt;br /&gt;
          null&lt;br /&gt;
        ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( step === 2 ) {&lt;br /&gt;
        visualEl.appendChild( wix.el( &#039;p&#039;, { className: &#039;wix-gf-bar-label&#039;, textContent: &#039;Home insurance \u2014 Brittany, France&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
        var rows = [&lt;br /&gt;
          { n: 4200, label: &#039;Profitable&#039;, bg: &#039;#E1F5EE&#039;, tc: &#039;#085041&#039;, sub: &#039;#0F6E56&#039; },&lt;br /&gt;
          { n: 500,  label: &#039;Borderline&#039;, bg: &#039;#FAEEDA&#039;, tc: &#039;#633806&#039;, sub: &#039;#854F0B&#039; },&lt;br /&gt;
          { n: 300,  label: &#039;Onerous&#039;,    bg: &#039;#FCEBEB&#039;, tc: &#039;#791F1F&#039;, sub: &#039;#A32D2D&#039; }&lt;br /&gt;
        ];&lt;br /&gt;
        var maxN = 4200;&lt;br /&gt;
&lt;br /&gt;
        rows.forEach( function ( r ) {&lt;br /&gt;
          var a = Math.round( r.n * 0.55 );&lt;br /&gt;
          var b = r.n - a;&lt;br /&gt;
&lt;br /&gt;
          var cohortBar = wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-bar&#039; } );&lt;br /&gt;
          cohortBar.style.maxWidth = Math.round( r.n / maxN * 100 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
          cohortBar.appendChild( makeSeg( a, r.bg, a.toLocaleString() + &#039; (2025)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
          cohortBar.appendChild( makeSeg( b, r.bg, b.toLocaleString() + &#039; (2026)&#039;, r.tc,&lt;br /&gt;
            { height: &#039;36px&#039;, opacity: &#039;0.6&#039;, border: &#039;0.5px solid &#039; + r.sub } ) );&lt;br /&gt;
&lt;br /&gt;
          visualEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-gf-cohort-row&#039; }, [&lt;br /&gt;
            wix.el( &#039;span&#039;, { className: &#039;wix-gf-cohort-label&#039;, textContent: r.label } ),&lt;br /&gt;
            cohortBar&lt;br /&gt;
          ] ) );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;gt; 0 ) { step--; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( step &amp;lt; 2 ) { step++; render(); }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22999</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22999"/>
		<updated>2026-04-06T15:09:30Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   GROUPING FUNNEL — data-wix-module=&amp;quot;grouping-funnel&amp;quot;&lt;br /&gt;
   3-step walkthrough: portfolio → profitability → annual cohort.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 56. Progress Steps ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-steps {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 4px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  height: 4px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
  transition: background var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-step--done {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 57. Step Label ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 1.5rem;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-label b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 58. Visual Area ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-visual {&lt;br /&gt;
  min-height: 200px;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 59. Bar Rows ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-row {&lt;br /&gt;
  margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  height: 40px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-group-label {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin: 2px 0 0 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 60. Annotation Row (under profitability bar) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  margin: 4px 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-annot-item {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 61. Cohort Rows (step 3) ───────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
  margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-label {&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 75px;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-bar {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 3px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-cohort-seg {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  font-weight: 500;&lt;br /&gt;
  height: 36px;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  transition: all 0.4s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 62. Count Box ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.85rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-gf-count b {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 63. Navigation Buttons ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-gf-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-gf-cohort-label {&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/Grouping_contracts&amp;diff=22998</id>
		<title>Internal:Training/IFRS17/Grouping contracts</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/Grouping_contracts&amp;diff=22998"/>
		<updated>2026-04-06T15:09:15Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:Contractual service margin|contractual service margin]] locks away unearned [[Definition:Profit|profit]] on day one and releases it over the [[Definition:Coverage period|coverage period]] as the insurer delivers service. Now we build on that by asking a crucial upstream question: which contracts should be measured together in the first place?&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* How insurers organise contracts into [[Definition:Portfolio|portfolios]] based on similar [[Definition:Risk|risks]] managed together&lt;br /&gt;
* Why IFRS 17 requires contracts to be separated into profitability groups, and what happens when a group is [[Definition:Onerous contract|onerous]]&lt;br /&gt;
* Why contracts issued more than one year apart must sit in different [[Definition:Annual cohort|annual cohorts]], even if they are otherwise identical&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Portfolios: contracts with similar risks ==&lt;br /&gt;
&lt;br /&gt;
📂 &#039;&#039;&#039;Starting with the big picture.&#039;&#039;&#039; Before an insurer like AXA can measure any [[Definition:Insurance contract|insurance contract]] under [[Definition:IFRS 17|IFRS 17]], it must first decide which contracts belong together. The standard requires insurers to sort contracts into [[Definition:Portfolio|portfolios]], where a portfolio is a collection of contracts that share similar [[Definition:Risk|risks]] and are managed together as a single pool. Think of it the way a library organises books: you would not shelve a novel about Mediterranean cooking next to a textbook on quantum physics. In the same way, a motor [[Definition:Insurance policy|policy]] in Germany and a property [[Definition:Insurance policy|policy]] in Belgium face fundamentally different risks and are overseen by different underwriting teams, so they belong in separate portfolios.&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;What &amp;quot;similar risks&amp;quot; means in practice.&#039;&#039;&#039; Two contracts share similar risks when they are exposed to the same type of peril and would be expected to respond to the same economic and demographic drivers. For example, 10,000 home insurance contracts covering storm damage along the Atlantic coast of France would typically form one portfolio because they all respond to the same weather patterns, construction standards, and [[Definition:Claims|claims]] behaviour. A separate block of motor third-party [[Definition:Liability|liability]] contracts in Spain would form a different portfolio, because the risk drivers, such as traffic density, legal [[Definition:Claims costs|claims costs]], and repair inflation, are entirely different. The practical test is straightforward: if the contracts are managed together by the same team under the same pricing and [[Definition:Reserving|reserving]] approach, they almost certainly belong in the same portfolio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;grouping-funnel&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A portfolio is not the same as a [[Definition:Line of business|line of business]]. Many insurers manage &amp;quot;property&amp;quot; as a single line of business, but within that line there could be several portfolios: one for residential property, another for commercial property, and perhaps a third for agricultural buildings. The portfolio is a finer grouping, defined by the similarity of risks, not by the organisational chart. Always look at the underlying risk characteristics, not the label on the department door.&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;Why portfolios matter.&#039;&#039;&#039; Portfolios are the first layer of structure, but they are not the final one. Within each portfolio, IFRS 17 demands further subdivision. The portfolio merely sets the outer boundary: contracts from different portfolios can never be combined, no matter how profitable or unprofitable they are. Getting this first grouping right is essential because every subsequent calculation, from [[Definition:Fulfilment cash flows|fulfilment cash flows]] to the [[Definition:Contractual service margin|CSM]], is performed at the group level, and the group always sits inside a single portfolio.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If all contracts in a portfolio shared similar risks, you might wonder why the standard does not simply measure the entire portfolio as one unit. What further distinction could matter? The answer lies in profitability, and that is exactly what the next section explores.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Profitability groups: separating profitable from onerous ==&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Not all contracts earn money.&#039;&#039;&#039; Once contracts have been sorted into portfolios, IFRS 17 requires a second layer of sorting based on expected [[Definition:Profitability|profitability]] at the date of [[Definition:Initial recognition|initial recognition]]. The standard defines three profitability buckets that every portfolio must be split into. The first bucket contains contracts that are [[Definition:Onerous contract|onerous]] at initial recognition, meaning the insurer expects to make a loss on them from the very start. The second bucket holds contracts that, at initial recognition, have no significant possibility of becoming onerous later. The third bucket captures everything in between: contracts that are profitable today but carry a meaningful chance of turning onerous as experience unfolds.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;A concrete example.&#039;&#039;&#039; Imagine AXA writes 5,000 home insurance contracts in a coastal region of Brittany. After analysing the expected [[Definition:Claims|claims]], [[Definition:Expenses|expenses]], and [[Definition:Risk adjustment|risk adjustment]], the actuarial team concludes that 4,200 of these contracts are comfortably profitable, 500 are profitable but sit in areas with rising flood exposure and could turn loss-making if climate trends worsen, and 300 are already expected to generate a net loss because they cover properties in a zone recently reclassified as high risk. IFRS 17 insists that these three groups are measured separately. The 4,200 profitable contracts form one group, the 500 borderline contracts form another, and the 300 onerous contracts form a third.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some people assume that the three profitability buckets are optional or that an insurer can simply average profitable and [[Definition:Onerous contract|onerous]] contracts within a portfolio. This is expressly forbidden. The whole point of the split is to prevent profitable contracts from hiding losses on onerous ones. If the 300 loss-making contracts in Brittany were blended with the 4,200 profitable ones, the resulting [[Definition:Contractual service margin|CSM]] would mask a real economic loss. IFRS 17 forces transparency: losses on onerous groups must be recognised immediately in the [[Definition:Income statement|income statement]], while profit on healthy groups is stored in the CSM and released over time.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Why the middle bucket exists.&#039;&#039;&#039; The intermediate group, contracts with a significant possibility of becoming onerous, exists because [[Definition:Uncertainty|uncertainty]] is inherent in insurance. A contract can look profitable today and deteriorate tomorrow if [[Definition:Claims|claims]] inflation accelerates or a new court ruling increases [[Definition:Liability|liability]] awards. By isolating these borderline contracts, the standard ensures that if they do turn onerous, the loss is recognised promptly rather than being diluted across a larger, healthy group. In practice, identifying this middle group requires [[Definition:Actuarial judgment|actuarial judgment]]; the standard does not prescribe a precise threshold, so insurers must develop and document their own methodology.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; You now know that contracts must be grouped by portfolio and then by profitability. But what about timing? Should a contract written in January sit alongside an identical contract written the following January? The answer may surprise you, and it is the subject of the next section.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Annual cohorts: why contracts issued more than a year apart must be separated ==&lt;br /&gt;
&lt;br /&gt;
📅 &#039;&#039;&#039;Time as a dividing line.&#039;&#039;&#039; Even after splitting contracts by portfolio and profitability, IFRS 17 adds one more requirement: contracts issued more than twelve months apart cannot belong to the same group. This is the [[Definition:Annual cohort|annual cohort]] rule. In practical terms, it means that if an insurer writes motor policies continuously throughout 2025, all those policies form one cohort. Policies written in 2026, even if they cover the same risks in the same region at the same price, must go into a separate cohort. The cohort is defined by the year of [[Definition:Initial recognition|initial recognition]], not by the [[Definition:Coverage period|coverage period]] or the [[Definition:Renewal|renewal]] date.&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;The logic behind the rule.&#039;&#039;&#039; The annual cohort requirement exists to preserve the integrity of [[Definition:Profit|profit]] reporting over time. Without it, an insurer could keep adding new, profitable contracts to an existing group indefinitely, and those fresh [[Definition:Premium|premiums]] would continuously replenish the [[Definition:Contractual service margin|CSM]], making it impossible for investors and regulators to see whether older business is performing as expected. By locking each cohort after twelve months, the standard ensures that the CSM for the 2025 cohort reflects only the experience of 2025 contracts. If [[Definition:Claims|claims]] turn out worse than anticipated for those contracts, the CSM shrinks or the group becomes [[Definition:Onerous contract|onerous]], and that information is visible rather than obscured by newer, healthier business.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent objection to the annual cohort rule is that it is impractical for long-duration contracts such as [[Definition:Life insurance|life insurance]] or [[Definition:Disability insurance|disability insurance]], where policies may run for 20 or 30 years. Critics argue that maintaining separate cohorts for each issue year creates dozens of groups and enormous operational complexity. While the operational burden is real, and it was one of the most debated aspects of IFRS 17 during its development, the standard does require it. Some jurisdictions have discussed modifications, but the principle remains: mixing issue years would undermine the comparability and transparency that IFRS 17 was designed to achieve.&lt;br /&gt;
&lt;br /&gt;
🧩 &#039;&#039;&#039;Putting it all together.&#039;&#039;&#039; The full grouping hierarchy works in three steps. First, sort contracts into portfolios by similar risk. Second, within each portfolio, split contracts into the three profitability buckets. Third, within each profitability bucket, create a separate group for each annual cohort. The result is a set of granular measurement groups, each containing contracts that share the same risk profile, a similar profitability outlook, and roughly the same issue date. Every subsequent calculation under IFRS 17, from the [[Definition:Fulfilment cash flows|fulfilment cash flows]] and [[Definition:Discount rate|discount rate]] to the [[Definition:Risk adjustment|risk adjustment]] and [[Definition:Contractual service margin|CSM]], is performed at this group level. For an insurer operating across multiple countries, like AXA, the number of groups can run into the hundreds or even thousands, which is why robust data systems and clear governance are essential.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* A [[Definition:Portfolio|portfolio]] groups contracts with similar [[Definition:Risk|risks]] managed together; it is the outer boundary that can never be crossed when forming measurement groups.&lt;br /&gt;
* Within each portfolio, contracts must be separated into three profitability buckets ([[Definition:Onerous contract|onerous]], at risk of becoming onerous, and remaining), preventing profitable business from masking losses.&lt;br /&gt;
* The [[Definition:Annual cohort|annual cohort]] rule requires contracts issued more than twelve months apart to sit in different groups, ensuring that [[Definition:Profit|profit]] patterns for each generation of business remain transparent over time.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/Grouping contracts/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_contractual_service_margin&amp;diff=22997</id>
		<title>Internal:Training/IFRS17/The contractual service margin</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_contractual_service_margin&amp;diff=22997"/>
		<updated>2026-04-06T14:53:48Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how the [[Definition:Risk adjustment|risk adjustment]] compensates the insurer for bearing uncertainty, and how it releases gradually as risk expires. Now we turn to the final building block, the one that captures the profit the insurer expects to earn from a group of contracts: the contractual service margin.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* What the contractual service margin represents and why IFRS 17 locks expected profit away on the first day of a contract rather than recognising it immediately.&lt;br /&gt;
* How the CSM acts as a buffer that absorbs changes in estimates about future service, preventing those changes from creating artificial swings in [[Definition:Profit or loss|profit or loss]].&lt;br /&gt;
* How the CSM releases into [[Definition:Revenue|revenue]] over time through a mechanism called [[Definition:Coverage units|coverage units]], and why the pattern of release matters.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== What the CSM represents: unearned profit locked away on day one ==&lt;br /&gt;
&lt;br /&gt;
🔒 &#039;&#039;&#039;Profit you have not yet earned.&#039;&#039;&#039; Imagine AXA writes a portfolio of five-year [[Definition:Life insurance|life insurance]] contracts in France. On the day those contracts are signed, the insurer can already calculate that it expects to collect more in [[Definition:Premium|premiums]] and [[Definition:Investment income|investment income]] than it expects to pay in [[Definition:Claims|claims]], [[Definition:Expenses|expenses]], and the [[Definition:Risk adjustment|risk adjustment]]. That surplus, the expected profit, is the contractual service margin, commonly abbreviated as CSM. Under IFRS 17, this profit is not reported in the [[Definition:Income statement|income statement]] on day one. Instead, it is recorded as a [[Definition:Liability|liability]] on the [[Definition:Balance sheet|balance sheet]], effectively locked away until the insurer actually delivers the promised [[Definition:Coverage|coverage]]. The logic is simple: you cannot claim to have earned profit for a service you have not yet provided.&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;Why it is a liability.&#039;&#039;&#039; At first glance, calling expected profit a liability may seem strange. A liability normally represents something you owe, not something positive. But the CSM reflects an obligation to provide future service. Think of it like a contractor who receives payment before building a house: the money is in the bank, but the contractor owes the client a finished building. Until the work is done, that payment is a liability, not revenue. In the same way, the CSM sits on the balance sheet as a reminder that the insurer has collected premiums for service it still needs to deliver. Each period that passes and coverage is provided, a portion of the CSM moves from the balance sheet into the income statement as earned [[Definition:Revenue|revenue]].&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume the CSM is cash set aside in a separate account. It is not. The CSM is a purely accounting construct, a number within the [[Definition:Insurance contract liability|insurance contract liability]] that tracks how much unearned profit remains. No money is physically ring-fenced. The cash from premiums is invested alongside all other assets. The CSM simply tells you how much of the total liability represents future profit rather than future obligations to pay claims.&lt;br /&gt;
&lt;br /&gt;
💡 &#039;&#039;&#039;What happens when there is no profit.&#039;&#039;&#039; Not every group of contracts is expected to be profitable. If the insurer&#039;s best estimate of future outflows (including the [[Definition:Risk adjustment|risk adjustment]]) exceeds the expected inflows, there is no surplus to lock away. In that case, the CSM is set to zero, and the expected loss is recognised immediately in the [[Definition:Income statement|income statement]]. IFRS 17 is deliberately asymmetric here: expected profits are deferred and released over time, but expected losses hit the accounts right away. This protects users of [[Definition:Financial statements|financial statements]] from being misled by a balance sheet that hides known losses behind future hopes.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; Once the CSM is set on day one, what happens if reality turns out differently from the original assumptions? If claims are expected to be lower than first thought, does the insurer immediately book extra profit, or does something else happen?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the CSM absorbs changes in estimates ==&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;Estimates change constantly.&#039;&#039;&#039; Insurance is a business of long-term promises and uncertain outcomes. The assumptions made when a contract is first written, about [[Definition:Claims frequency|claim frequency]], average [[Definition:Claims severity|claim severity]], [[Definition:Lapse rate|lapse rates]], [[Definition:Expenses|expenses]], and more, will almost certainly prove imperfect over time. New data arrives, trends shift, and the insurer revises its [[Definition:Fulfilment cash flows|fulfilment cash flows]] at every [[Definition:Reporting date|reporting date]]. Under IFRS 17, the way these revisions flow through the accounts depends on a critical distinction: do the revised assumptions relate to future service that the insurer has not yet delivered, or to current and past service already provided?&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;The CSM as a buffer for future service.&#039;&#039;&#039; When a change in estimates relates to future service, it adjusts the CSM rather than hitting the [[Definition:Income statement|income statement]]. Consider a portfolio of [[Definition:Home insurance|home insurance]] contracts in Belgium. Suppose at the end of year one the insurer revises its assumptions and now expects fewer [[Definition:Claims|claims]] than originally projected for the remaining coverage period. This improvement means the contracts are more profitable than initially thought. Rather than booking that windfall as an immediate gain, IFRS 17 requires the insurer to increase the CSM. The extra profit is stored on the [[Definition:Balance sheet|balance sheet]] and released gradually as coverage continues. The reverse also applies: if revised assumptions indicate higher future claims, the CSM decreases. As long as the CSM remains positive, the income statement is shielded from these estimate changes.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent error is believing that the CSM can absorb all changes in estimates, regardless of direction or magnitude. In fact, the CSM cannot go below zero. If unfavourable changes exceed the remaining CSM, the excess is recognised immediately as a loss in the [[Definition:Income statement|income statement]]. At that point, the group of contracts has become [[Definition:Onerous contract|onerous]], meaning the insurer now expects to lose money. Once onerous, any further deterioration also goes directly to profit or loss. The CSM is a one-way floor at zero: it can absorb bad news only up to the point where expected profit runs out.&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;A concrete illustration.&#039;&#039;&#039; Imagine AXA holds a group of five-year [[Definition:Employers&#039; liability insurance|employers&#039; liability]] contracts in Germany with an initial CSM of €5 million. At the end of year one, updated [[Definition:Claims|claims]] data suggests that future claims will be €2 million lower than expected. The CSM rises to €7 million (before any release). At the end of year two, however, a new court ruling on [[Definition:Bodily injury|bodily injury]] compensation increases expected future claims by €9 million. The CSM, which stood at roughly €7 million before release, cannot absorb the full €9 million. It drops to zero, and the remaining shortfall, approximately €2 million, flows straight into the income statement as a loss. This example shows the CSM acting as a shock absorber: it smooths out moderate swings, but it cannot hide genuine losses.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; The CSM stores unearned profit and releases it as coverage is provided. But how does the insurer decide how much to release each period? If a five-year contract provides more coverage in some years than others, should the release be equal each year, or should it follow the pattern of service?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the CSM releases into revenue: coverage units ==&lt;br /&gt;
&lt;br /&gt;
📏 &#039;&#039;&#039;Matching profit to service.&#039;&#039;&#039; The CSM does not sit on the [[Definition:Balance sheet|balance sheet]] forever. Each reporting period, a portion is released into the [[Definition:Income statement|income statement]] as part of [[Definition:Insurance revenue|insurance revenue]]. The amount released must reflect the service the insurer has provided during that period relative to the total service it expects to provide over the remaining life of the contracts. IFRS 17 operationalises this through a concept called [[Definition:Coverage units|coverage units]]. A coverage unit is a measure of the quantity of service delivered to [[Definition:Policyholders|policyholders]] in a given period. The insurer defines what a coverage unit means for each group of contracts, then uses those units to allocate the CSM across periods.&lt;br /&gt;
&lt;br /&gt;
🏠 &#039;&#039;&#039;A simple example.&#039;&#039;&#039; Take a group of 2,000 [[Definition:Home insurance|home insurance]] policies in Spain, each providing one year of [[Definition:Coverage|coverage]]. If coverage is uniform across the year, each policy contributes one coverage unit per quarter. At the start of the year, the group has 2,000 × 4 = 8,000 total coverage units. In the first quarter, 2,000 units are provided, which is 25% of the total. So 25% of the CSM is released into revenue for that quarter. If 100 policies lapse at the end of the first quarter, the remaining coverage units drop: only 1,900 policies contribute for the remaining three quarters. The insurer recalculates the allocation based on the updated total, ensuring the release pattern always reflects the actual service delivered.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to assume that coverage units are always based on the passage of time, resulting in a straight-line release. This is often the case for simple annual [[Definition:Property insurance|property]] or [[Definition:Motor insurance|motor]] policies, but it is not a universal rule. For contracts where the level of service varies over time, for example a [[Definition:Life insurance|life insurance]] policy where the [[Definition:Sum insured|sum insured]] decreases each year as the policyholder ages, coverage units should reflect that changing level of service. A policy with a higher sum insured in early years provides more coverage per period than one with a lower sum insured later. The release pattern must follow the service, not simply the calendar.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Why the pattern matters.&#039;&#039;&#039; The choice of coverage units directly shapes the timing of [[Definition:Profit|profit]] recognition. If coverage units are defined too aggressively early on, the insurer front-loads profit. If they are spread too evenly when risk is concentrated in later years, profit appears later than the economic reality warrants. Getting the pattern right ensures that the [[Definition:Income statement|income statement]] faithfully represents when the insurer is actually providing value to [[Definition:Policyholders|policyholders]]. This is the heart of IFRS 17&#039;s philosophy: profit should emerge as service is delivered, not before and not after. Every reporting period, the balance sheet shows the unearned profit still to come, and the income statement shows the profit justly attributable to the period that has passed.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* The CSM captures the expected profit from a group of [[Definition:Insurance contract|insurance contracts]] and holds it on the [[Definition:Balance sheet|balance sheet]] as a [[Definition:Liability|liability]] until the service is delivered; if a group is expected to be loss-making, the loss is recognised immediately instead.&lt;br /&gt;
* Changes in estimates that relate to future service adjust the CSM rather than the [[Definition:Income statement|income statement]], but the CSM cannot fall below zero: once it is exhausted, further adverse changes are recognised as losses immediately.&lt;br /&gt;
* The CSM releases into [[Definition:Revenue|revenue]] each period in proportion to [[Definition:Coverage units|coverage units]], ensuring that profit recognition follows the pattern of service provided to [[Definition:Policyholders|policyholders]] rather than the timing of cash received.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The contractual service margin/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_risk_adjustment&amp;diff=22996</id>
		<title>Internal:Training/IFRS17/The risk adjustment</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_risk_adjustment&amp;diff=22996"/>
		<updated>2026-04-06T14:50:19Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how [[Definition:Discounting|discounting]] converts future [[Definition:Cash flows|cash flows]] into their [[Definition:Present value|present value]], reflecting the [[Definition:Time value of money|time value of money]]. Now we build on that by turning to the next building block: the amount an insurer adds to its [[Definition:Liability|liability]] to compensate for the fact that those future cash flows are uncertain.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* What the [[Definition:Risk adjustment|risk adjustment]] represents and why it is a necessary part of the insurance liability under [[Definition:IFRS 17|IFRS 17]].&lt;br /&gt;
* How the risk adjustment can be measured using techniques such as [[Definition:Confidence level|confidence levels]], [[Definition:Cost of capital|cost of capital]], and [[Definition:Value at risk|Value at Risk]].&lt;br /&gt;
* How the risk adjustment decreases over time as [[Definition:Risk|risk]] expires, and how that release flows into the [[Definition:Income statement|income statement]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== What the risk adjustment represents ==&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;The price of uncertainty.&#039;&#039;&#039; When you learned about [[Definition:Fulfilment cash flows|fulfilment cash flows]], you saw that insurers estimate the [[Definition:Probability-weighted estimate|probability-weighted]] average of all future cash flows. That average is the best estimate of what will happen, but it is still just an estimate. Actual outcomes could be better or worse. The risk adjustment is the explicit amount an insurer recognises on top of the best estimate to reflect the compensation it demands for bearing that uncertainty. Think of it this way: if two jobs paid the same salary but one involved perfectly predictable work and the other involved constant surprises and potential crises, you would want extra pay for the unpredictable one. The risk adjustment is that extra pay, expressed as a component of the insurance liability.&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;An insurer&#039;s perspective.&#039;&#039;&#039; Consider AXA insuring 3,000 homes along the coast of Brittany against storm damage. The [[Definition:Actuaries|actuaries]] estimate that the probability-weighted average cost of [[Definition:Claims|claims]] over the next year is €6 million. But storms are volatile: in a mild year, claims might total only €2 million, while a severe season could push them to €15 million. The €6 million best estimate captures the average, yet it says nothing about how uncomfortable that volatility makes the insurer. The risk adjustment adds an explicit margin, say €1.2 million, to acknowledge that the insurer is exposed to outcomes far worse than average. This margin is not a hidden buffer or a secret reserve. It is reported separately on the [[Definition:Balance sheet|balance sheet]], visible to [[Definition:Investors|investors]], [[Definition:Regulators|regulators]], and management alike.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;risk-adjustment&amp;quot;&amp;gt;&lt;br /&gt;
  Loading&amp;amp;hellip;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners often confuse the risk adjustment with a [[Definition:Prudential margin|prudential margin]] designed to make reserves deliberately conservative. The risk adjustment is not about caution for its own sake. It is a principled measure of how much compensation is required for bearing non-financial risk. An insurer with a very stable, predictable portfolio would carry a small risk adjustment, while one exposed to catastrophic [[Definition:Natural disaster|natural disaster]] risk would carry a much larger one. The size reflects the nature of the uncertainty, not a management preference for conservatism.&lt;br /&gt;
&lt;br /&gt;
🔑 &#039;&#039;&#039;Non-financial risk only.&#039;&#039;&#039; An important boundary to note is that the risk adjustment under IFRS 17 covers only [[Definition:Non-financial risk|non-financial risk]], that is, risks arising from the insurance contracts themselves, such as the uncertainty in the timing and amount of claims. It does not cover [[Definition:Financial risk|financial risk]] like changes in [[Definition:Interest rates|interest rates]] or [[Definition:Equity markets|equity markets]]. Financial risk is already handled through discounting and the choice of [[Definition:Discount rate|discount rates]]. By limiting the risk adjustment to non-financial risk, the standard avoids double-counting and keeps each building block focused on a single dimension of uncertainty.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; You now know what the risk adjustment represents, but how does an insurer actually put a number on something as abstract as &amp;quot;the compensation for bearing uncertainty&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How to measure it: confidence levels, cost of capital, VaR ==&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;No single prescribed method.&#039;&#039;&#039; Unlike some elements of IFRS 17 that follow strict rules, the standard does not mandate a single technique for measuring the risk adjustment. Instead, it sets a principle: the risk adjustment should reflect the compensation the insurer requires for bearing non-financial risk. How an insurer translates that principle into a number is a matter of judgement, but the standard does require the insurer to disclose the [[Definition:Confidence level|confidence level]] to which the risk adjustment corresponds. In practice, three techniques dominate the industry, and understanding each one gives you a well-rounded view of how the calculation works.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Confidence level approach.&#039;&#039;&#039; The most intuitive technique is the confidence level approach. It asks: at what probability threshold do we want to be confident that our reserves will be sufficient? Suppose an insurer&#039;s actuaries model the full distribution of possible outcomes for a group of [[Definition:Property insurance|property insurance]] contracts in Belgium. The best estimate sits at the 50th [[Definition:Percentile|percentile]], the point where outcomes are equally likely to be better or worse. If the insurer sets the risk adjustment at the 75th percentile, it is saying: &amp;quot;We want to hold enough to cover outcomes up to the 75th percentile of severity.&amp;quot; The risk adjustment is then the difference between the 75th percentile and the 50th percentile. A higher confidence level means a larger risk adjustment and a more cautious stance. Most European insurers using this method target a confidence level somewhere between 65% and 85%, depending on the volatility of their portfolio.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is easy to assume that a 75% confidence level means the insurer expects to have enough reserves 75% of the time and will fall short 25% of the time. While that is the statistical interpretation, it does not mean the insurer is planning to fail one year in four. The confidence level is a calibration tool for sizing the risk adjustment, not a prediction of how often reserves will be insufficient. In reality, insurers manage their risk actively through [[Definition:Reinsurance|reinsurance]], [[Definition:Diversification|diversification]], and ongoing monitoring, so the actual experience of insufficiency is far rarer.&lt;br /&gt;
&lt;br /&gt;
💼 &#039;&#039;&#039;Cost of capital approach.&#039;&#039;&#039; A second common method is the [[Definition:Cost of capital|cost of capital]] approach. This technique starts from a different angle: instead of asking &amp;quot;what percentile do we want to cover?&amp;quot;, it asks &amp;quot;how much capital must we hold to support these risks, and what return does that capital require?&amp;quot; The insurer calculates the [[Definition:Regulatory capital|regulatory]] or [[Definition:Economic capital|economic capital]] needed to back the insurance risks, then applies a target rate of return to that capital over the remaining lifetime of the contracts. The risk adjustment equals the present value of that required return. For example, if a portfolio requires €20 million in capital and the target return is 6% per year over three remaining years, the risk adjustment would be the discounted value of €1.2 million per year. This method is popular among insurers who already perform detailed [[Definition:Capital modelling|capital modelling]] for [[Definition:Solvency II|Solvency II]] or internal purposes, because it leverages existing infrastructure.&lt;br /&gt;
&lt;br /&gt;
📈 &#039;&#039;&#039;Value at Risk and other quantile methods.&#039;&#039;&#039; The third approach is [[Definition:Value at risk|Value at Risk]], or VaR, and its relatives such as [[Definition:Tail Value at Risk|Tail Value at Risk]] (TVaR). VaR identifies the loss threshold at a given confidence level: for instance, a 99.5% VaR says &amp;quot;there is only a 0.5% chance that losses will exceed this amount.&amp;quot; The risk adjustment can be set as the difference between the VaR at the chosen confidence level and the best estimate. TVaR goes further by averaging all outcomes beyond the VaR threshold, capturing the severity of the tail. These methods are familiar to [[Definition:Risk management|risk management]] teams and can be powerful for portfolios exposed to [[Definition:Catastrophe risk|catastrophe risk]], where the tail of the distribution matters enormously. Regardless of which technique an insurer chooses, IFRS 17 requires disclosure of the equivalent confidence level so that readers can compare risk adjustments across companies.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; Now that you know how the risk adjustment is measured at inception, what happens to it as time passes and the insurer&#039;s exposure to risk decreases?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the risk adjustment releases as risk expires ==&lt;br /&gt;
&lt;br /&gt;
⏳ &#039;&#039;&#039;Risk diminishes over time.&#039;&#039;&#039; An insurance contract does not carry the same level of uncertainty from the day it is written to the day it expires. As time passes, some risks simply disappear. Policies reach the end of their [[Definition:Coverage period|coverage period]], claims are reported and settled, and what was once unknown gradually becomes known. Because the risk adjustment reflects compensation for bearing uncertainty, it must decrease as that uncertainty fades. Under IFRS 17, the reduction in the risk adjustment is recognised in the income statement as part of [[Definition:Insurance revenue|insurance revenue]], rewarding the insurer for having successfully borne the risk during the period.&lt;br /&gt;
&lt;br /&gt;
🏠 &#039;&#039;&#039;A concrete example.&#039;&#039;&#039; Imagine a group of one-year household insurance contracts written in Spain on 1 January, with a total risk adjustment of €3 million at inception. By 30 June, half the coverage period has elapsed. Many of the risks the insurer worried about in January have either materialised as claims or passed without incident. The remaining uncertainty is smaller, and the risk adjustment might now stand at €1.4 million. The €1.6 million reduction flows into the income statement as revenue for the first half of the year. By 31 December, when the contracts expire, virtually all uncertainty has been resolved, and the risk adjustment approaches zero. Each slice of release represents a period in which the insurer bore risk and is now being compensated for it.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners expect the risk adjustment to release in a perfectly even, straight-line pattern over the coverage period. In practice, the release pattern should reflect the actual expiry of risk, which is not always uniform. If a portfolio of contracts covers a region where storm risk is concentrated in the autumn months, more risk adjustment should release during and after the storm season than during the calm summer months. The release follows the risk, not the calendar.&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Connecting to the bigger picture.&#039;&#039;&#039; The release of the risk adjustment works alongside the other building blocks you have already studied. As [[Definition:Fulfilment cash flows|fulfilment cash flows]] are updated and [[Definition:Discounting|discounting]] unwinds over time, the risk adjustment release adds a third layer of movement in the [[Definition:Liability|liability]]. Together, these movements tell a rich, transparent story on the income statement: how much [[Definition:Revenue|revenue]] came from the passage of time, how much from bearing risk, and how much from delivering [[Definition:Insurance coverage|coverage]]. In the next page, you will meet the fourth and final building block, the [[Definition:Contractual service margin|contractual service margin]], and see how the entire framework comes together to determine when and how profit appears in the insurer&#039;s results.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* The risk adjustment is the explicit compensation an insurer recognises for bearing the uncertainty that actual cash flows may differ from the best estimate; it covers non-financial risk only and is disclosed separately on the balance sheet.&lt;br /&gt;
* There is no single mandated measurement technique: insurers may use confidence levels, cost of capital, Value at Risk, or other methods, but must always disclose the equivalent confidence level so that readers can compare across companies.&lt;br /&gt;
* As risk expires over time, the risk adjustment decreases and the reduction is recognised as insurance revenue, following the pattern in which risk actually diminishes rather than a simple straight-line allocation.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The risk adjustment/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=22995</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=22995"/>
		<updated>2026-04-06T14:48:41Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   - &amp;quot;risk-adjustment&amp;quot;   Brittany storm confidence-level risk adjustment chart&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet,&lt;br /&gt;
    &#039;risk-adjustment&#039;:      initRiskAdjustment&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 12;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var totalW  = colW * 2 + colGap + bracketZone;&lt;br /&gt;
      var padL    = Math.max( 10, ( W - totalW ) / 2 );&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
     Brittany storm: lognormal claim distribution with interactive&lt;br /&gt;
     confidence slider. Shows best estimate, percentile threshold,&lt;br /&gt;
     and the risk adjustment gap on a PDF chart.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initRiskAdjustment( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MU   = 1.7118;&lt;br /&gt;
    var SIG  = 0.40;&lt;br /&gt;
    var MEAN = 6.0;&lt;br /&gt;
    var XMIN = 1, XMAX = 18, STEPS = 400;&lt;br /&gt;
&lt;br /&gt;
    /* ── Math helpers ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function lognormPDF( x ) {&lt;br /&gt;
      if ( x &amp;lt;= 0 ) return 0;&lt;br /&gt;
      var lx = Math.log( x );&lt;br /&gt;
      return Math.exp( -0.5 * Math.pow( ( lx - MU ) / SIG, 2 ) ) /&lt;br /&gt;
             ( x * SIG * Math.sqrt( 2 * Math.PI ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function ratApprox( t ) {&lt;br /&gt;
      var c = [ 2.515517, 0.802853, 0.010328 ];&lt;br /&gt;
      var d = [ 1.432788, 0.189269, 0.001308 ];&lt;br /&gt;
      return t - ( c[0] + c[1]*t + c[2]*t*t ) /&lt;br /&gt;
                 ( 1 + d[0]*t + d[1]*t*t + d[2]*t*t*t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function normInv( p ) {&lt;br /&gt;
      if ( p &amp;lt;= 0 ) return -Infinity;&lt;br /&gt;
      if ( p &amp;gt;= 1 ) return Infinity;&lt;br /&gt;
      if ( p &amp;lt; 0.5 ) return -ratApprox( Math.sqrt( -2 * Math.log( p ) ) );&lt;br /&gt;
      if ( p &amp;gt; 0.5 ) return  ratApprox( Math.sqrt( -2 * Math.log( 1 - p ) ) );&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function lognormCDFInv( p ) {&lt;br /&gt;
      return Math.exp( MU + SIG * normInv( p ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (from WIX tokens) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAccent = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorWarn   = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var slider    = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;50&#039;, max: &#039;95&#039;, value: &#039;75&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;,  { className: &#039;wix-ra-slider-val&#039;, textContent: &#039;75%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var elBE  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC6.0m&#039; } );&lt;br /&gt;
    var elPct = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val&#039;, textContent: &#039;\u20AC7.2m&#039; } );&lt;br /&gt;
    var elRA  = wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-val wix-ra-stat-val--accent&#039;, textContent: &#039;\u20AC1.2m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var canvas  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var explain = wix.el( &#039;p&#039;, { className: &#039;wix-ra-explain&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    /* Slider row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-slider-label&#039;, textContent: &#039;Confidence level&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Stats row */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Best estimate&#039; } ),&lt;br /&gt;
        elBE&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Covered up to&#039; } ),&lt;br /&gt;
        elPct&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-ra-stat-label&#039;, textContent: &#039;Risk adjustment&#039; } ),&lt;br /&gt;
        elRA&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Chart */&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Legend */&lt;br /&gt;
    function swatch( color ) {&lt;br /&gt;
      return wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-swatch&#039;, style: { background: color } } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-ra-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent + &#039;40&#039; ), &#039;Claim distribution&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorAccent ), &#039;Best estimate (mean)&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-ra-legend-item&#039; }, [&lt;br /&gt;
        swatch( colorWarn ), &#039;Confidence threshold&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    /* Explanation */&lt;br /&gt;
    wrapper.appendChild( explain );&lt;br /&gt;
&lt;br /&gt;
    /* ── Drawing ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) return;&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width  * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var W = rect.width, H = rect.height;&lt;br /&gt;
      var pad = { t: 16, r: 16, b: 36, l: 44 };&lt;br /&gt;
      var cw = W - pad.l - pad.r;&lt;br /&gt;
      var ch = H - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, W, H );&lt;br /&gt;
&lt;br /&gt;
      /* Compute PDF curve */&lt;br /&gt;
      var xs = [], ys = [], ymax = 0;&lt;br /&gt;
      for ( var i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        var x = XMIN + ( XMAX - XMIN ) * i / STEPS;&lt;br /&gt;
        var y = lognormPDF( x );&lt;br /&gt;
        xs.push( x ); ys.push( y );&lt;br /&gt;
        if ( y &amp;gt; ymax ) ymax = y;&lt;br /&gt;
      }&lt;br /&gt;
      ymax *= 1.1;&lt;br /&gt;
&lt;br /&gt;
      function tx( x ) { return pad.l + ( x - XMIN ) / ( XMAX - XMIN ) * cw; }&lt;br /&gt;
      function ty( y ) { return pad.t + ch - ( y / ymax ) * ch; }&lt;br /&gt;
&lt;br /&gt;
      var conf = parseInt( slider.value, 10 );&lt;br /&gt;
      var pctX = lognormCDFInv( conf / 100 );&lt;br /&gt;
&lt;br /&gt;
      /* Axes */&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t + ch ); ctx.lineTo( pad.l + cw, pad.t + ch ); ctx.stroke();&lt;br /&gt;
      ctx.beginPath(); ctx.moveTo( pad.l, pad.t ); ctx.lineTo( pad.l, pad.t + ch ); ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* X-axis labels */&lt;br /&gt;
      ctx.font = &#039;11px sans-serif&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( var v = 2; v &amp;lt;= 16; v += 2 ) {&lt;br /&gt;
        var xp = tx( v );&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + v + &#039;m&#039;, xp, pad.t + ch + 20 );&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( xp, pad.t + ch ); ctx.lineTo( xp, pad.t + ch + 4 ); ctx.stroke();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Shaded area under curve up to percentile */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( 0 ) );&lt;br /&gt;
      for ( i = 0; i &amp;lt;= STEPS; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;lt;= pctX ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      }&lt;br /&gt;
      var clipIdx = -1;&lt;br /&gt;
      for ( i = 0; i &amp;lt; xs.length; i++ ) {&lt;br /&gt;
        if ( xs[i] &amp;gt; pctX ) { clipIdx = i; break; }&lt;br /&gt;
      }&lt;br /&gt;
      if ( clipIdx &amp;gt; 0 ) {&lt;br /&gt;
        var frac   = ( pctX - xs[clipIdx-1] ) / ( xs[clipIdx] - xs[clipIdx-1] );&lt;br /&gt;
        var yClip  = ys[clipIdx-1] + frac * ( ys[clipIdx] - ys[clipIdx-1] );&lt;br /&gt;
        ctx.lineTo( tx( pctX ), ty( yClip ) );&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = colorAccent + &#039;30&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      /* Full PDF curve */&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( xs[0] ), ty( ys[0] ) );&lt;br /&gt;
      for ( i = 1; i &amp;lt;= STEPS; i++ ) ctx.lineTo( tx( xs[i] ), ty( ys[i] ) );&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Best-estimate (mean) dashed line */&lt;br /&gt;
      ctx.setLineDash( [ 5, 4 ] );&lt;br /&gt;
      ctx.lineWidth = 1.5;&lt;br /&gt;
      ctx.strokeStyle = colorAccent;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( MEAN ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( MEAN ), ty( lognormPDF( MEAN ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      /* Percentile dashed line */&lt;br /&gt;
      ctx.strokeStyle = colorWarn;&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( tx( pctX ), ty( 0 ) );&lt;br /&gt;
      ctx.lineTo( tx( pctX ), ty( lognormPDF( pctX ) ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      /* Risk-adjustment bracket */&lt;br /&gt;
      var raStart = tx( MEAN ), raEnd = tx( pctX );&lt;br /&gt;
      var arrowY  = ty( 0 ) - 18;&lt;br /&gt;
      if ( raEnd - raStart &amp;gt; 20 ) {&lt;br /&gt;
        ctx.strokeStyle = colorWarn;&lt;br /&gt;
        ctx.lineWidth = 1.5;&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY ); ctx.lineTo( raEnd, arrowY ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raStart, arrowY - 4 ); ctx.lineTo( raStart, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.beginPath(); ctx.moveTo( raEnd, arrowY - 4 ); ctx.lineTo( raEnd, arrowY + 4 ); ctx.stroke();&lt;br /&gt;
        ctx.fillStyle = colorWarn;&lt;br /&gt;
        ctx.font = &#039;500 12px sans-serif&#039;;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.fillText( &#039;RA: \u20AC&#039; + ( pctX - MEAN ).toFixed( 1 ) + &#039;m&#039;,&lt;br /&gt;
                       ( raStart + raEnd ) / 2, arrowY - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /* Update stat cards */&lt;br /&gt;
      var ra = pctX - MEAN;&lt;br /&gt;
      sliderVal.textContent = conf + &#039;%&#039;;&lt;br /&gt;
      elPct.textContent     = &#039;\u20AC&#039; + pctX.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
      elRA.textContent      = &#039;\u20AC&#039; + ra.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      /* Update explanation */&lt;br /&gt;
      explain.textContent = conf === 50&lt;br /&gt;
        ? &#039;At the 50% level the threshold equals the best estimate, so the risk adjustment is zero \u2014 the insurer holds no buffer for uncertainty at all.&#039;&lt;br /&gt;
        : &#039;At the &#039; + conf + &#039;% confidence level, the insurer holds enough to cover outcomes up to \u20AC&#039; + pctX.toFixed( 1 ) + &#039;m. The risk adjustment of \u20AC&#039; + ra.toFixed( 1 ) + &#039;m is the gap between that threshold and the \u20AC6.0m best estimate \u2014 the price AXA pays for bearing the uncertainty on 3,000 Brittany homes.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Events ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, draw );&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, draw );&lt;br /&gt;
    draw();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22994</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22994"/>
		<updated>2026-04-06T14:48:29Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RISK ADJUSTMENT — data-wix-module=&amp;quot;risk-adjustment&amp;quot;&lt;br /&gt;
   Brittany storm: lognormal claim distribution with confidence slider.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 51. Confidence Slider Row ──────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.75rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 2.5rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 52. Stat Cards Row ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val {&lt;br /&gt;
  font-size: 1.35em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-stat-val--accent {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 53. Chart Container ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-ra-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 54. Legend Row ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  font-size: 0.8em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-ra-legend-swatch {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 55. Explanation Text ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-ra-explain {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22993</id>
		<title>Internal:Training/IFRS17/The building blocks: overview</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22993"/>
		<updated>2026-04-06T14:48:07Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned that decades of inconsistent national rules made insurance accounting opaque and incomparable, and that [[Definition:IFRS 4|IFRS 4]] was only a temporary compromise. Now we build on that by introducing the framework [[Definition:IFRS 17|IFRS 17]] uses to replace that patchwork: a set of transparent, interlocking building blocks that together form the insurance liability.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* Why IFRS 17 decomposes an insurance [[Definition:Liability|liability]] into separate, visible pieces instead of reporting a single opaque number.&lt;br /&gt;
* What the two main building blocks are, [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]], and the three ingredients that make up fulfilment cash flows: estimates of future cash flows, [[Definition:Discounting|discounting]], and the [[Definition:Risk adjustment|risk adjustment]].&lt;br /&gt;
* How this decomposition solves the transparency, comparability, and timing problems that plagued the old world of insurance accounting.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The idea of decomposing a liability into transparent pieces ==&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;One number hides the story.&#039;&#039;&#039; Under the old rules, many insurers reported their insurance [[Definition:Reserves|reserves]] as a single lump sum on the [[Definition:Balance sheet|balance sheet]]. Imagine you see a line that reads &amp;quot;insurance liabilities: €800 million.&amp;quot; What does that number actually contain? Is it mostly expected future claims? Does it include a cushion for uncertainty? Is there unearned [[Definition:Profit|profit]] buried inside? With a single figure, there is no way to tell. This is the core problem IFRS 17 set out to fix: not just to measure the liability differently, but to break it open so that every reader of the [[Definition:Financial statements|financial statements]] can see exactly what is inside.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;balance-sheet&amp;quot; data-wix-blocks=&#039;[&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Assets&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(market value)&amp;quot;,&amp;quot;val&amp;quot;:1000,&amp;quot;color&amp;quot;:&amp;quot;#C5C3B9&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#B5B3A9&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#333330&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#4F4E4A&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Assets (market value)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The insurer\u2019s investment portfolio: government bonds, corporate bonds, equities, and real estate.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Equity&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;val&amp;quot;:200,&amp;quot;color&amp;quot;:&amp;quot;#CADDF0&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#B5CEE8&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#0C447C&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#185FA5&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Equity (firm\u2019s funds)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Shareholders\u2019 equity \u2014 the residual after subtracting all liabilities from assets.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;CSM&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(contractual service margin)&amp;quot;,&amp;quot;val&amp;quot;:140,&amp;quot;color&amp;quot;:&amp;quot;#DAD8FC&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#C8C5F7&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#3C3489&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#534AB7&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Contractual service margin&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Unearned profit locked away at inception and released gradually as the insurer delivers coverage.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;RA&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(risk adjustment)&amp;quot;,&amp;quot;val&amp;quot;:60,&amp;quot;color&amp;quot;:&amp;quot;#F2D5CC&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#E8C3B7&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#712B13&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#993C1D&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Risk adjustment&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;An explicit allowance for the uncertainty in the cash flow estimates.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;PV FCF&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(present value future cash flows)&amp;quot;,&amp;quot;val&amp;quot;:600,&amp;quot;color&amp;quot;:&amp;quot;#B8E5D5&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#A0D9C5&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#085041&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#0F6E56&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Present value of future cash flows&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The probability-weighted estimate of all future cash flows, discounted to present value.&amp;quot;}&lt;br /&gt;
]&#039;&amp;gt;Loading…&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Transparency through decomposition.&#039;&#039;&#039; Think of it like a nutrition label on a food product. A chocolate bar might weigh 100 grams, but the label tells you how much of that weight is sugar, how much is fat, and how much is protein. Each ingredient serves a different purpose and carries different implications for your health. IFRS 17 applies the same logic to an insurance liability. Instead of one opaque reserve, the standard requires the insurer to show the distinct ingredients that make up the total. Each ingredient answers a different question: how much cash will likely flow out, what is the time value of waiting, how much extra is held for uncertainty, and how much future profit is locked inside? By separating these components, the standard gives [[Definition:Investors|investors]], [[Definition:Regulators|regulators]], and managers a clear view of what drives the liability and how it might change over time.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume that decomposing the liability means creating several entirely separate reserves that sit in different accounts. In reality, the building blocks are components of a single liability figure on the balance sheet. They are disclosed and tracked separately, but they combine to form one total. Think of them as layers of the same structure, not independent buildings.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; You now know that IFRS 17 breaks the liability into pieces, but what exactly are those pieces, and what does each one capture?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The two building blocks and the three ingredients of fulfilment cash flows ==&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;The high-level structure.&#039;&#039;&#039; IFRS 17 splits the insurance liability into two main building blocks: [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]] (CSM). Fulfilment cash flows, in turn, are made up of three ingredients: estimates of future cash flows, a [[Definition:Discounting|discounting]] adjustment, and the [[Definition:Risk adjustment|risk adjustment]]. Understanding this hierarchy matters: discounting and the risk adjustment are not separate building blocks that sit alongside fulfilment cash flows — they live inside fulfilment cash flows.&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Estimates of future cash flows: the best estimate of what will flow in and out.&#039;&#039;&#039; The first ingredient of fulfilment cash flows is the estimate of future cash flows. This asks: considering everything we know today, what [[Definition:Cash flows|cash flows]] do we expect this group of insurance contracts to generate? That includes future [[Definition:Claims|claims]] payments, [[Definition:Expenses|expenses]] the insurer will incur to administer and settle those claims, and the [[Definition:Premiums|premiums]] still expected to come in. The estimate must be [[Definition:Probability-weighted estimate|probability-weighted]], meaning it reflects not just the most likely outcome but the full range of possibilities. For example, if AXA insures 5,000 homes along the Atlantic coast of France, the estimate would capture the average expected cost of storm claims over the remaining [[Definition:Coverage period|coverage period]], considering scenarios ranging from a calm year to a severe winter storm season.&lt;br /&gt;
&lt;br /&gt;
⏳ &#039;&#039;&#039;Discounting: accounting for the time value of money.&#039;&#039;&#039; The second ingredient is [[Definition:Discounting|discounting]]. A euro paid five years from now is worth less than a euro today because of the [[Definition:Time value of money|time value of money]]. Insurance liabilities often stretch years or even decades into the future, especially in [[Definition:Life insurance|life insurance]] or long-tail [[Definition:Liability insurance|liability]] lines. Discounting converts the estimated future cash flows into their [[Definition:Present value|present value]], the amount that, if invested today at an appropriate rate, would grow to meet the future payments. Without discounting, the reported liability would overstate the economic burden on the insurer. For a long-duration contract, the difference between the undiscounted and discounted liability can be substantial.&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;The risk adjustment: a buffer for uncertainty.&#039;&#039;&#039; The third ingredient is the [[Definition:Risk adjustment|risk adjustment]], often abbreviated RA. Even the best estimate of future cash flows is still just an estimate. Actual outcomes could be worse. The risk adjustment is an explicit allowance for the uncertainty inherent in those estimates. It represents the compensation the insurer requires for bearing the risk that actual cash flows may exceed the expected amount. Think of it as the premium for uncertainty itself. If two groups of contracts have the same expected cash flows but one is far more volatile, the riskier group will carry a larger risk adjustment, making its total liability higher.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners sometimes confuse the risk adjustment with a [[Definition:Prudential margin|prudential margin]] or a deliberate overstatement of the liability. The risk adjustment is not about being conservative for its own sake. It is a principled measure of uncertainty: it reflects the price of bearing risk, not a hidden cushion. IFRS 17 requires it to be disclosed separately, precisely so that readers can see how much of the liability relates to genuine uncertainty rather than to expected cash flows.&lt;br /&gt;
&lt;br /&gt;
📦 &#039;&#039;&#039;Putting it together: fulfilment cash flows.&#039;&#039;&#039; The three ingredients above — estimates of future cash flows, discounting, and the risk adjustment — combine to form [[Definition:Fulfilment cash flows|fulfilment cash flows]]. This single figure represents the insurer&#039;s current, risk-adjusted, present-value estimate of what it will cost to fulfil its obligations. It is the most foundational measure in IFRS 17.&lt;br /&gt;
&lt;br /&gt;
🏦 &#039;&#039;&#039;The contractual service margin: profit waiting to be earned.&#039;&#039;&#039; The second main building block is the [[Definition:Contractual service margin|contractual service margin]], or CSM. When an insurer writes a profitable contract, the expected profit is not recognised on day one. Instead, it is captured in the CSM and released gradually into the [[Definition:Income statement|income statement]] as the insurer delivers the promised [[Definition:Insurance coverage|coverage]] over time. To illustrate: suppose an insurer writes a group of five-year contracts and estimates that the present value of future premiums exceeds the present value of expected claims, expenses, and the risk adjustment by €10 million. That €10 million becomes the CSM. Each year, a portion of it is released into [[Definition:Revenue|revenue]], reflecting the service provided during that period. The CSM ensures that profit emerges in step with the delivery of service, not at the moment the contract is signed.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; These components give a detailed, transparent picture of the insurance liability. But how does this new structure actually fix the specific problems of the old world, such as the lack of comparability and the distorted timing of profit?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the building blocks solve the problems of the old world ==&lt;br /&gt;
&lt;br /&gt;
🌐 &#039;&#039;&#039;Solving comparability.&#039;&#039;&#039; One of the most damaging features of the old world was that insurers in different countries, and sometimes even within the same country, used fundamentally different methods to calculate their reserves. As a result, comparing the financial statements of an insurer in Italy with one in Germany was, at best, misleading. IFRS 17&#039;s building blocks impose a single, structured framework that every insurer applying [[Definition:IFRS|IFRS]] must follow. Because the components are standardised and separately disclosed, an analyst can now look at two insurers and compare their cash flow assumptions, their discount rates, their risk adjustments, and their CSMs on a like-for-like basis. The building blocks create the common language that [[Definition:IFRS 4|IFRS 4]] never provided.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Solving transparency.&#039;&#039;&#039; Under the old rules, it was often impossible to tell whether a change in reserves was driven by new claims, a shift in assumptions, a change in discount rates, or the release of hidden margins. The building block approach makes each driver visible. When assumptions about future claims change, the effect shows up in the cash flow estimates. When interest rates move, the impact appears through discounting. When risk expires, the risk adjustment decreases. When profit is earned, the CSM releases. Each movement has a clear home, and each is reported separately. For managers at an insurer like AXA, this granularity means better decision-making. For external stakeholders, it means greater confidence in the numbers.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that IFRS 17 simply adds more disclosure on top of the old measurement. In fact, the building blocks change the measurement itself, not just the presentation. The way the liability is calculated, updated, and released into profit is fundamentally different from the methods used under most previous regimes. More disclosure is a consequence of the new structure, not its purpose.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Solving profit timing.&#039;&#039;&#039; Perhaps the most significant change is how profit is recognised. Under many old approaches, insurers could recognise large profits on day one, when a contract was signed, or defer them in opaque ways that varied from company to company. The CSM eliminates this problem by locking away expected profit at inception and releasing it systematically as the insurer fulfils its obligations. The result is an [[Definition:Income statement|income statement]] that reflects the economics of the business more faithfully: revenue appears when service is delivered, not when cash is collected. Combined with the explicit treatment of uncertainty through the risk adjustment, and the honest reflection of the time value of money through discounting, the building blocks together produce financial statements that are more comparable across borders, more transparent in their drivers, and more aligned with the true economic performance of the insurer. These are the foundations on which the rest of the IFRS 17 standard is built, and in the pages that follow, you will explore each building block in detail.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* IFRS 17 decomposes the insurance liability into two main building blocks: fulfilment cash flows and the contractual service margin, replacing the single opaque reserve of the old world with a structured view that shows investors, regulators, and managers exactly what drives the number.&lt;br /&gt;
* Fulfilment cash flows comprise three ingredients: estimates of future cash flows (probability-weighted), discounting (converting future amounts to present value), and the risk adjustment (an explicit allowance for uncertainty). Together these produce a single current, risk-adjusted, present-value figure.&lt;br /&gt;
* The contractual service margin captures unearned profit and releases it as service is delivered, ensuring faithful profit timing.&lt;br /&gt;
* Together, the building blocks solve the three central problems of the old world: they create comparability through a single global framework, transparency by making each driver of change visible, and faithful profit timing by locking away day-one gains and releasing them over the coverage period.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The building blocks: overview/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22992</id>
		<title>Internal:Training/IFRS17/The building blocks: overview</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22992"/>
		<updated>2026-04-06T14:40:51Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned that decades of inconsistent national rules made insurance accounting opaque and incomparable, and that [[Definition:IFRS 4|IFRS 4]] was only a temporary compromise. Now we build on that by introducing the framework [[Definition:IFRS 17|IFRS 17]] uses to replace that patchwork: a set of transparent, interlocking building blocks that together form the insurance liability.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* Why IFRS 17 decomposes an insurance [[Definition:Liability|liability]] into separate, visible pieces instead of reporting a single opaque number.&lt;br /&gt;
* What the two main building blocks are, [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]], and the three ingredients that make up fulfilment cash flows: estimates of future cash flows, [[Definition:Discounting|discounting]], and the [[Definition:Risk adjustment|risk adjustment]].&lt;br /&gt;
* How this decomposition solves the transparency, comparability, and timing problems that plagued the old world of insurance accounting.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The idea of decomposing a liability into transparent pieces ==&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;One number hides the story.&#039;&#039;&#039; Under the old rules, many insurers reported their insurance [[Definition:Reserves|reserves]] as a single lump sum on the [[Definition:Balance sheet|balance sheet]]. Imagine you see a line that reads &amp;quot;insurance liabilities: €800 million.&amp;quot; What does that number actually contain? Is it mostly expected future claims? Does it include a cushion for uncertainty? Is there unearned [[Definition:Profit|profit]] buried inside? With a single figure, there is no way to tell. This is the core problem IFRS 17 set out to fix: not just to measure the liability differently, but to break it open so that every reader of the [[Definition:Financial statements|financial statements]] can see exactly what is inside.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;balance-sheet&amp;quot; data-wix-blocks=&#039;[&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Assets&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(market value)&amp;quot;,&amp;quot;val&amp;quot;:1000,&amp;quot;color&amp;quot;:&amp;quot;#D3D1C7&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#C5C3B9&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#444441&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#5F5E5A&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Assets (market value)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The insurer\u2019s investment portfolio: government bonds, corporate bonds, equities, and real estate.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Equity&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;val&amp;quot;:200,&amp;quot;color&amp;quot;:&amp;quot;#E6F1FB&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#D0E4F5&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#0C447C&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#185FA5&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Equity (firm\u2019s funds)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Shareholders\u2019 equity \u2014 the residual after subtracting all liabilities from assets.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;CSM&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(contractual service margin)&amp;quot;,&amp;quot;val&amp;quot;:140,&amp;quot;color&amp;quot;:&amp;quot;#EEEDFE&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#DDDCF9&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#3C3489&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#534AB7&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Contractual service margin&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Unearned profit locked away at inception and released gradually as the insurer delivers coverage.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;RA&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(risk adjustment)&amp;quot;,&amp;quot;val&amp;quot;:60,&amp;quot;color&amp;quot;:&amp;quot;#FAECE7&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#F2DDD5&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#712B13&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#993C1D&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Risk adjustment&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;An explicit allowance for the uncertainty in the cash flow estimates.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;PV FCF&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(present value future cash flows)&amp;quot;,&amp;quot;val&amp;quot;:600,&amp;quot;color&amp;quot;:&amp;quot;#E1F5EE&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#CEEADE&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#085041&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#0F6E56&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Present value of future cash flows&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The probability-weighted estimate of all future cash flows, discounted to present value.&amp;quot;}&lt;br /&gt;
]&#039;&amp;gt;Loading…&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Transparency through decomposition.&#039;&#039;&#039; Think of it like a nutrition label on a food product. A chocolate bar might weigh 100 grams, but the label tells you how much of that weight is sugar, how much is fat, and how much is protein. Each ingredient serves a different purpose and carries different implications for your health. IFRS 17 applies the same logic to an insurance liability. Instead of one opaque reserve, the standard requires the insurer to show the distinct ingredients that make up the total. Each ingredient answers a different question: how much cash will likely flow out, what is the time value of waiting, how much extra is held for uncertainty, and how much future profit is locked inside? By separating these components, the standard gives [[Definition:Investors|investors]], [[Definition:Regulators|regulators]], and managers a clear view of what drives the liability and how it might change over time.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume that decomposing the liability means creating several entirely separate reserves that sit in different accounts. In reality, the building blocks are components of a single liability figure on the balance sheet. They are disclosed and tracked separately, but they combine to form one total. Think of them as layers of the same structure, not independent buildings.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; You now know that IFRS 17 breaks the liability into pieces, but what exactly are those pieces, and what does each one capture?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The two building blocks and the three ingredients of fulfilment cash flows ==&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;The high-level structure.&#039;&#039;&#039; IFRS 17 splits the insurance liability into two main building blocks: [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]] (CSM). Fulfilment cash flows, in turn, are made up of three ingredients: estimates of future cash flows, a [[Definition:Discounting|discounting]] adjustment, and the [[Definition:Risk adjustment|risk adjustment]]. Understanding this hierarchy matters: discounting and the risk adjustment are not separate building blocks that sit alongside fulfilment cash flows — they live inside fulfilment cash flows.&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Estimates of future cash flows: the best estimate of what will flow in and out.&#039;&#039;&#039; The first ingredient of fulfilment cash flows is the estimate of future cash flows. This asks: considering everything we know today, what [[Definition:Cash flows|cash flows]] do we expect this group of insurance contracts to generate? That includes future [[Definition:Claims|claims]] payments, [[Definition:Expenses|expenses]] the insurer will incur to administer and settle those claims, and the [[Definition:Premiums|premiums]] still expected to come in. The estimate must be [[Definition:Probability-weighted estimate|probability-weighted]], meaning it reflects not just the most likely outcome but the full range of possibilities. For example, if AXA insures 5,000 homes along the Atlantic coast of France, the estimate would capture the average expected cost of storm claims over the remaining [[Definition:Coverage period|coverage period]], considering scenarios ranging from a calm year to a severe winter storm season.&lt;br /&gt;
&lt;br /&gt;
⏳ &#039;&#039;&#039;Discounting: accounting for the time value of money.&#039;&#039;&#039; The second ingredient is [[Definition:Discounting|discounting]]. A euro paid five years from now is worth less than a euro today because of the [[Definition:Time value of money|time value of money]]. Insurance liabilities often stretch years or even decades into the future, especially in [[Definition:Life insurance|life insurance]] or long-tail [[Definition:Liability insurance|liability]] lines. Discounting converts the estimated future cash flows into their [[Definition:Present value|present value]], the amount that, if invested today at an appropriate rate, would grow to meet the future payments. Without discounting, the reported liability would overstate the economic burden on the insurer. For a long-duration contract, the difference between the undiscounted and discounted liability can be substantial.&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;The risk adjustment: a buffer for uncertainty.&#039;&#039;&#039; The third ingredient is the [[Definition:Risk adjustment|risk adjustment]], often abbreviated RA. Even the best estimate of future cash flows is still just an estimate. Actual outcomes could be worse. The risk adjustment is an explicit allowance for the uncertainty inherent in those estimates. It represents the compensation the insurer requires for bearing the risk that actual cash flows may exceed the expected amount. Think of it as the premium for uncertainty itself. If two groups of contracts have the same expected cash flows but one is far more volatile, the riskier group will carry a larger risk adjustment, making its total liability higher.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners sometimes confuse the risk adjustment with a [[Definition:Prudential margin|prudential margin]] or a deliberate overstatement of the liability. The risk adjustment is not about being conservative for its own sake. It is a principled measure of uncertainty: it reflects the price of bearing risk, not a hidden cushion. IFRS 17 requires it to be disclosed separately, precisely so that readers can see how much of the liability relates to genuine uncertainty rather than to expected cash flows.&lt;br /&gt;
&lt;br /&gt;
📦 &#039;&#039;&#039;Putting it together: fulfilment cash flows.&#039;&#039;&#039; The three ingredients above — estimates of future cash flows, discounting, and the risk adjustment — combine to form [[Definition:Fulfilment cash flows|fulfilment cash flows]]. This single figure represents the insurer&#039;s current, risk-adjusted, present-value estimate of what it will cost to fulfil its obligations. It is the most foundational measure in IFRS 17.&lt;br /&gt;
&lt;br /&gt;
🏦 &#039;&#039;&#039;The contractual service margin: profit waiting to be earned.&#039;&#039;&#039; The second main building block is the [[Definition:Contractual service margin|contractual service margin]], or CSM. When an insurer writes a profitable contract, the expected profit is not recognised on day one. Instead, it is captured in the CSM and released gradually into the [[Definition:Income statement|income statement]] as the insurer delivers the promised [[Definition:Insurance coverage|coverage]] over time. To illustrate: suppose an insurer writes a group of five-year contracts and estimates that the present value of future premiums exceeds the present value of expected claims, expenses, and the risk adjustment by €10 million. That €10 million becomes the CSM. Each year, a portion of it is released into [[Definition:Revenue|revenue]], reflecting the service provided during that period. The CSM ensures that profit emerges in step with the delivery of service, not at the moment the contract is signed.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; These components give a detailed, transparent picture of the insurance liability. But how does this new structure actually fix the specific problems of the old world, such as the lack of comparability and the distorted timing of profit?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the building blocks solve the problems of the old world ==&lt;br /&gt;
&lt;br /&gt;
🌐 &#039;&#039;&#039;Solving comparability.&#039;&#039;&#039; One of the most damaging features of the old world was that insurers in different countries, and sometimes even within the same country, used fundamentally different methods to calculate their reserves. As a result, comparing the financial statements of an insurer in Italy with one in Germany was, at best, misleading. IFRS 17&#039;s building blocks impose a single, structured framework that every insurer applying [[Definition:IFRS|IFRS]] must follow. Because the components are standardised and separately disclosed, an analyst can now look at two insurers and compare their cash flow assumptions, their discount rates, their risk adjustments, and their CSMs on a like-for-like basis. The building blocks create the common language that [[Definition:IFRS 4|IFRS 4]] never provided.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Solving transparency.&#039;&#039;&#039; Under the old rules, it was often impossible to tell whether a change in reserves was driven by new claims, a shift in assumptions, a change in discount rates, or the release of hidden margins. The building block approach makes each driver visible. When assumptions about future claims change, the effect shows up in the cash flow estimates. When interest rates move, the impact appears through discounting. When risk expires, the risk adjustment decreases. When profit is earned, the CSM releases. Each movement has a clear home, and each is reported separately. For managers at an insurer like AXA, this granularity means better decision-making. For external stakeholders, it means greater confidence in the numbers.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that IFRS 17 simply adds more disclosure on top of the old measurement. In fact, the building blocks change the measurement itself, not just the presentation. The way the liability is calculated, updated, and released into profit is fundamentally different from the methods used under most previous regimes. More disclosure is a consequence of the new structure, not its purpose.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Solving profit timing.&#039;&#039;&#039; Perhaps the most significant change is how profit is recognised. Under many old approaches, insurers could recognise large profits on day one, when a contract was signed, or defer them in opaque ways that varied from company to company. The CSM eliminates this problem by locking away expected profit at inception and releasing it systematically as the insurer fulfils its obligations. The result is an [[Definition:Income statement|income statement]] that reflects the economics of the business more faithfully: revenue appears when service is delivered, not when cash is collected. Combined with the explicit treatment of uncertainty through the risk adjustment, and the honest reflection of the time value of money through discounting, the building blocks together produce financial statements that are more comparable across borders, more transparent in their drivers, and more aligned with the true economic performance of the insurer. These are the foundations on which the rest of the IFRS 17 standard is built, and in the pages that follow, you will explore each building block in detail.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* IFRS 17 decomposes the insurance liability into two main building blocks: fulfilment cash flows and the contractual service margin, replacing the single opaque reserve of the old world with a structured view that shows investors, regulators, and managers exactly what drives the number.&lt;br /&gt;
* Fulfilment cash flows comprise three ingredients: estimates of future cash flows (probability-weighted), discounting (converting future amounts to present value), and the risk adjustment (an explicit allowance for uncertainty). Together these produce a single current, risk-adjusted, present-value figure.&lt;br /&gt;
* The contractual service margin captures unearned profit and releases it as service is delivered, ensuring faithful profit timing.&lt;br /&gt;
* Together, the building blocks solve the three central problems of the old world: they create comparability through a single global framework, transparency by making each driver of change visible, and faithful profit timing by locking away day-one gains and releasing them over the coverage period.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The building blocks: overview/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17&amp;diff=22991</id>
		<title>Internal:Training/IFRS17</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17&amp;diff=22991"/>
		<updated>2026-04-06T14:38:39Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Introduction.&#039;&#039;&#039; This training program takes you from first principles to a complete understanding of IFRS 17, the international accounting standard for insurance contracts. Each page builds on the last, starting from the most basic notions and adding complexity one step at a time. No prior knowledge of insurance or accounting is assumed. By the end, you will be able to read, interpret, and work with IFRS 17 financial statements with confidence. Click to explore the training.&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Why insurance exists|Why insurance exists]] ====&lt;br /&gt;
* Uncertainty and risk&lt;br /&gt;
* Pooling as a solution&lt;br /&gt;
* The role of the insurer&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The economics of an insurance contract|The economics of an insurance contract]] ====&lt;br /&gt;
* Anatomy of a premium&lt;br /&gt;
* The timing mismatch and the time value of money&lt;br /&gt;
* Where profit comes from&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/What is accounting and why it matters|What is accounting and why it matters]] ====&lt;br /&gt;
* The purpose of accounting: who needs it and why&lt;br /&gt;
* The balance sheet and the income statement&lt;br /&gt;
* Key principles: recognition, measurement, and matching&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Accounting for an insurer|Accounting for an insurer]] ====&lt;br /&gt;
* The insurer&#039;s balance sheet: reserves as the dominant liability&lt;br /&gt;
* The insurer&#039;s income statement: premiums, claims, and expenses&lt;br /&gt;
* The hard questions: when is revenue earned, how do you value an uncertain promise?&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Why insurance broke global standards|Why insurance broke global standards]] ====&lt;br /&gt;
* Different countries, different answers&lt;br /&gt;
* IFRS and the promise of one global language&lt;br /&gt;
* IFRS 4 as a temporary compromise and why IFRS 17 was needed&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The building blocks: overview|The building blocks: overview]] ====&lt;br /&gt;
* The idea of decomposing a liability into transparent pieces&lt;br /&gt;
* The two building blocks and the three ingredients of fulfilment cash flows&lt;br /&gt;
* How the building blocks solve the problems of the old world&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Future cash flows|Future cash flows]] ====&lt;br /&gt;
* Which cash flows to include&lt;br /&gt;
* The contract boundary&lt;br /&gt;
* Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Discounting|Discounting]] ====&lt;br /&gt;
* Why discounting is essential for insurance liabilities&lt;br /&gt;
* Choosing the discount rate: top-down vs. bottom-up&lt;br /&gt;
* How discounting affects the liability over time&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The risk adjustment|The risk adjustment]] ====&lt;br /&gt;
* What the risk adjustment represents&lt;br /&gt;
* How to measure it: confidence levels, cost of capital, VaR&lt;br /&gt;
* How the risk adjustment releases as risk expires&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The contractual service margin|The contractual service margin]] ====&lt;br /&gt;
* What the CSM represents: unearned profit locked away on day one&lt;br /&gt;
* How the CSM absorbs changes in estimates&lt;br /&gt;
* How the CSM releases into revenue: coverage units&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Grouping contracts|Grouping contracts]] ====&lt;br /&gt;
* Portfolios: contracts with similar risks&lt;br /&gt;
* Profitability groups: separating profitable from onerous&lt;br /&gt;
* Annual cohorts: why contracts issued more than a year apart must be separated&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The general model: initial recognition|The general model: initial recognition]] ====&lt;br /&gt;
* Day one: measuring the four building blocks&lt;br /&gt;
* Profitable contracts: CSM is positive&lt;br /&gt;
* Onerous contracts: CSM is zero, loss recognized immediately&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The general model: subsequent measurement|The general model: subsequent measurement]] ====&lt;br /&gt;
* Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
* Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L&lt;br /&gt;
* Claims incurred, settled, and derecognition&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The income statement under IFRS 17|The income statement under IFRS 17]] ====&lt;br /&gt;
* Insurance revenue: not premiums, but service delivered&lt;br /&gt;
* Insurance service expenses and the insurance service result&lt;br /&gt;
* Insurance finance income/expense and the OCI option&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The premium allocation approach|The premium allocation approach]] ====&lt;br /&gt;
* When PAA is available: the eligibility test&lt;br /&gt;
* How PAA works: simplified measurement&lt;br /&gt;
* What you keep and what you skip vs. the general model&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The variable fee approach|The variable fee approach]] ====&lt;br /&gt;
* What are direct participating contracts&lt;br /&gt;
* The variable fee concept: how VFA modifies the general model&lt;br /&gt;
* Scope and the three eligibility criteria&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Reinsurance held|Reinsurance held]] ====&lt;br /&gt;
* Reinsurance as the mirror image: the insurer is the customer&lt;br /&gt;
* Key asymmetries: day-one gains and loss recovery&lt;br /&gt;
* Proportionate vs. non-proportionate reinsurance&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Contract modifications and portfolio transfers|Contract modifications and portfolio transfers]] ====&lt;br /&gt;
* When contract terms change: derecognize or continue?&lt;br /&gt;
* The criteria and consequences of modification&lt;br /&gt;
* Portfolio transfers: measuring at the transaction date&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Transition to IFRS 17|Transition to IFRS 17]] ====&lt;br /&gt;
* The full retrospective approach: the gold standard&lt;br /&gt;
* The modified retrospective approach: practical approximation&lt;br /&gt;
* The fair value approach: when history is unavailable&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Presentation, disclosure, and interpretation|Presentation, disclosure, and interpretation]] ====&lt;br /&gt;
* How IFRS 17 numbers appear in published financial statements&lt;br /&gt;
* Key disclosure requirements&lt;br /&gt;
* Reading IFRS 17 reports as an analyst or stakeholder&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22990</id>
		<title>Internal:Training/IFRS17/The building blocks: overview</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/The_building_blocks:_overview&amp;diff=22990"/>
		<updated>2026-04-06T14:37:28Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned that decades of inconsistent national rules made insurance accounting opaque and incomparable, and that [[Definition:IFRS 4|IFRS 4]] was only a temporary compromise. Now we build on that by introducing the framework [[Definition:IFRS 17|IFRS 17]] uses to replace that patchwork: a set of transparent, interlocking building blocks that together form the insurance liability.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* Why IFRS 17 decomposes an insurance [[Definition:Liability|liability]] into separate, visible pieces instead of reporting a single opaque number.&lt;br /&gt;
* What the two main building blocks are, [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]], and the three ingredients that make up fulfilment cash flows: estimates of future cash flows, [[Definition:Discounting|discounting]], and the [[Definition:Risk adjustment|risk adjustment]].&lt;br /&gt;
* How this decomposition solves the transparency, comparability, and timing problems that plagued the old world of insurance accounting.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The idea of decomposing a liability into transparent pieces ==&lt;br /&gt;
&lt;br /&gt;
🏗️ &#039;&#039;&#039;One number hides the story.&#039;&#039;&#039; Under the old rules, many insurers reported their insurance [[Definition:Reserves|reserves]] as a single lump sum on the [[Definition:Balance sheet|balance sheet]]. Imagine you see a line that reads &amp;quot;insurance liabilities: €800 million.&amp;quot; What does that number actually contain? Is it mostly expected future claims? Does it include a cushion for uncertainty? Is there unearned [[Definition:Profit|profit]] buried inside? With a single figure, there is no way to tell. This is the core problem IFRS 17 set out to fix: not just to measure the liability differently, but to break it open so that every reader of the [[Definition:Financial statements|financial statements]] can see exactly what is inside.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;balance-sheet&amp;quot; data-wix-blocks=&#039;[&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Assets&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(market value)&amp;quot;,&amp;quot;val&amp;quot;:1000,&amp;quot;color&amp;quot;:&amp;quot;#D3D1C7&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#C5C3B9&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#444441&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#5F5E5A&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Assets (market value)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The insurer&#039;s investment portfolio: government bonds, corporate bonds, equities, and real estate.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;Equity&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;val&amp;quot;:200,&amp;quot;color&amp;quot;:&amp;quot;#E6F1FB&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#D0E4F5&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#0C447C&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#185FA5&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Equity (firm&#039;s funds)&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Shareholders&#039; equity — the residual after subtracting all liabilities from assets.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;CSM&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(contractual service margin)&amp;quot;,&amp;quot;val&amp;quot;:140,&amp;quot;color&amp;quot;:&amp;quot;#EEEDFE&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#DDDCF9&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#3C3489&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#534AB7&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Contractual service margin&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;Unearned profit locked away at inception and released gradually as the insurer delivers coverage.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;RA&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(risk adjustment)&amp;quot;,&amp;quot;val&amp;quot;:60,&amp;quot;color&amp;quot;:&amp;quot;#FAECE7&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#F2DDD5&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#712B13&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#993C1D&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Risk adjustment&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;An explicit allowance for the uncertainty in the cash flow estimates.&amp;quot;},&lt;br /&gt;
  {&amp;quot;label&amp;quot;:&amp;quot;PV FCF&amp;quot;,&amp;quot;sub&amp;quot;:&amp;quot;(present value future cash flows)&amp;quot;,&amp;quot;val&amp;quot;:600,&amp;quot;color&amp;quot;:&amp;quot;#E1F5EE&amp;quot;,&amp;quot;hColor&amp;quot;:&amp;quot;#CEEADE&amp;quot;,&amp;quot;textColor&amp;quot;:&amp;quot;#085041&amp;quot;,&amp;quot;subColor&amp;quot;:&amp;quot;#0F6E56&amp;quot;,&amp;quot;question&amp;quot;:&amp;quot;Present value of future cash flows&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;The probability-weighted estimate of all future cash flows, discounted to present value.&amp;quot;}&lt;br /&gt;
]&#039;&amp;gt;Loading…&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
🔍 &#039;&#039;&#039;Transparency through decomposition.&#039;&#039;&#039; Think of it like a nutrition label on a food product. A chocolate bar might weigh 100 grams, but the label tells you how much of that weight is sugar, how much is fat, and how much is protein. Each ingredient serves a different purpose and carries different implications for your health. IFRS 17 applies the same logic to an insurance liability. Instead of one opaque reserve, the standard requires the insurer to show the distinct ingredients that make up the total. Each ingredient answers a different question: how much cash will likely flow out, what is the time value of waiting, how much extra is held for uncertainty, and how much future profit is locked inside? By separating these components, the standard gives [[Definition:Investors|investors]], [[Definition:Regulators|regulators]], and managers a clear view of what drives the liability and how it might change over time.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Some learners assume that decomposing the liability means creating several entirely separate reserves that sit in different accounts. In reality, the building blocks are components of a single liability figure on the balance sheet. They are disclosed and tracked separately, but they combine to form one total. Think of them as layers of the same structure, not independent buildings.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; You now know that IFRS 17 breaks the liability into pieces, but what exactly are those pieces, and what does each one capture?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The two building blocks and the three ingredients of fulfilment cash flows ==&lt;br /&gt;
&lt;br /&gt;
📐 &#039;&#039;&#039;The high-level structure.&#039;&#039;&#039; IFRS 17 splits the insurance liability into two main building blocks: [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]] (CSM). Fulfilment cash flows, in turn, are made up of three ingredients: estimates of future cash flows, a [[Definition:Discounting|discounting]] adjustment, and the [[Definition:Risk adjustment|risk adjustment]]. Understanding this hierarchy matters: discounting and the risk adjustment are not separate building blocks that sit alongside fulfilment cash flows — they live inside fulfilment cash flows.&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Estimates of future cash flows: the best estimate of what will flow in and out.&#039;&#039;&#039; The first ingredient of fulfilment cash flows is the estimate of future cash flows. This asks: considering everything we know today, what [[Definition:Cash flows|cash flows]] do we expect this group of insurance contracts to generate? That includes future [[Definition:Claims|claims]] payments, [[Definition:Expenses|expenses]] the insurer will incur to administer and settle those claims, and the [[Definition:Premiums|premiums]] still expected to come in. The estimate must be [[Definition:Probability-weighted estimate|probability-weighted]], meaning it reflects not just the most likely outcome but the full range of possibilities. For example, if AXA insures 5,000 homes along the Atlantic coast of France, the estimate would capture the average expected cost of storm claims over the remaining [[Definition:Coverage period|coverage period]], considering scenarios ranging from a calm year to a severe winter storm season.&lt;br /&gt;
&lt;br /&gt;
⏳ &#039;&#039;&#039;Discounting: accounting for the time value of money.&#039;&#039;&#039; The second ingredient is [[Definition:Discounting|discounting]]. A euro paid five years from now is worth less than a euro today because of the [[Definition:Time value of money|time value of money]]. Insurance liabilities often stretch years or even decades into the future, especially in [[Definition:Life insurance|life insurance]] or long-tail [[Definition:Liability insurance|liability]] lines. Discounting converts the estimated future cash flows into their [[Definition:Present value|present value]], the amount that, if invested today at an appropriate rate, would grow to meet the future payments. Without discounting, the reported liability would overstate the economic burden on the insurer. For a long-duration contract, the difference between the undiscounted and discounted liability can be substantial.&lt;br /&gt;
&lt;br /&gt;
🛡️ &#039;&#039;&#039;The risk adjustment: a buffer for uncertainty.&#039;&#039;&#039; The third ingredient is the [[Definition:Risk adjustment|risk adjustment]], often abbreviated RA. Even the best estimate of future cash flows is still just an estimate. Actual outcomes could be worse. The risk adjustment is an explicit allowance for the uncertainty inherent in those estimates. It represents the compensation the insurer requires for bearing the risk that actual cash flows may exceed the expected amount. Think of it as the premium for uncertainty itself. If two groups of contracts have the same expected cash flows but one is far more volatile, the riskier group will carry a larger risk adjustment, making its total liability higher.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Learners sometimes confuse the risk adjustment with a [[Definition:Prudential margin|prudential margin]] or a deliberate overstatement of the liability. The risk adjustment is not about being conservative for its own sake. It is a principled measure of uncertainty: it reflects the price of bearing risk, not a hidden cushion. IFRS 17 requires it to be disclosed separately, precisely so that readers can see how much of the liability relates to genuine uncertainty rather than to expected cash flows.&lt;br /&gt;
&lt;br /&gt;
📦 &#039;&#039;&#039;Putting it together: fulfilment cash flows.&#039;&#039;&#039; The three ingredients above — estimates of future cash flows, discounting, and the risk adjustment — combine to form [[Definition:Fulfilment cash flows|fulfilment cash flows]]. This single figure represents the insurer&#039;s current, risk-adjusted, present-value estimate of what it will cost to fulfil its obligations. It is the most foundational measure in IFRS 17.&lt;br /&gt;
&lt;br /&gt;
🏦 &#039;&#039;&#039;The contractual service margin: profit waiting to be earned.&#039;&#039;&#039; The second main building block is the [[Definition:Contractual service margin|contractual service margin]], or CSM. When an insurer writes a profitable contract, the expected profit is not recognised on day one. Instead, it is captured in the CSM and released gradually into the [[Definition:Income statement|income statement]] as the insurer delivers the promised [[Definition:Insurance coverage|coverage]] over time. To illustrate: suppose an insurer writes a group of five-year contracts and estimates that the present value of future premiums exceeds the present value of expected claims, expenses, and the risk adjustment by €10 million. That €10 million becomes the CSM. Each year, a portion of it is released into [[Definition:Revenue|revenue]], reflecting the service provided during that period. The CSM ensures that profit emerges in step with the delivery of service, not at the moment the contract is signed.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; These components give a detailed, transparent picture of the insurance liability. But how does this new structure actually fix the specific problems of the old world, such as the lack of comparability and the distorted timing of profit?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== How the building blocks solve the problems of the old world ==&lt;br /&gt;
&lt;br /&gt;
🌐 &#039;&#039;&#039;Solving comparability.&#039;&#039;&#039; One of the most damaging features of the old world was that insurers in different countries, and sometimes even within the same country, used fundamentally different methods to calculate their reserves. As a result, comparing the financial statements of an insurer in Italy with one in Germany was, at best, misleading. IFRS 17&#039;s building blocks impose a single, structured framework that every insurer applying [[Definition:IFRS|IFRS]] must follow. Because the components are standardised and separately disclosed, an analyst can now look at two insurers and compare their cash flow assumptions, their discount rates, their risk adjustments, and their CSMs on a like-for-like basis. The building blocks create the common language that [[Definition:IFRS 4|IFRS 4]] never provided.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Solving transparency.&#039;&#039;&#039; Under the old rules, it was often impossible to tell whether a change in reserves was driven by new claims, a shift in assumptions, a change in discount rates, or the release of hidden margins. The building block approach makes each driver visible. When assumptions about future claims change, the effect shows up in the cash flow estimates. When interest rates move, the impact appears through discounting. When risk expires, the risk adjustment decreases. When profit is earned, the CSM releases. Each movement has a clear home, and each is reported separately. For managers at an insurer like AXA, this granularity means better decision-making. For external stakeholders, it means greater confidence in the numbers.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; It is tempting to think that IFRS 17 simply adds more disclosure on top of the old measurement. In fact, the building blocks change the measurement itself, not just the presentation. The way the liability is calculated, updated, and released into profit is fundamentally different from the methods used under most previous regimes. More disclosure is a consequence of the new structure, not its purpose.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Solving profit timing.&#039;&#039;&#039; Perhaps the most significant change is how profit is recognised. Under many old approaches, insurers could recognise large profits on day one, when a contract was signed, or defer them in opaque ways that varied from company to company. The CSM eliminates this problem by locking away expected profit at inception and releasing it systematically as the insurer fulfils its obligations. The result is an [[Definition:Income statement|income statement]] that reflects the economics of the business more faithfully: revenue appears when service is delivered, not when cash is collected. Combined with the explicit treatment of uncertainty through the risk adjustment, and the honest reflection of the time value of money through discounting, the building blocks together produce financial statements that are more comparable across borders, more transparent in their drivers, and more aligned with the true economic performance of the insurer. These are the foundations on which the rest of the IFRS 17 standard is built, and in the pages that follow, you will explore each building block in detail.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* IFRS 17 decomposes the insurance liability into two main building blocks: fulfilment cash flows and the contractual service margin, replacing the single opaque reserve of the old world with a structured view that shows investors, regulators, and managers exactly what drives the number.&lt;br /&gt;
* Fulfilment cash flows comprise three ingredients: estimates of future cash flows (probability-weighted), discounting (converting future amounts to present value), and the risk adjustment (an explicit allowance for uncertainty). Together these produce a single current, risk-adjusted, present-value figure.&lt;br /&gt;
* The contractual service margin captures unearned profit and releases it as service is delivered, ensuring faithful profit timing.&lt;br /&gt;
* Together, the building blocks solve the three central problems of the old world: they create comparability through a single global framework, transparency by making each driver of change visible, and faithful profit timing by locking away day-one gains and releasing them over the coverage period.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/The building blocks: overview/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=22989</id>
		<title>MediaWiki:Gadget-wix-interactive.js</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.js&amp;diff=22989"/>
		<updated>2026-04-06T14:36:30Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.JS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Depends on: ext.gadget.wix-core  (window.wix must exist)&lt;br /&gt;
&lt;br /&gt;
   Dispatches by data-wix-module value. Each value maps to an&lt;br /&gt;
   initializer function that builds the widget DOM and wires logic.&lt;br /&gt;
&lt;br /&gt;
   Supported modules:&lt;br /&gt;
   - &amp;quot;pool-simulator&amp;quot;    Risk pooling comparison (Bordeaux vs Normandy)&lt;br /&gt;
   - &amp;quot;insurer-engines&amp;quot;   Two-engine profit simulator (underwriting + investment)&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Dispatcher ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
  var dispatchers = {&lt;br /&gt;
    &#039;pool-simulator&#039;:       initPoolSimulator,&lt;br /&gt;
    &#039;insurer-engines&#039;:      initInsurerEngines,&lt;br /&gt;
    &#039;premium-matching&#039;:     initPremiumMatching,&lt;br /&gt;
    &#039;reserve-sensitivity&#039;:  initReserveSensitivity,&lt;br /&gt;
    &#039;ifrs-timeline&#039;:        initIfrsTimeline,&lt;br /&gt;
    &#039;liability-waterfall&#039;:  initLiabilityWaterfall,&lt;br /&gt;
    &#039;prob-weighted&#039;:        initProbWeighted,&lt;br /&gt;
    &#039;discount-rate&#039;:        initDiscountRate,&lt;br /&gt;
    &#039;balance-sheet&#039;:        initBalanceSheet&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  mw.hook( &#039;wikipage.content&#039; ).add( function () {&lt;br /&gt;
    Object.keys( dispatchers ).forEach( function ( moduleType ) {&lt;br /&gt;
      wix.initModules( moduleType ).forEach( dispatchers[ moduleType ] );&lt;br /&gt;
    } );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     POOL SIMULATOR&lt;br /&gt;
     Compares self-insured (&amp;quot;alone&amp;quot;) vs pooled risk over 25 years.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPoolSimulator( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var YEARS       = 25;&lt;br /&gt;
    var PROB        = 0.02;&lt;br /&gt;
    var REPAIR      = 15000;&lt;br /&gt;
    var POOL_FEE    = 200;&lt;br /&gt;
    var START       = 20000;&lt;br /&gt;
    var ANNUAL_SAVE = 2000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart colors (match WIX tokens) ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorAlone = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorPool  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var year = 0;&lt;br /&gt;
    var playing = false;&lt;br /&gt;
    var timer = null;&lt;br /&gt;
    var aloneSavings = START;&lt;br /&gt;
    var poolSavings  = START;&lt;br /&gt;
    var aloneSpent   = 0;&lt;br /&gt;
    var poolSpent    = 0;&lt;br /&gt;
    var aloneData    = [ START ];&lt;br /&gt;
    var poolData     = [ START ];&lt;br /&gt;
    var hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function speedMs() {&lt;br /&gt;
      var speeds = [ 800, 500, 300, 150, 80 ];&lt;br /&gt;
      return speeds[ parseInt( speedSlider.value, 10 ) - 1 ] || 300;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Dynamic elements (need references for updates)&lt;br /&gt;
    var elAloneSavings = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elAloneSpent   = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
    var elPoolSavings  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( START ) } );&lt;br /&gt;
    var elPoolSpent    = wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-val&#039;, textContent: fmt( 0 ) } );&lt;br /&gt;
&lt;br /&gt;
    var canvasAlone = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var canvasPool  = wix.el( &#039;canvas&#039; );&lt;br /&gt;
&lt;br /&gt;
    var elAloneLog = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
    var elPoolLog  = wix.el( &#039;div&#039;, { className: &#039;wix-sim-log wix-sim-log--safe&#039;, textContent: &#039;Ready to simulate&#039; } );&lt;br /&gt;
&lt;br /&gt;
    // Alone panel&lt;br /&gt;
    var alonePanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--alone&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;Bordeaux homeowner&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elAloneSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total spent on hail&#039; } ),&lt;br /&gt;
          elAloneSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasAlone ] ),&lt;br /&gt;
      elAloneLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Pool panel&lt;br /&gt;
    var poolPanel = wix.el( &#039;div&#039;, { className: &#039;wix-sim-panel wix-sim-panel--pool&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-label wix-sim-label--pool&#039;, textContent: &#039;In the Normandy pool&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-title&#039;, textContent: &#039;1 of 1,000 homeowners&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-stats&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Savings&#039; } ),&lt;br /&gt;
          elPoolSavings&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-stat-label&#039;, textContent: &#039;Total paid to pool&#039; } ),&lt;br /&gt;
          elPoolSpent&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-sim-chart&#039; }, [ canvasPool ] ),&lt;br /&gt;
      elPoolLog&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Panels grid&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-panels&#039; }, [&lt;br /&gt;
      alonePanel,&lt;br /&gt;
      poolPanel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Controls&lt;br /&gt;
    var btnStep = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Step 1 year&#039; } );&lt;br /&gt;
    var btnPlay = wix.el( &#039;button&#039;, { className: &#039;wix-btn&#039;, textContent: &#039;Play&#039;, style: { minWidth: &#039;4.5rem&#039; } } );&lt;br /&gt;
    var btnReset = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Reset&#039; } );&lt;br /&gt;
    var elYear = wix.el( &#039;span&#039;, { className: &#039;wix-sim-year&#039;, textContent: &#039;Year 0 / &#039; + YEARS } );&lt;br /&gt;
    var speedSlider = wix.el( &#039;input&#039;, { type: &#039;range&#039;, min: &#039;1&#039;, max: &#039;5&#039;, value: &#039;3&#039;, step: &#039;1&#039; } );&lt;br /&gt;
    var speedLabel = wix.el( &#039;label&#039;, { className: &#039;wix-sim-speed&#039; }, [&lt;br /&gt;
      &#039;Speed &#039;,&lt;br /&gt;
      speedSlider&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-controls&#039; }, [&lt;br /&gt;
      btnStep, btnPlay, btnReset, elYear, speedLabel&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Summary (hidden until simulation ends)&lt;br /&gt;
    var summaryEl = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary wix-hidden&#039; } );&lt;br /&gt;
    wrapper.appendChild( summaryEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( canvas, data, dots, lineColor ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 8, b: 24, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = data.slice();&lt;br /&gt;
      var maxVal = Math.max( START + ANNUAL_SAVE * YEARS, Math.max.apply( null, allVals ) ) * 1.05;&lt;br /&gt;
      var minVal = Math.min( 0, Math.min.apply( null, allVals ) );&lt;br /&gt;
      var range  = maxVal - minVal || 1;&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y-axis labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var i, y, x, yr;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= 4; i++ ) {&lt;br /&gt;
        y = pad.t + ch - ( ch * i / 4 );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmt( minVal + range * i / 4 ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X-axis labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      for ( yr = 0; yr &amp;lt;= YEARS; yr += 5 ) {&lt;br /&gt;
        x = pad.l + ( cw * yr / YEARS );&lt;br /&gt;
        ctx.fillText( String( yr ), x, h - 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if ( data.length &amp;lt; 2 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      ctx.strokeStyle = lineColor;&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // Gradient fill&lt;br /&gt;
      var lastIdx = data.length - 1;&lt;br /&gt;
      var grad = ctx.createLinearGradient( 0, pad.t, 0, pad.t + ch );&lt;br /&gt;
      grad.addColorStop( 0, lineColor + &#039;18&#039; );&lt;br /&gt;
      grad.addColorStop( 1, lineColor + &#039;02&#039; );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      for ( i = 0; i &amp;lt; data.length; i++ ) {&lt;br /&gt;
        x = pad.l + ( cw * i / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ i ] - minVal ) / range );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( x, y );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( x, y );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.lineTo( pad.l + ( cw * lastIdx / YEARS ), pad.t + ch );&lt;br /&gt;
      ctx.lineTo( pad.l, pad.t + ch );&lt;br /&gt;
      ctx.closePath();&lt;br /&gt;
      ctx.fillStyle = grad;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      // Hit year dots&lt;br /&gt;
      Object.keys( dots ).forEach( function ( hy ) {&lt;br /&gt;
        hy = parseInt( hy, 10 );&lt;br /&gt;
        if ( hy &amp;gt;= data.length ) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
        x = pad.l + ( cw * hy / YEARS );&lt;br /&gt;
        y = pad.t + ch - ( ch * ( data[ hy ] - minVal ) / range );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( x, y, 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = lineColor;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Current position dot (ring)&lt;br /&gt;
      var cx = pad.l + ( cw * lastIdx / YEARS );&lt;br /&gt;
      var cy = pad.t + ch - ( ch * ( data[ lastIdx ] - minVal ) / range );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 5, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = lineColor;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc( cx, cy, 3, 0, Math.PI * 2 );&lt;br /&gt;
      ctx.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function updateUI() {&lt;br /&gt;
      elAloneSavings.textContent = fmt( aloneSavings );&lt;br /&gt;
      elAloneSpent.textContent   = fmt( aloneSpent );&lt;br /&gt;
      elPoolSavings.textContent  = fmt( poolSavings );&lt;br /&gt;
      elPoolSpent.textContent    = fmt( poolSpent );&lt;br /&gt;
      elYear.textContent         = &#039;Year &#039; + year + &#039; / &#039; + YEARS;&lt;br /&gt;
&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Simulation Logic ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function stepYear() {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      year++;&lt;br /&gt;
&lt;br /&gt;
      aloneSavings += ANNUAL_SAVE;&lt;br /&gt;
      poolSavings  += ANNUAL_SAVE;&lt;br /&gt;
&lt;br /&gt;
      // Hailstorm?&lt;br /&gt;
      var hit = Math.random() &amp;lt; PROB;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        aloneSavings -= REPAIR;&lt;br /&gt;
        aloneSpent   += REPAIR;&lt;br /&gt;
        hitYears[ year ] = true;&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes! -\u20AC15,000 in repairs&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--hit&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elAloneLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm&#039;;&lt;br /&gt;
        elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Pool fee (always paid)&lt;br /&gt;
      poolSavings -= POOL_FEE;&lt;br /&gt;
      poolSpent   += POOL_FEE;&lt;br /&gt;
&lt;br /&gt;
      if ( hit ) {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: Hailstorm strikes \u2014 pool covers the repair. You paid \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        elPoolLog.textContent = &#039;Year &#039; + year + &#039;: No hailstorm. Your pool contribution: \u20AC200&#039;;&lt;br /&gt;
        elPoolLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      aloneData.push( aloneSavings );&lt;br /&gt;
      poolData.push( poolSavings );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        showSummary();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stop() {&lt;br /&gt;
      playing = false;&lt;br /&gt;
      clearInterval( timer );&lt;br /&gt;
      timer = null;&lt;br /&gt;
      btnPlay.textContent = &#039;Play&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function reset() {&lt;br /&gt;
      stop();&lt;br /&gt;
      year         = 0;&lt;br /&gt;
      aloneSavings = START;&lt;br /&gt;
      poolSavings  = START;&lt;br /&gt;
      aloneSpent   = 0;&lt;br /&gt;
      poolSpent    = 0;&lt;br /&gt;
      aloneData    = [ START ];&lt;br /&gt;
      poolData     = [ START ];&lt;br /&gt;
      hitYears     = {};&lt;br /&gt;
&lt;br /&gt;
      elAloneLog.textContent = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elAloneLog.className   = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
      elPoolLog.textContent  = &#039;Ready to simulate&#039;;&lt;br /&gt;
      elPoolLog.className    = &#039;wix-sim-log wix-sim-log--safe&#039;;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-hidden&#039; );&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
&lt;br /&gt;
      updateUI();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showSummary() {&lt;br /&gt;
      wix.empty( summaryEl );&lt;br /&gt;
      summaryEl.classList.remove( &#039;wix-hidden&#039; );&lt;br /&gt;
      summaryEl.classList.add( &#039;wix-animate-in&#039; );&lt;br /&gt;
&lt;br /&gt;
      var hitsCount = Object.keys( hitYears ).length;&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-title&#039;, textContent: &#039;After &#039; + YEARS + &#039; years&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
      var grid = wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-grid&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--alone&#039;, textContent: &#039;Going it alone&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total repair cost: &#039; + fmt( aloneSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( aloneSavings ) ] )&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-sim-summary-heading wix-sim-summary-heading--pool&#039;, textContent: &#039;In the pool&#039; } ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Hailstorms suffered: &#039; + hitsCount + &#039; (same weather)&#039; ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Total pool contributions: &#039; + fmt( poolSpent ) ] ),&lt;br /&gt;
          wix.el( &#039;div&#039;, {}, [ &#039;Final savings: &#039; + fmt( poolSavings ) ] )&lt;br /&gt;
        ] )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      summaryEl.appendChild( grid );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnStep.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      stop();&lt;br /&gt;
      stepYear();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPlay.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( year &amp;gt;= YEARS ) {&lt;br /&gt;
        reset();&lt;br /&gt;
      }&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        stop();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      playing = true;&lt;br /&gt;
      btnPlay.textContent = &#039;Pause&#039;;&lt;br /&gt;
      timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnReset.addEventListener( &#039;click&#039;, reset );&lt;br /&gt;
&lt;br /&gt;
    speedSlider.addEventListener( &#039;input&#039;, function () {&lt;br /&gt;
      if ( playing ) {&lt;br /&gt;
        clearInterval( timer );&lt;br /&gt;
        timer = setInterval( stepYear, speedMs() );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render + Resize ──────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    updateUI();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      drawChart( canvasAlone, aloneData, hitYears, colorAlone );&lt;br /&gt;
      drawChart( canvasPool,  poolData,  {},       colorPool );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     INSURER ENGINES&lt;br /&gt;
     Two-engine profit simulator: underwriting + investment income.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initInsurerEngines( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var PREMIUMS = 5000000;&lt;br /&gt;
    var EXPENSES = 1200000;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (match WIX tokens) ───────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim() || &#039;#922b21&#039;;&lt;br /&gt;
    var colorInv = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ───────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      var sign = v &amp;lt; 0 ? &#039;-&#039; : &#039;&#039;;&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      if ( abs &amp;gt;= 1000000 ) {&lt;br /&gt;
        return sign + &#039;\u20AC&#039; + ( abs / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      return sign + &#039;\u20AC&#039; + wix.formatNumber( Math.round( abs ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper — single card containing the entire widget&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Fixed info row&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-fixed&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Policies: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;10,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Avg premium: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC500&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Total premiums: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC5,000,000&#039; } ) ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [ &#039;Expenses: &#039;, wix.el( &#039;span&#039;, { textContent: &#039;\u20AC1,200,000&#039; } ) ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario strip&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Claims scenario&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    var scenarios = [&lt;br /&gt;
      { label: &#039;Mild year&#039;,    sub: &#039;\u20AC2.8M&#039;, claims: 2800000 },&lt;br /&gt;
      { label: &#039;Expected&#039;,     sub: &#039;\u20AC3.2M&#039;, claims: 3200000 },&lt;br /&gt;
      { label: &#039;Harsh winter&#039;, sub: &#039;\u20AC3.6M&#039;, claims: 3600000 }&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    var scenarioBtns = [];&lt;br /&gt;
    var strip = wix.el( &#039;div&#039;, { className: &#039;wix-eng-scenario-strip&#039; } );&lt;br /&gt;
&lt;br /&gt;
    scenarios.forEach( function ( s, idx ) {&lt;br /&gt;
      var cls = &#039;wix-eng-scenario-btn&#039;;&lt;br /&gt;
      if ( idx === 1 ) {&lt;br /&gt;
        cls += &#039; wix-eng-scenario-btn--active&#039;;&lt;br /&gt;
      }&lt;br /&gt;
      var btn = wix.el( &#039;button&#039;, {&lt;br /&gt;
        className: cls,&lt;br /&gt;
        &#039;data-claims&#039;: String( s.claims )&lt;br /&gt;
      }, [&lt;br /&gt;
        s.label,&lt;br /&gt;
        wix.el( &#039;br&#039; ),&lt;br /&gt;
        s.sub&lt;br /&gt;
      ] );&lt;br /&gt;
      scenarioBtns.push( btn );&lt;br /&gt;
      strip.appendChild( btn );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( strip );&lt;br /&gt;
&lt;br /&gt;
    // Sliders&lt;br /&gt;
    var claimsSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;2400000&#039;, max: &#039;4200000&#039;, step: &#039;50000&#039;, value: &#039;3200000&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var claimsVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;\u20AC3.20M&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Actual claims&#039; } ),&lt;br /&gt;
      claimsSlider,&lt;br /&gt;
      claimsVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    var investSlider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;8&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var investVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Annual return on float&#039; } ),&lt;br /&gt;
      investSlider,&lt;br /&gt;
      investVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 1: Underwriting&lt;br /&gt;
    var uwValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC600,000&#039; } );&lt;br /&gt;
    var uwDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039;, textContent: &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC3,200,000 claims&#039; } );&lt;br /&gt;
    var uwBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 1: underwriting&#039; } ),&lt;br /&gt;
        uwValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      uwDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ uwBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Combined ratio&lt;br /&gt;
    var crValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-val&#039;, textContent: &#039;88.0%&#039; } );&lt;br /&gt;
    var crSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-sub&#039;, textContent: &#039;Below 100% \u2014 underwriting profit&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-cr-label&#039;, textContent: &#039;Combined ratio&#039; } ),&lt;br /&gt;
      crValEl,&lt;br /&gt;
      crSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Engine 2: Investment&lt;br /&gt;
    var invValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-val&#039;, textContent: &#039;\u20AC75,000&#039; } );&lt;br /&gt;
    var invDetail = wix.el( &#039;div&#039;, { className: &#039;wix-eng-detail&#039; } );&lt;br /&gt;
    var invBar = wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-card&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-title&#039;, textContent: &#039;Engine 2: investment&#039; } ),&lt;br /&gt;
        invValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      invDetail,&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-bar-track&#039; }, [ invBar ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Divider&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-divider&#039; } ) );&lt;br /&gt;
&lt;br /&gt;
    // Total profit&lt;br /&gt;
    var totalValEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-val&#039;, textContent: &#039;\u20AC675,000&#039; } );&lt;br /&gt;
    var totalSub = wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-sub&#039;, textContent: &#039;Underwriting + investment, before tax&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-total&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-head&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-eng-total-label&#039;, textContent: &#039;Total pre-tax profit&#039; } ),&lt;br /&gt;
        totalValEl&lt;br /&gt;
      ] ),&lt;br /&gt;
      totalSub&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Callout&lt;br /&gt;
    var callout = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039;, textContent: &#039;Both engines are contributing to profit.&#039; } );&lt;br /&gt;
    wrapper.appendChild( callout );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var claims = parseInt( claimsSlider.value, 10 );&lt;br /&gt;
      var rate = parseFloat( investSlider.value ) / 100;&lt;br /&gt;
      var uw = PREMIUMS - EXPENSES - claims;&lt;br /&gt;
      var avgFloat = Math.round( PREMIUMS * 0.5 );&lt;br /&gt;
      var inv = Math.round( avgFloat * rate );&lt;br /&gt;
      var total = uw + inv;&lt;br /&gt;
      var cr = ( claims + EXPENSES ) / PREMIUMS * 100;&lt;br /&gt;
&lt;br /&gt;
      // Slider displays&lt;br /&gt;
      claimsVal.textContent = &#039;\u20AC&#039; + ( claims / 1000000 ).toFixed( 2 ) + &#039;M&#039;;&lt;br /&gt;
      investVal.textContent = ( rate * 100 ).toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Engine 1: underwriting&lt;br /&gt;
      var uwColor = uw &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
      uwValEl.textContent = fmt( uw );&lt;br /&gt;
      uwValEl.style.color = uwColor;&lt;br /&gt;
      uwDetail.textContent = &#039;\u20AC5,000,000 premiums \u2212 \u20AC1,200,000 expenses \u2212 \u20AC&#039; + wix.formatNumber( claims ) + &#039; claims&#039;;&lt;br /&gt;
      uwBar.style.width = Math.min( 100, Math.abs( uw ) / 1000000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      uwBar.style.background = uwColor;&lt;br /&gt;
&lt;br /&gt;
      // Combined ratio&lt;br /&gt;
      crValEl.textContent = cr.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      crValEl.style.color = cr &amp;gt; 100 ? colorNeg : colorPos;&lt;br /&gt;
      if ( cr &amp;gt; 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Above 100% \u2014 underwriting loss&#039;;&lt;br /&gt;
      } else if ( cr === 100 ) {&lt;br /&gt;
        crSub.textContent = &#039;Exactly 100% \u2014 break-even&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        crSub.textContent = &#039;Below 100% \u2014 underwriting profit&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Engine 2: investment&lt;br /&gt;
      invValEl.textContent = fmt( inv );&lt;br /&gt;
      invValEl.style.color = colorInv;&lt;br /&gt;
      invDetail.textContent = &#039;The insurer collects \u20AC5M upfront and pays claims gradually. On average, \u20AC&#039; +&lt;br /&gt;
        wix.formatNumber( avgFloat ) + &#039; sits invested during the year, earning &#039; + ( rate * 100 ).toFixed( 1 ) + &#039;%.&#039;;&lt;br /&gt;
      invBar.style.width = Math.min( 100, inv / 200000 * 100 ) + &#039;%&#039;;&lt;br /&gt;
      invBar.style.background = colorInv;&lt;br /&gt;
&lt;br /&gt;
      // Total&lt;br /&gt;
      totalValEl.textContent = fmt( total );&lt;br /&gt;
      totalValEl.style.color = total &amp;gt;= 0 ? colorPos : colorNeg;&lt;br /&gt;
&lt;br /&gt;
      // Callout&lt;br /&gt;
      if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;gt;= 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;The combined ratio exceeds 100%, so underwriting alone is losing money. But investment income more than covers the gap \u2014 the insurer is still profitable overall.&#039;;&lt;br /&gt;
      } else if ( uw &amp;lt; 0 &amp;amp;&amp;amp; total &amp;lt; 0 ) {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        callout.textContent = &#039;Investment income cannot offset the underwriting loss. The insurer is losing money overall.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        callout.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        callout.textContent = &#039;Both engines are contributing to profit.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Sync scenario buttons&lt;br /&gt;
      scenarioBtns.forEach( function ( btn ) {&lt;br /&gt;
        if ( parseInt( btn.getAttribute( &#039;data-claims&#039; ), 10 ) === claims ) {&lt;br /&gt;
          btn.classList.add( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        } else {&lt;br /&gt;
          btn.classList.remove( &#039;wix-eng-scenario-btn--active&#039; );&lt;br /&gt;
        }&lt;br /&gt;
      } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    claimsSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
    investSlider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    wix.on( strip, &#039;click&#039;, &#039;.wix-eng-scenario-btn&#039;, function ( btn ) {&lt;br /&gt;
      claimsSlider.value = btn.getAttribute( &#039;data-claims&#039; );&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PREMIUM MATCHING&lt;br /&gt;
     Demonstrates the matching principle: front-loaded vs spread&lt;br /&gt;
     revenue recognition for a Madrid insurer.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initPremiumMatching( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MONTHS   = [ &#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,&lt;br /&gt;
                     &#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039; ];&lt;br /&gt;
    var PREMIUM  = 1200;&lt;br /&gt;
    var MONTHLY_EXPENSE = 80;&lt;br /&gt;
    var EXPENSES = [];&lt;br /&gt;
    var i;&lt;br /&gt;
    for ( i = 0; i &amp;lt; 12; i++ ) {&lt;br /&gt;
      EXPENSES.push( MONTHLY_EXPENSE );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles      = getComputedStyle( container );&lt;br /&gt;
    var colorRev    = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorExp    = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
    var colorProfit = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()  || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorGrid   = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis   = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var mode    = &#039;frontload&#039;;&lt;br /&gt;
    var revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmt( n ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( n ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    // Outer wrapper card&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Mode buttons&lt;br /&gt;
    var btnFrontload = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;All in January&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnMatched = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;Spread evenly (matched)&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [&lt;br /&gt;
      btnFrontload,&lt;br /&gt;
      btnMatched&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards&lt;br /&gt;
    var elRevenue = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( PREMIUM ) } );&lt;br /&gt;
    var elExpense = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val&#039;, textContent: fmt( MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
    var elProfit  = wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-val wix-pm-stat-val--profit&#039;, textContent: fmt( PREMIUM - MONTHLY_EXPENSE * 12 ) } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-stats&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual revenue&#039; } ),&lt;br /&gt;
        elRevenue&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual expenses&#039; } ),&lt;br /&gt;
        elExpense&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pm-stat-label&#039;, textContent: &#039;Annual profit&#039; } ),&lt;br /&gt;
        elProfit&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--rev&#039; } ),&lt;br /&gt;
        &#039;Revenue&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--exp&#039; } ),&lt;br /&gt;
        &#039;Expenses&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch wix-pm-swatch--profit&#039; } ),&lt;br /&gt;
        &#039;Profit / loss&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Insight callout&lt;br /&gt;
    var insightEl = wix.el( &#039;div&#039;, { className: &#039;wix-eng-callout wix-eng-callout--profit&#039; } );&lt;br /&gt;
    wrapper.appendChild( insightEl );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing (vanilla canvas) ──────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart() {&lt;br /&gt;
      var profit = [];&lt;br /&gt;
      for ( var idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        profit.push( revenue[ idx ] - EXPENSES[ idx ] );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 16, b: 28, l: 48, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Value range&lt;br /&gt;
      var allVals = revenue.concat( EXPENSES ).concat( profit );&lt;br /&gt;
      var yMax = Math.max.apply( null, allVals ) + 100;&lt;br /&gt;
      var yMin = Math.min.apply( null, allVals ) - 60;&lt;br /&gt;
      var range = yMax - yMin || 1;&lt;br /&gt;
&lt;br /&gt;
      // Y-axis helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * ( v - yMin ) / range );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid lines + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMin + range * i / gridSteps;&lt;br /&gt;
        var gy = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, gy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, gy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( &#039;\u20AC&#039; + Math.round( gv ), pad.l - 6, gy + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Zero line (if visible)&lt;br /&gt;
      if ( yMin &amp;lt; 0 &amp;amp;&amp;amp; yMax &amp;gt; 0 ) {&lt;br /&gt;
        var zy = yPos( 0 );&lt;br /&gt;
        ctx.strokeStyle = colorAxis;&lt;br /&gt;
        ctx.lineWidth = 0.8;&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, zy );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, zy );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.strokeStyle = colorGrid;&lt;br /&gt;
        ctx.lineWidth = 0.5;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Bar drawing&lt;br /&gt;
      var groupWidth = cw / 12;&lt;br /&gt;
      var barWidth   = Math.max( 2, ( groupWidth - 8 ) / 3 );&lt;br /&gt;
      var gap        = 2;&lt;br /&gt;
&lt;br /&gt;
      for ( idx = 0; idx &amp;lt; 12; idx++ ) {&lt;br /&gt;
        var gx = pad.l + groupWidth * idx + ( groupWidth - ( barWidth * 3 + gap * 2 ) ) / 2;&lt;br /&gt;
        var zeroY = yPos( 0 );&lt;br /&gt;
&lt;br /&gt;
        // Revenue bar&lt;br /&gt;
        var ry = yPos( revenue[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorRev;&lt;br /&gt;
        ctx.fillRect( gx, Math.min( ry, zeroY ), barWidth, Math.abs( ry - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Expense bar&lt;br /&gt;
        var ey = yPos( EXPENSES[ idx ] );&lt;br /&gt;
        ctx.fillStyle = colorExp;&lt;br /&gt;
        ctx.fillRect( gx + barWidth + gap, Math.min( ey, zeroY ), barWidth, Math.abs( ey - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // Profit / loss bar (single color to avoid confusion with expenses)&lt;br /&gt;
        var pv = profit[ idx ];&lt;br /&gt;
        var py = yPos( pv );&lt;br /&gt;
        ctx.fillStyle = colorProfit;&lt;br /&gt;
        ctx.fillRect( gx + ( barWidth + gap ) * 2, Math.min( py, zeroY ), barWidth, Math.abs( py - zeroY ) || 1 );&lt;br /&gt;
&lt;br /&gt;
        // X label&lt;br /&gt;
        ctx.fillStyle = colorAxis;&lt;br /&gt;
        ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
        ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx.fillText( MONTHS[ idx ], pad.l + groupWidth * idx + groupWidth / 2, h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      drawChart();&lt;br /&gt;
&lt;br /&gt;
      if ( mode === &#039;frontload&#039; ) {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--loss&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;January shows \u20AC1,120 profit while every other month shows an \u20AC80 loss \u2014 yet the underlying economics are perfectly steady. The annual profit is still \u20AC240 either way, but the monthly picture is wildly misleading. This is the distortion the matching principle prevents.&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        insightEl.className = &#039;wix-eng-callout wix-eng-callout--profit&#039;;&lt;br /&gt;
        insightEl.textContent = &#039;Revenue and expenses are aligned in every month: \u20AC100 of revenue minus \u20AC80 of expenses gives a steady \u20AC20 profit. The monthly picture now faithfully reflects the economics of the contract. This is proper matching.&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function setMode( m ) {&lt;br /&gt;
      mode = m;&lt;br /&gt;
      if ( m === &#039;frontload&#039; ) {&lt;br /&gt;
        revenue = [ PREMIUM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];&lt;br /&gt;
        btnFrontload.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnMatched.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        revenue = [];&lt;br /&gt;
        for ( var j = 0; j &amp;lt; 12; j++ ) {&lt;br /&gt;
          revenue.push( 100 );&lt;br /&gt;
        }&lt;br /&gt;
        btnMatched.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnFrontload.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      update();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnFrontload.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;frontload&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnMatched.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      setMode( &#039;matched&#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, drawChart );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Initial Render ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    setMode( &#039;frontload&#039; );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     RESERVE SENSITIVITY&lt;br /&gt;
     Slider showing how reserve reassessments flow through to P&amp;amp;L&lt;br /&gt;
     and shareholders&#039; equity.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initReserveSensitivity( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var RESERVES = 90;   // €bn&lt;br /&gt;
    var EQUITY   = 50;   // €bn&lt;br /&gt;
    var TAX      = 0.25;&lt;br /&gt;
    var MAX_PCT  = 10;   // bar scale cap&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorPos = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim() || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorNeg = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()   || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Formatting ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function fmtBn( v ) {&lt;br /&gt;
      var abs = Math.abs( v );&lt;br /&gt;
      return abs &amp;gt;= 1 ? abs.toFixed( 1 ) : abs.toFixed( 2 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;-5&#039;, max: &#039;5&#039;, value: &#039;2&#039;, step: &#039;0.5&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Reserve reassessment&#039; } ) );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;-5%&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-rs-bound&#039;, textContent: &#039;+5%&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 1: P&amp;amp;L impact&lt;br /&gt;
    var elPretax   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elAftertax = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Pre-tax P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elPretax&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;After-tax (25%) P&amp;amp;L impact&#039; } ),&lt;br /&gt;
        elAftertax&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards — row 2: reserves&lt;br /&gt;
    var elNewRes = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (original)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC90.0bn&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Reserves (revised)&#039; } ),&lt;br /&gt;
        elNewRes&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Bar charts&lt;br /&gt;
    var bar1Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
    var bar2Fill = wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-fill&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-rs-bars&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Reserve reassessment&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar1Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-label&#039;, textContent: &#039;Impact on shareholders\u2019 equity (\u20AC50bn)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-track&#039; }, [&lt;br /&gt;
          wix.el( &#039;div&#039;, { className: &#039;wix-rs-bar-center&#039; } ),&lt;br /&gt;
          bar2Fill&lt;br /&gt;
        ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Bar Helper ──────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setBar( el, pct, color ) {&lt;br /&gt;
      var clamped = wix.clamp( pct, -MAX_PCT, MAX_PCT );&lt;br /&gt;
      var w = Math.abs( clamped ) / MAX_PCT * 50;&lt;br /&gt;
&lt;br /&gt;
      if ( clamped &amp;gt;= 0 ) {&lt;br /&gt;
        el.style.left = &#039;50%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;0 var(--wix-radius) var(--wix-radius) 0&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        el.style.left = ( 50 - w ) + &#039;%&#039;;&lt;br /&gt;
        el.style.width = w + &#039;%&#039;;&lt;br /&gt;
        el.style.borderRadius = &#039;var(--wix-radius) 0 0 var(--wix-radius)&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      el.style.background = color;&lt;br /&gt;
      var label = ( pct &amp;gt;= 0 ? &#039;+&#039; : &#039;&#039; ) + pct.toFixed( 1 ) + &#039;%&#039;;&lt;br /&gt;
      el.textContent = Math.abs( pct ) &amp;gt;= 0.5 ? label : &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var p = parseFloat( slider.value );&lt;br /&gt;
      var delta    = RESERVES * p / 100;&lt;br /&gt;
      var pretax   = -delta;&lt;br /&gt;
      var aftertax = pretax * ( 1 - TAX );&lt;br /&gt;
&lt;br /&gt;
      // P&amp;amp;L cards&lt;br /&gt;
      var sign;&lt;br /&gt;
&lt;br /&gt;
      sign = pretax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elPretax.textContent = sign + &#039;\u20AC&#039; + fmtBn( pretax ) + &#039;bn&#039;;&lt;br /&gt;
      elPretax.className = &#039;wix-rs-card-num&#039; + ( pretax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : pretax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      sign = aftertax &amp;gt;= 0 ? &#039;+&#039; : &#039;-&#039;;&lt;br /&gt;
      elAftertax.textContent = sign + &#039;\u20AC&#039; + fmtBn( aftertax ) + &#039;bn&#039;;&lt;br /&gt;
      elAftertax.className = &#039;wix-rs-card-num&#039; + ( aftertax &amp;gt; 0 ? &#039; wix-rs-card-num--pos&#039; : aftertax &amp;lt; 0 ? &#039; wix-rs-card-num--neg&#039; : &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
      // Revised reserves&lt;br /&gt;
      elNewRes.textContent = &#039;\u20AC&#039; + ( RESERVES + delta ).toFixed( 1 ) + &#039;bn&#039;;&lt;br /&gt;
&lt;br /&gt;
      // Bars&lt;br /&gt;
      var resPct = p;&lt;br /&gt;
      var eqPct  = aftertax / EQUITY * 100;&lt;br /&gt;
      setBar( bar1Fill, resPct, p &amp;lt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
      setBar( bar2Fill, eqPct, aftertax &amp;gt;= 0 ? colorPos : colorNeg );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     IFRS TIMELINE&lt;br /&gt;
     Interactive horizontal timeline of IFRS / insurance-accounting&lt;br /&gt;
     milestones.  Events are read from a data-wix-events JSON attribute.&lt;br /&gt;
     Each event: { year, cat (&amp;quot;ifrs&amp;quot;|&amp;quot;ins&amp;quot;), title, body }&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initIfrsTimeline( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read events from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-events&#039;, &#039;[]&#039; );&lt;br /&gt;
    var events;&lt;br /&gt;
    try {&lt;br /&gt;
      events = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !events.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens + category overrides) ────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorIfrs = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim() || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorIns  = styles.getPropertyValue( &#039;--wix-wrong&#039; ).trim()  || &#039;#922b21&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var active = 0;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Timeline track&lt;br /&gt;
    var line   = wix.el( &#039;div&#039;, { className: &#039;wix-tl-line&#039; } );&lt;br /&gt;
    var dotsEl = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dots&#039; } );&lt;br /&gt;
    var track  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-track&#039; }, [ line, dotsEl ] );&lt;br /&gt;
    wrapper.appendChild( track );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var cardTitle = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-title&#039; } );&lt;br /&gt;
    var cardBody  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card-body&#039; } );&lt;br /&gt;
    var card      = wix.el( &#039;div&#039;, { className: &#039;wix-tl-card&#039; }, [ cardTitle, cardBody ] );&lt;br /&gt;
    wrapper.appendChild( card );&lt;br /&gt;
&lt;br /&gt;
    // Legend&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-legend&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ifrs&#039; } ),&lt;br /&gt;
        &#039;IFRS programme&#039;&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-item&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-tl-legend-dot wix-tl-legend-dot--ins&#039; } ),&lt;br /&gt;
        &#039;Insurance-specific&#039;&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Navigation buttons&lt;br /&gt;
    var btnPrev = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Previous&#039; } );&lt;br /&gt;
    var btnNext = wix.el( &#039;button&#039;, { className: &#039;wix-btn wix-btn--outline&#039;, textContent: &#039;Next&#039; } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-tl-nav&#039; }, [ btnPrev, btnNext ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Render ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function render() {&lt;br /&gt;
      wix.empty( dotsEl );&lt;br /&gt;
&lt;br /&gt;
      events.forEach( function ( ev, i ) {&lt;br /&gt;
        var dot  = wix.el( &#039;div&#039;, { className: &#039;wix-tl-dot&#039; } );&lt;br /&gt;
        var year = wix.el( &#039;span&#039;, { className: &#039;wix-tl-year&#039;, textContent: ev.year } );&lt;br /&gt;
&lt;br /&gt;
        var cls = &#039;wix-tl-dot-wrap&#039;;&lt;br /&gt;
        if ( ev.cat === &#039;ins&#039; ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--ins&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if ( i === active ) {&lt;br /&gt;
          cls += &#039; wix-tl-dot-wrap--active&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var wrap = wix.el( &#039;div&#039;, { className: cls }, [ dot, year ] );&lt;br /&gt;
        wrap.setAttribute( &#039;data-idx&#039;, String( i ) );&lt;br /&gt;
        dotsEl.appendChild( wrap );&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      // Card content&lt;br /&gt;
      var ev = events[ active ];&lt;br /&gt;
      cardTitle.textContent = ev.title;&lt;br /&gt;
      cardBody.textContent  = ev.body;&lt;br /&gt;
&lt;br /&gt;
      // Card accent border color&lt;br /&gt;
      card.style.borderLeftColor = ev.cat === &#039;ins&#039; ? colorIns : colorIfrs;&lt;br /&gt;
&lt;br /&gt;
      // Button states&lt;br /&gt;
      btnPrev.disabled = active === 0;&lt;br /&gt;
      btnNext.disabled = active === events.length - 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.on( dotsEl, &#039;click&#039;, &#039;.wix-tl-dot-wrap&#039;, function ( target ) {&lt;br /&gt;
      var idx = parseInt( target.getAttribute( &#039;data-idx&#039; ), 10 );&lt;br /&gt;
      if ( !isNaN( idx ) ) {&lt;br /&gt;
        active = idx;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnPrev.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;gt; 0 ) {&lt;br /&gt;
        active--;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    btnNext.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
      if ( active &amp;lt; events.length - 1 ) {&lt;br /&gt;
        active++;&lt;br /&gt;
        render();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     LIABILITY WATERFALL&lt;br /&gt;
     Decomposes a single insurance liability number into its IFRS 17&lt;br /&gt;
     building blocks via a waterfall chart.&lt;br /&gt;
     Blocks are read from data-wix-blocks JSON; each entry has:&lt;br /&gt;
       label, short, value, color, titleColor, question, body&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initLiabilityWaterfall( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles    = getComputedStyle( container );&lt;br /&gt;
    var colorText = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorGrid = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart constants ─────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var MAX_VAL = 850;&lt;br /&gt;
    var PAD     = { t: 40, b: 50, l: 20, r: 20 };&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var view     = &#039;old&#039;;&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hovered  = -1;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Toggle buttons&lt;br /&gt;
    var btnOld = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn wix-pm-mode-btn--active&#039;,&lt;br /&gt;
      textContent: &#039;Old world&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var btnNew = wix.el( &#039;button&#039;, {&lt;br /&gt;
      className: &#039;wix-pm-mode-btn&#039;,&lt;br /&gt;
      textContent: &#039;IFRS 17&#039;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pm-modes&#039; }, [ btnOld, btnNew ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-wf-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 290;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function yForVal( v ) {&lt;br /&gt;
      return PAD.t + ( 1 - v / MAX_VAL ) * ( H - PAD.t - PAD.b );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── roundRect polyfill for older browsers ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        drawOldWorld( ctx2 );&lt;br /&gt;
      } else {&lt;br /&gt;
        drawWaterfall( ctx2 );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawOldWorld( ctx2 ) {&lt;br /&gt;
      var bw  = Math.min( 160, W * 0.3 );&lt;br /&gt;
      var x   = ( W - bw ) / 2;&lt;br /&gt;
      var top = yForVal( 800 );&lt;br /&gt;
      var bot = yForVal( 0 );&lt;br /&gt;
      var h   = bot - top;&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = hovered === 0 ? &#039;#7A7A73&#039; : &#039;#888780&#039;;&lt;br /&gt;
      roundRect( ctx2, x, top, bw, h, 6 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle   = &#039;#fff&#039;;&lt;br /&gt;
      ctx2.font        = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC800m&#039;, x + bw / 2, top + h / 2 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorText;&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;Insurance liabilities&#039;, x + bw / 2, bot + 20 );&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorGrid;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( &#039;What\u2019s inside?&#039;, x + bw / 2, bot + 38 );&lt;br /&gt;
&lt;br /&gt;
      hitAreas.push( { x: x, y: top, w: bw, h: h, idx: 0 } );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function drawWaterfall( ctx2 ) {&lt;br /&gt;
      var n       = blocks.length;&lt;br /&gt;
      var usable  = W - PAD.l - PAD.r;&lt;br /&gt;
      var bw      = usable / ( n + ( n - 1 ) * 0.5 );&lt;br /&gt;
      var gap     = bw * 0.5;&lt;br /&gt;
      var running = 0;&lt;br /&gt;
      var i, b, x, top, bot, barH, prevRunning, connY, lines, li;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        b = blocks[ i ];&lt;br /&gt;
        x = PAD.l + i * ( bw + gap );&lt;br /&gt;
&lt;br /&gt;
        if ( i &amp;lt; n - 1 ) {&lt;br /&gt;
          prevRunning = running;&lt;br /&gt;
          running += b.value;&lt;br /&gt;
          if ( b.value &amp;gt;= 0 ) {&lt;br /&gt;
            top = yForVal( running );&lt;br /&gt;
            bot = yForVal( prevRunning );&lt;br /&gt;
          } else {&lt;br /&gt;
            top = yForVal( prevRunning );&lt;br /&gt;
            bot = yForVal( running );&lt;br /&gt;
          }&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        } else {&lt;br /&gt;
          // Total bar: full height from 0 to total&lt;br /&gt;
          top  = yForVal( running );&lt;br /&gt;
          bot  = yForVal( 0 );&lt;br /&gt;
          barH = bot - top;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Bar&lt;br /&gt;
        ctx2.globalAlpha = ( hovered === i || selected === i ) ? 0.85 : 1;&lt;br /&gt;
        ctx2.fillStyle = b.color;&lt;br /&gt;
        roundRect( ctx2, x, top, bw, barH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
        ctx2.globalAlpha = 1;&lt;br /&gt;
&lt;br /&gt;
        // Value label&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
        if ( barH &amp;gt; 24 ) {&lt;br /&gt;
          ctx2.fillStyle = &#039;#fff&#039;;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top + barH / 2 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.color;&lt;br /&gt;
          ctx2.font      = &#039;500 12px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.short, x + bw / 2, top - 10 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Dashed connector to previous bar&lt;br /&gt;
        if ( i &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; n - 1 ) {&lt;br /&gt;
          connY = b.value &amp;gt;= 0 ? yForVal( running - b.value ) : yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( PAD.l + ( i - 1 ) * ( bw + gap ) + bw, connY );&lt;br /&gt;
          ctx2.lineTo( x, connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Connector from last component to total&lt;br /&gt;
        if ( i === n - 2 ) {&lt;br /&gt;
          connY = yForVal( running );&lt;br /&gt;
          ctx2.strokeStyle = colorGrid;&lt;br /&gt;
          ctx2.setLineDash( [ 3, 3 ] );&lt;br /&gt;
          ctx2.lineWidth   = 1;&lt;br /&gt;
          ctx2.beginPath();&lt;br /&gt;
          ctx2.moveTo( x + bw, connY );&lt;br /&gt;
          ctx2.lineTo( PAD.l + ( n - 1 ) * ( bw + gap ), connY );&lt;br /&gt;
          ctx2.stroke();&lt;br /&gt;
          ctx2.setLineDash( [] );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // X-axis label (supports \n line breaks)&lt;br /&gt;
        ctx2.fillStyle   = colorText;&lt;br /&gt;
        ctx2.font        = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
        ctx2.textAlign   = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;top&#039;;&lt;br /&gt;
        lines = b.label.split( &#039;\n&#039; );&lt;br /&gt;
        for ( li = 0; li &amp;lt; lines.length; li++ ) {&lt;br /&gt;
          ctx2.fillText( lines[ li ], x + bw / 2, bot + 10 + li * 14 );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: x, y: top, w: bw, h: barH, idx: i } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      if ( view === &#039;old&#039; ) {&lt;br /&gt;
        detailTitle.textContent = &#039;One opaque number&#039;;&lt;br /&gt;
        detailTitle.style.color = &#039;#444441&#039;;&lt;br /&gt;
        detailBody.textContent  = &#039;Under the old rules, this single figure hides everything: expected claims, time value adjustments, uncertainty buffers, and unearned profit. No way to tell what drives it or how it might change.&#039;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.titleColor || &#039;&#039;;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      var i, a;&lt;br /&gt;
&lt;br /&gt;
      for ( i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── View Toggle ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function setView( v ) {&lt;br /&gt;
      view = v;&lt;br /&gt;
      selected = 0;&lt;br /&gt;
      hovered  = -1;&lt;br /&gt;
&lt;br /&gt;
      if ( v === &#039;old&#039; ) {&lt;br /&gt;
        btnOld.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnNew.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      } else {&lt;br /&gt;
        btnNew.classList.add( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
        btnOld.classList.remove( &#039;wix-pm-mode-btn--active&#039; );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      draw();&lt;br /&gt;
      renderDetail();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    btnOld.addEventListener( &#039;click&#039;, function () { setView( &#039;old&#039; ); } );&lt;br /&gt;
    btnNew.addEventListener( &#039;click&#039;, function () { setView( &#039;new&#039; ); } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h !== hovered ) {&lt;br /&gt;
        hovered = h;&lt;br /&gt;
        canvas.style.cursor = h &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mouseleave&#039;, function () {&lt;br /&gt;
      hovered = -1;&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        renderDetail();&lt;br /&gt;
        draw();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     PROB-WEIGHTED&lt;br /&gt;
     Probability-weighted estimate calculator.&lt;br /&gt;
     Two scenarios (quiet year / major flood) with an adjustable&lt;br /&gt;
     flood probability slider.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initProbWeighted( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var QUIET = 8;   // €m&lt;br /&gt;
    var FLOOD = 40;  // €m&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var COLOR_QUIET_BG  = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_QUIET_FG  = &#039;#0C447C&#039;;&lt;br /&gt;
    var COLOR_FLOOD_BG  = &#039;#fadbd8&#039;;&lt;br /&gt;
    var COLOR_FLOOD_FG  = &#039;#791F1F&#039;;&lt;br /&gt;
    var COLOR_RESULT_BG = &#039;#d4e6f1&#039;;&lt;br /&gt;
    var COLOR_RESULT_FG = &#039;#1a5276&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;50&#039;, value: &#039;10&#039;, step: &#039;1&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;span&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Flood probability&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Scenario cards row&lt;br /&gt;
    var elQuietVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;\u20AC8m&#039; } );&lt;br /&gt;
    var elFloodVal = wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-val&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;\u20AC40m&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-calc&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_QUIET_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;Quiet year&#039; } ),&lt;br /&gt;
        elQuietVal&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-op&#039;, textContent: &#039;+&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene&#039;, style: { background: COLOR_FLOOD_BG } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-scene-title&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;Major flood&#039; } ),&lt;br /&gt;
        elFloodVal&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Probability row (x multipliers)&lt;br /&gt;
    var elQuietPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_QUIET_FG }, textContent: &#039;90%&#039; } );&lt;br /&gt;
    var elFloodPct = wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-num&#039;, style: { color: COLOR_FLOOD_FG }, textContent: &#039;10%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_QUIET_BG } }, [ elQuietPct ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039; ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { style: { textAlign: &#039;center&#039; } }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-mult-x&#039;, textContent: &#039;\u00D7&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-pw-prob&#039;, style: { background: COLOR_FLOOD_BG } }, [ elFloodPct ] )&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Equals sign&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-eq&#039; }, [&lt;br /&gt;
      wix.el( &#039;span&#039;, { className: &#039;wix-pw-eq-sign&#039;, textContent: &#039;=&#039; } )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Result card&lt;br /&gt;
    var elWeighted = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-num&#039; } );&lt;br /&gt;
    var elVs       = wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-vs&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-pw-result&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pw-result-label&#039;, textContent: &#039;Probability-weighted estimate&#039; } ),&lt;br /&gt;
      elWeighted,&lt;br /&gt;
      elVs&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update Logic ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var fp = parseInt( slider.value, 10 );&lt;br /&gt;
      var qp = 100 - fp;&lt;br /&gt;
&lt;br /&gt;
      sliderVal.textContent   = fp + &#039;%&#039;;&lt;br /&gt;
      elQuietPct.textContent  = qp + &#039;%&#039;;&lt;br /&gt;
      elFloodPct.textContent  = fp + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var w  = ( qp / 100 ) * QUIET + ( fp / 100 ) * FLOOD;&lt;br /&gt;
      var wR = Math.round( w * 10 ) / 10;&lt;br /&gt;
&lt;br /&gt;
      elWeighted.textContent = &#039;\u20AC&#039; + wR.toFixed( 1 ) + &#039;m&#039;;&lt;br /&gt;
&lt;br /&gt;
      var mostLikely = qp &amp;gt;= fp ? QUIET : FLOOD;&lt;br /&gt;
      elVs.textContent = &#039;vs. \u20AC&#039; + mostLikely + &#039;m most likely outcome&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     DISCOUNT RATE&lt;br /&gt;
     Discount-rate dashboard: shows how discounting reduces a&lt;br /&gt;
     future claim to present value, with year-by-year unwinding.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initDiscountRate( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Constants ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var CLAIM = 100000;&lt;br /&gt;
    var YEARS = 5;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens) ─────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles     = getComputedStyle( container );&lt;br /&gt;
    var colorPV    = styles.getPropertyValue( &#039;--wix-accent&#039; ).trim()        || &#039;#1a5276&#039;;&lt;br /&gt;
    var colorAccr  = styles.getPropertyValue( &#039;--wix-correct&#039; ).trim()       || &#039;#1e8449&#039;;&lt;br /&gt;
    var colorGrid  = styles.getPropertyValue( &#039;--wix-border-subtle&#039; ).trim() || &#039;#eaecf0&#039;;&lt;br /&gt;
    var colorAxis  = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim()    || &#039;#54595d&#039;;&lt;br /&gt;
    var colorNom   = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()        || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── Helpers ─────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function pv( fv, r, t ) {&lt;br /&gt;
      return fv / Math.pow( 1 + r, t );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmt( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + wix.formatNumber( Math.round( v ) );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fmtK( v ) {&lt;br /&gt;
      return &#039;\u20AC&#039; + Math.round( v / 1000 ) + &#039;k&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Slider row (reuse insurer-engines pattern)&lt;br /&gt;
    var slider = wix.el( &#039;input&#039;, {&lt;br /&gt;
      type: &#039;range&#039;, min: &#039;0&#039;, max: &#039;6&#039;, step: &#039;0.1&#039;, value: &#039;3&#039;&lt;br /&gt;
    } );&lt;br /&gt;
    var sliderVal = wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-val&#039;, textContent: &#039;3.0%&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-row&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-slider-label&#039;, textContent: &#039;Discount rate&#039; } ),&lt;br /&gt;
      slider,&lt;br /&gt;
      sliderVal&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Stat cards (3-column grid, reuse reserve-sensitivity pattern)&lt;br /&gt;
    var elPV   = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
    var elOver = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num&#039; } );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-dr-cards&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Claim (nominal)&#039; } ),&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-num wix-rs-card-num--muted&#039;, textContent: &#039;\u20AC100,000&#039; } )&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Present value today&#039; } ),&lt;br /&gt;
        elPV&lt;br /&gt;
      ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-rs-card&#039; }, [&lt;br /&gt;
        wix.el( &#039;div&#039;, { className: &#039;wix-rs-card-label&#039;, textContent: &#039;Overstatement if no discount&#039; } ),&lt;br /&gt;
        elOver&lt;br /&gt;
      ] )&lt;br /&gt;
    ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Chart + table box (same style as stat cards)&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039; );&lt;br /&gt;
    var tableEl = wix.el( &#039;div&#039;, { className: &#039;wix-dr-table&#039; } );&lt;br /&gt;
&lt;br /&gt;
    var chartBox = wix.el( &#039;div&#039;, { className: &#039;wix-rs-card wix-dr-box&#039; }, [&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-eng-section-label&#039;, textContent: &#039;Liability unwinding \u2014 year by year&#039; } ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-dr-chart&#039; }, [ canvas ] ),&lt;br /&gt;
      wix.el( &#039;div&#039;, { className: &#039;wix-pm-legend&#039; }, [&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorPV } } ),&lt;br /&gt;
          &#039;Present value&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-pm-swatch&#039;, style: { background: colorAccr } } ),&lt;br /&gt;
          &#039;Annual accretion&#039;&lt;br /&gt;
        ] ),&lt;br /&gt;
        wix.el( &#039;span&#039;, { className: &#039;wix-pm-legend-item&#039; }, [&lt;br /&gt;
          wix.el( &#039;span&#039;, { className: &#039;wix-dr-nom-swatch&#039; } ),&lt;br /&gt;
          &#039;Nominal (\u20AC100,000)&#039;&lt;br /&gt;
        ] )&lt;br /&gt;
      ] ),&lt;br /&gt;
      tableEl&lt;br /&gt;
    ] );&lt;br /&gt;
&lt;br /&gt;
    wrapper.appendChild( chartBox );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Chart Drawing ───────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function drawChart( pvs, accretions ) {&lt;br /&gt;
      var ctx = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      var dpr = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
      if ( rect.width === 0 || rect.height === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      canvas.width  = rect.width * dpr;&lt;br /&gt;
      canvas.height = rect.height * dpr;&lt;br /&gt;
      ctx.scale( dpr, dpr );&lt;br /&gt;
&lt;br /&gt;
      var w = rect.width;&lt;br /&gt;
      var h = rect.height;&lt;br /&gt;
      var pad = { t: 12, b: 28, l: 50, r: 12 };&lt;br /&gt;
      var cw = w - pad.l - pad.r;&lt;br /&gt;
      var ch = h - pad.t - pad.b;&lt;br /&gt;
      var yMax = 105000;&lt;br /&gt;
      var n = YEARS + 1;&lt;br /&gt;
&lt;br /&gt;
      ctx.clearRect( 0, 0, w, h );&lt;br /&gt;
&lt;br /&gt;
      // Y helper&lt;br /&gt;
      function yPos( v ) {&lt;br /&gt;
        return pad.t + ch - ( ch * v / yMax );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      function xPos( i ) {&lt;br /&gt;
        return pad.l + ( cw * i / ( n - 1 ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Grid + Y labels&lt;br /&gt;
      ctx.strokeStyle = colorGrid;&lt;br /&gt;
      ctx.lineWidth = 0.5;&lt;br /&gt;
      ctx.fillStyle = colorAxis;&lt;br /&gt;
      ctx.font = &#039;11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx.textAlign = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
      var gridSteps = 5;&lt;br /&gt;
      var i, y;&lt;br /&gt;
      for ( i = 0; i &amp;lt;= gridSteps; i++ ) {&lt;br /&gt;
        var gv = yMax * i / gridSteps;&lt;br /&gt;
        y = yPos( gv );&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo( pad.l, y );&lt;br /&gt;
        ctx.lineTo( pad.l + cw, y );&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.fillText( fmtK( gv ), pad.l - 6, y + 4 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // X labels&lt;br /&gt;
      ctx.textAlign = &#039;center&#039;;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.fillText( &#039;Year &#039; + i, xPos( i ), h - 6 );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Nominal dashed line&lt;br /&gt;
      ctx.strokeStyle = colorNom;&lt;br /&gt;
      ctx.lineWidth = 1;&lt;br /&gt;
      ctx.setLineDash( [ 4, 4 ] );&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.moveTo( pad.l, yPos( CLAIM ) );&lt;br /&gt;
      ctx.lineTo( pad.l + cw, yPos( CLAIM ) );&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
      ctx.setLineDash( [] );&lt;br /&gt;
&lt;br /&gt;
      // Accretion bars&lt;br /&gt;
      var barWidth = Math.min( 30, cw / n * 0.45 );&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        if ( accretions[ i ] &amp;lt;= 0 ) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        var bx = xPos( i ) - barWidth / 2;&lt;br /&gt;
        var by = yPos( accretions[ i ] );&lt;br /&gt;
        var bh = yPos( 0 ) - by;&lt;br /&gt;
&lt;br /&gt;
        ctx.fillStyle = colorAccr + &#039;66&#039;;&lt;br /&gt;
        ctx.fillRect( bx, by, barWidth, bh );&lt;br /&gt;
        ctx.strokeStyle = colorAccr;&lt;br /&gt;
        ctx.lineWidth = 1;&lt;br /&gt;
        ctx.strokeRect( bx, by, barWidth, bh );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // PV line&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.strokeStyle = colorPV;&lt;br /&gt;
      ctx.lineWidth = 2;&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        var px = xPos( i );&lt;br /&gt;
        var py = yPos( pvs[ i ] );&lt;br /&gt;
        if ( i === 0 ) {&lt;br /&gt;
          ctx.moveTo( px, py );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx.lineTo( px, py );&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      ctx.stroke();&lt;br /&gt;
&lt;br /&gt;
      // PV dots&lt;br /&gt;
      for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.arc( xPos( i ), yPos( pvs[ i ] ), 4, 0, Math.PI * 2 );&lt;br /&gt;
        ctx.fillStyle = colorPV;&lt;br /&gt;
        ctx.fill();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Table ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function buildTable( pvs, accretions ) {&lt;br /&gt;
      wix.empty( tableEl );&lt;br /&gt;
&lt;br /&gt;
      var thead = wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Year&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Remaining&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Present value&#039; } ),&lt;br /&gt;
        wix.el( &#039;th&#039;, { textContent: &#039;Accretion&#039; } )&lt;br /&gt;
      ] );&lt;br /&gt;
&lt;br /&gt;
      var table = wix.el( &#039;table&#039;, { className: &#039;wix-dr-tbl&#039; }, [ thead ] );&lt;br /&gt;
&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        table.appendChild( wix.el( &#039;tr&#039;, {}, [&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: &#039;Year &#039; + yr } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: ( YEARS - yr ) + &#039; yr&#039; } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: fmt( pvs[ yr ] ) } ),&lt;br /&gt;
          wix.el( &#039;td&#039;, { textContent: yr === 0 ? &#039;\u2014&#039; : fmt( accretions[ yr ] ) } )&lt;br /&gt;
        ] ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      tableEl.appendChild( table );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Update ──────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
      var r = parseFloat( slider.value ) / 100;&lt;br /&gt;
      sliderVal.textContent = slider.value + &#039;%&#039;;&lt;br /&gt;
&lt;br /&gt;
      var todayPV = pv( CLAIM, r, YEARS );&lt;br /&gt;
      elPV.textContent   = fmt( todayPV );&lt;br /&gt;
      elOver.textContent = fmt( CLAIM - todayPV );&lt;br /&gt;
&lt;br /&gt;
      var pvs = [];&lt;br /&gt;
      var accretions = [];&lt;br /&gt;
      for ( var yr = 0; yr &amp;lt;= YEARS; yr++ ) {&lt;br /&gt;
        var remaining = YEARS - yr;&lt;br /&gt;
        var val = pv( CLAIM, r, remaining );&lt;br /&gt;
        pvs.push( Math.round( val ) );&lt;br /&gt;
        accretions.push( yr === 0 ? 0 : Math.round( val - pv( CLAIM, r, remaining + 1 ) ) );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      drawChart( pvs, accretions );&lt;br /&gt;
      buildTable( pvs, accretions );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    slider.addEventListener( &#039;input&#039;, update );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      update();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    update();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  /* ================================================================&lt;br /&gt;
     BALANCE SHEET&lt;br /&gt;
     IFRS 17 balance sheet: two-column stacked bar (assets vs&lt;br /&gt;
     liabilities) with click-to-explore detail card and brackets.&lt;br /&gt;
     Blocks read from data-wix-blocks JSON attribute.&lt;br /&gt;
     ================================================================ */&lt;br /&gt;
&lt;br /&gt;
  function initBalanceSheet( container ) {&lt;br /&gt;
&lt;br /&gt;
    /* ── Read blocks from data attribute ─────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var raw = wix.data( container, &#039;wix-blocks&#039;, &#039;[]&#039; );&lt;br /&gt;
    var blocks;&lt;br /&gt;
    try {&lt;br /&gt;
      blocks = JSON.parse( raw );&lt;br /&gt;
    } catch ( e ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( !blocks.length ) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var TOTAL = blocks[ 0 ].val;&lt;br /&gt;
&lt;br /&gt;
    /* ── Colors (WIX tokens for brackets/axis) ───────────────── */&lt;br /&gt;
&lt;br /&gt;
    var styles   = getComputedStyle( container );&lt;br /&gt;
    var colorAxis = styles.getPropertyValue( &#039;--wix-text-muted&#039; ).trim() || &#039;#54595d&#039;;&lt;br /&gt;
    var colorLine = styles.getPropertyValue( &#039;--wix-border&#039; ).trim()     || &#039;#c8ccd1&#039;;&lt;br /&gt;
&lt;br /&gt;
    /* ── State ───────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    var selected = 0;&lt;br /&gt;
    var hitAreas = [];&lt;br /&gt;
    var W, H;&lt;br /&gt;
&lt;br /&gt;
    /* ── Build UI ────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    wix.empty( container );&lt;br /&gt;
&lt;br /&gt;
    var wrapper = wix.el( &#039;div&#039;, { className: &#039;wix-eng-wrapper&#039; } );&lt;br /&gt;
    container.appendChild( wrapper );&lt;br /&gt;
&lt;br /&gt;
    // Canvas&lt;br /&gt;
    var canvas = wix.el( &#039;canvas&#039;, { style: { cursor: &#039;pointer&#039; } } );&lt;br /&gt;
    wrapper.appendChild( wix.el( &#039;div&#039;, { className: &#039;wix-bs-chart&#039; }, [ canvas ] ) );&lt;br /&gt;
&lt;br /&gt;
    // Detail card&lt;br /&gt;
    var detailTitle = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-title&#039; } );&lt;br /&gt;
    var detailBody  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail-body&#039; } );&lt;br /&gt;
    var detailCard  = wix.el( &#039;div&#039;, { className: &#039;wix-wf-detail&#039; }, [ detailTitle, detailBody ] );&lt;br /&gt;
    wrapper.appendChild( detailCard );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Canvas Helpers ──────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function resize() {&lt;br /&gt;
      var dpr  = window.devicePixelRatio || 1;&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      if ( rect.width === 0 ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      W = rect.width;&lt;br /&gt;
      H = 400;&lt;br /&gt;
      canvas.width  = W * dpr;&lt;br /&gt;
      canvas.height = H * dpr;&lt;br /&gt;
      canvas.getContext( &#039;2d&#039; ).setTransform( dpr, 0, 0, dpr, 0, 0 );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* roundRect polyfill */&lt;br /&gt;
    function roundRect( ctx2, x, y, w, h, r ) {&lt;br /&gt;
      if ( ctx2.roundRect ) {&lt;br /&gt;
        ctx2.beginPath();&lt;br /&gt;
        ctx2.roundRect( x, y, w, h, r );&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x + r, y );&lt;br /&gt;
      ctx2.lineTo( x + w - r, y );&lt;br /&gt;
      ctx2.arcTo( x + w, y, x + w, y + r, r );&lt;br /&gt;
      ctx2.lineTo( x + w, y + h - r );&lt;br /&gt;
      ctx2.arcTo( x + w, y + h, x + w - r, y + h, r );&lt;br /&gt;
      ctx2.lineTo( x + r, y + h );&lt;br /&gt;
      ctx2.arcTo( x, y + h, x, y + h - r, r );&lt;br /&gt;
      ctx2.lineTo( x, y + r );&lt;br /&gt;
      ctx2.arcTo( x, y, x + r, y, r );&lt;br /&gt;
      ctx2.closePath();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Bracket with 1 or 2 line label */&lt;br /&gt;
    function drawBracket( ctx2, x, y1, y2, label1, label2 ) {&lt;br /&gt;
      var mid = ( y1 + y2 ) / 2;&lt;br /&gt;
      ctx2.strokeStyle = colorLine;&lt;br /&gt;
      ctx2.lineWidth = 1;&lt;br /&gt;
      ctx2.beginPath();&lt;br /&gt;
      ctx2.moveTo( x, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y1 );&lt;br /&gt;
      ctx2.lineTo( x + 6, y2 );&lt;br /&gt;
      ctx2.lineTo( x, y2 );&lt;br /&gt;
      ctx2.stroke();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.font = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;left&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      if ( label2 ) {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid - 7 );&lt;br /&gt;
        ctx2.fillText( label2, x + 12, mid + 7 );&lt;br /&gt;
      } else {&lt;br /&gt;
        ctx2.fillText( label1, x + 12, mid );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Draw ────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function draw() {&lt;br /&gt;
      var ctx2 = canvas.getContext( &#039;2d&#039; );&lt;br /&gt;
      ctx2.clearRect( 0, 0, W, H );&lt;br /&gt;
      hitAreas = [];&lt;br /&gt;
&lt;br /&gt;
      var padTop  = 30;&lt;br /&gt;
      var padBot  = 10;&lt;br /&gt;
      var padL    = 10;&lt;br /&gt;
      var bracketZone = 150;&lt;br /&gt;
      var colGap  = 8;&lt;br /&gt;
      var colW    = Math.min( 180, ( W - padL - bracketZone - colGap ) / 2 );&lt;br /&gt;
      var chartH  = H - padTop - padBot;&lt;br /&gt;
      var xA      = padL;&lt;br /&gt;
      var xL      = padL + colW + colGap;&lt;br /&gt;
&lt;br /&gt;
      // Column headers&lt;br /&gt;
      ctx2.font      = &#039;400 13px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign = &#039;center&#039;;&lt;br /&gt;
      ctx2.fillStyle = colorAxis;&lt;br /&gt;
      ctx2.fillText( &#039;Assets&#039;, xA + colW / 2, padTop - 10 );&lt;br /&gt;
      ctx2.fillText( &#039;Liabilities&#039;, xL + colW / 2, padTop - 10 );&lt;br /&gt;
&lt;br /&gt;
      // ── Assets column (single block) ──&lt;br /&gt;
      var aBlock = blocks[ 0 ];&lt;br /&gt;
      var isSA = selected === 0;&lt;br /&gt;
      ctx2.fillStyle = isSA ? aBlock.hColor : aBlock.color;&lt;br /&gt;
      roundRect( ctx2, xA, padTop, colW, chartH, 4 );&lt;br /&gt;
      ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx2.fillStyle    = aBlock.textColor;&lt;br /&gt;
      ctx2.font         = &#039;500 15px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
      ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.label, xA + colW / 2, padTop + chartH / 2 - 14 );&lt;br /&gt;
      ctx2.fillStyle = aBlock.subColor;&lt;br /&gt;
      ctx2.font      = &#039;400 12px system-ui, sans-serif&#039;;&lt;br /&gt;
      ctx2.fillText( aBlock.sub, xA + colW / 2, padTop + chartH / 2 + 4 );&lt;br /&gt;
      ctx2.fillText( &#039;\u20AC&#039; + aBlock.val + &#039;m&#039;, xA + colW / 2, padTop + chartH / 2 + 22 );&lt;br /&gt;
      hitAreas.push( { x: xA, y: padTop, w: colW, h: chartH, idx: 0 } );&lt;br /&gt;
&lt;br /&gt;
      // ── Liabilities column (stacked segments) ──&lt;br /&gt;
      var liab     = blocks.slice( 1 );&lt;br /&gt;
      var segGap   = 3;&lt;br /&gt;
      var totalGap = ( liab.length - 1 ) * segGap;&lt;br /&gt;
      var availH   = chartH - totalGap;&lt;br /&gt;
      var y        = padTop;&lt;br /&gt;
      var yPositions = [];&lt;br /&gt;
      var i, b, bH, isSel, midY;&lt;br /&gt;
&lt;br /&gt;
      for ( i = 0; i &amp;lt; liab.length; i++ ) {&lt;br /&gt;
        b  = liab[ i ];&lt;br /&gt;
        bH = ( b.val / TOTAL ) * availH;&lt;br /&gt;
        isSel = selected === i + 1;&lt;br /&gt;
&lt;br /&gt;
        ctx2.fillStyle = isSel ? b.hColor : b.color;&lt;br /&gt;
        roundRect( ctx2, xL, y, colW, bH, 4 );&lt;br /&gt;
        ctx2.fill();&lt;br /&gt;
&lt;br /&gt;
        midY = y + bH / 2;&lt;br /&gt;
        ctx2.textAlign    = &#039;center&#039;;&lt;br /&gt;
        ctx2.textBaseline = &#039;middle&#039;;&lt;br /&gt;
&lt;br /&gt;
        if ( bH &amp;gt; 60 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 10 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.sub, xL + colW / 2, midY + 6 );&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 22 );&lt;br /&gt;
        } else if ( bH &amp;gt; 35 ) {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label, xL + colW / 2, midY - 6 );&lt;br /&gt;
          ctx2.fillStyle = b.subColor;&lt;br /&gt;
          ctx2.font      = &#039;400 11px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( &#039;\u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY + 10 );&lt;br /&gt;
        } else {&lt;br /&gt;
          ctx2.fillStyle = b.textColor;&lt;br /&gt;
          ctx2.font      = &#039;500 14px system-ui, sans-serif&#039;;&lt;br /&gt;
          ctx2.fillText( b.label + &#039;  \u20AC&#039; + b.val + &#039;m&#039;, xL + colW / 2, midY );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        hitAreas.push( { x: xL, y: y, w: colW, h: bH, idx: i + 1 } );&lt;br /&gt;
        yPositions.push( { top: y, bot: y + bH } );&lt;br /&gt;
        y += bH + segGap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // ── Brackets ──&lt;br /&gt;
      var bx1 = xL + colW + 10;&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 1 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 0 ].top + 2, yPositions[ 0 ].bot - 2, &#039;Firm\u2019s funds&#039; );&lt;br /&gt;
      }&lt;br /&gt;
      if ( yPositions.length &amp;gt;= 4 ) {&lt;br /&gt;
        drawBracket( ctx2, bx1, yPositions[ 1 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Technical&#039;, &#039;provisions&#039; );&lt;br /&gt;
        var bx2 = bx1 + 72;&lt;br /&gt;
        drawBracket( ctx2, bx2, yPositions[ 2 ].top + 2, yPositions[ 3 ].bot - 2, &#039;Fulfilment&#039;, &#039;cash flows&#039; );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Detail Card ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function renderDetail() {&lt;br /&gt;
      var b = blocks[ selected ];&lt;br /&gt;
      detailTitle.textContent = b.question;&lt;br /&gt;
      detailTitle.style.color = b.textColor;&lt;br /&gt;
      detailBody.textContent  = b.body;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Hit Testing ─────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    function hitTest( e ) {&lt;br /&gt;
      var rect = canvas.getBoundingClientRect();&lt;br /&gt;
      var mx = e.clientX - rect.left;&lt;br /&gt;
      var my = e.clientY - rect.top;&lt;br /&gt;
      for ( var i = hitAreas.length - 1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
        var a = hitAreas[ i ];&lt;br /&gt;
        if ( mx &amp;gt;= a.x &amp;amp;&amp;amp; mx &amp;lt;= a.x + a.w &amp;amp;&amp;amp; my &amp;gt;= a.y &amp;amp;&amp;amp; my &amp;lt;= a.y + a.h ) {&lt;br /&gt;
          return a.idx;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* ── Event Wiring ────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;mousemove&#039;, function ( e ) {&lt;br /&gt;
      canvas.style.cursor = hitTest( e ) &amp;gt;= 0 ? &#039;pointer&#039; : &#039;default&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    canvas.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
      var h = hitTest( e );&lt;br /&gt;
      if ( h &amp;gt;= 0 ) {&lt;br /&gt;
        selected = h;&lt;br /&gt;
        draw();&lt;br /&gt;
        renderDetail();&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener( &#039;resize&#039;, function () {&lt;br /&gt;
      resize();&lt;br /&gt;
      draw();&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Initial render&lt;br /&gt;
    resize();&lt;br /&gt;
    draw();&lt;br /&gt;
    renderDetail();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22988</id>
		<title>MediaWiki:Gadget-wix-interactive.css</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=MediaWiki:Gadget-wix-interactive.css&amp;diff=22988"/>
		<updated>2026-04-06T14:36:17Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ================================================================&lt;br /&gt;
   WIX-INTERACTIVE.CSS — Wiki Interactive Experience: Complex Widgets&lt;br /&gt;
   ================================================================&lt;br /&gt;
   Loaded via ResourceLoader alongside wix-interactive.js.&lt;br /&gt;
   Depends on design tokens defined in wix-core.css.&lt;br /&gt;
&lt;br /&gt;
   Dispatches styles by widget type. Each widget uses a distinct&lt;br /&gt;
   class prefix (e.g. wix-sim- for simulators).&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   POOL SIMULATOR — data-wix-module=&amp;quot;pool-simulator&amp;quot;&lt;br /&gt;
   Side-by-side comparison: self-insured vs pooled risk.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 1. Panels Grid ──────────────────────────────────────────────&lt;br /&gt;
   Two-column layout for the Alone / Pool panels.&lt;br /&gt;
   Stacks vertically on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panels {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 640px) {&lt;br /&gt;
  .wix-sim-panels {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 2. Panel Base + Variants ────────────────────────────────────&lt;br /&gt;
   Each panel is a card with a colored top border.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--alone {&lt;br /&gt;
  border-top: 3px solid var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-panel--pool {&lt;br /&gt;
  border-top: 3px solid var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 3. Panel Header ─────────────────────────────────────────────&lt;br /&gt;
   Small label + title at top of each panel.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-label--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 4. Stat Boxes ───────────────────────────────────────────────&lt;br /&gt;
   Row of key figures (savings, total spent).&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stats {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-stat-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 5. Chart Area ───────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 140px;&lt;br /&gt;
  margin-top: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 6. Event Log ────────────────────────────────────────────────&lt;br /&gt;
   Single-line status message below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  min-height: 1.25em;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--hit {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-log--safe {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 7. Controls Bar ─────────────────────────────────────────────&lt;br /&gt;
   Flex row: buttons + year display + speed slider.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-year {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 5.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-speed input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  width: 4.5rem;&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 8. Summary ──────────────────────────────────────────────────&lt;br /&gt;
   Results panel shown after the simulation ends.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary {&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  padding: 1.25rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-grid {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr 1fr;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-summary-grid {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--alone {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-heading--pool {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-sim-summary-item {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 9. Mobile Adjustments ───────────────────────────────────────&lt;br /&gt;
   Tighter padding on narrow screens.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-sim-panel {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-sim-stat {&lt;br /&gt;
    padding: 0.4rem 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   INSURER ENGINES — data-wix-module=&amp;quot;insurer-engines&amp;quot;&lt;br /&gt;
   Two-engine profit simulator: underwriting + investment.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 10. Outer Wrapper ───────────────────────────────────────────&lt;br /&gt;
    Single containing card for the entire widget.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-wrapper {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-wrapper {&lt;br /&gt;
    padding: 1rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Fixed Info Row ──────────────────────────────────────────&lt;br /&gt;
    Key facts strip at the top (policies, premiums, expenses).&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 0.35rem 1rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-fixed span {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 11. Scenario Strip ──────────────────────────────────────────&lt;br /&gt;
    Row of preset scenario buttons.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-section-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.4rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-strip {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  padding: 0.55rem 0.5rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  line-height: 1.35;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-scenario-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 12. Slider Rows ─────────────────────────────────────────────&lt;br /&gt;
    Label + range input + value display.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  min-width: 8rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-slider-val {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  min-width: 4rem;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 13. Divider ─────────────────────────────────────────────────&lt;br /&gt;
    Horizontal rule between sections.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-divider {&lt;br /&gt;
  height: 1px;&lt;br /&gt;
  background: var(--wix-border-subtle);&lt;br /&gt;
  margin: 1.25rem 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 14. Engine Cards ────────────────────────────────────────────&lt;br /&gt;
    Underwriting and investment engine displays.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-card {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-detail {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar-track {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-top: 0.6rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-bar {&lt;br /&gt;
  height: 6px;&lt;br /&gt;
  border-radius: 3px;&lt;br /&gt;
  transition: width 0.35s ease, background 0.35s ease;&lt;br /&gt;
  min-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 15. Combined Ratio Box ──────────────────────────────────────&lt;br /&gt;
    Single-line metric between the two engine cards.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
  gap: 0.6rem;&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-cr-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 16. Total Profit Box ────────────────────────────────────────&lt;br /&gt;
    Bottom-line result card.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total {&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 1rem;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-head {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-val {&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-total-sub {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 17. Callout ─────────────────────────────────────────────────&lt;br /&gt;
    Contextual message below the total.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout {&lt;br /&gt;
  padding: 0.65rem 1rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
  border-left: 4px solid transparent;&lt;br /&gt;
  transition:&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition),&lt;br /&gt;
    border-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--profit {&lt;br /&gt;
  background: var(--wix-correct-bg);&lt;br /&gt;
  border-left-color: var(--wix-correct);&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-eng-callout--loss {&lt;br /&gt;
  background: var(--wix-wrong-bg);&lt;br /&gt;
  border-left-color: var(--wix-wrong);&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 18. Insurer Engines Mobile ──────────────────────────────────&lt;br /&gt;
    Adjustments for narrow screens.&lt;br /&gt;
    ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-eng-slider-label {&lt;br /&gt;
    min-width: 6rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-card,&lt;br /&gt;
  .wix-eng-total {&lt;br /&gt;
    padding: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr {&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-eng-cr-sub {&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PREMIUM MATCHING — data-wix-module=&amp;quot;premium-matching&amp;quot;&lt;br /&gt;
   Revenue recognition: front-loaded vs matched.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 19. Mode Toggle Buttons ────────────────────────────────────&lt;br /&gt;
   Row of two mode-selection buttons.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-modes {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn {&lt;br /&gt;
  padding: 0.45rem 0.85rem;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  font: inherit;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    color        var(--wix-transition);&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn:hover {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-mode-btn--active {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 20. Stat Cards Row ─────────────────────────────────────────&lt;br /&gt;
   Three side-by-side metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stats {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, 1fr);&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-stats {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat {&lt;br /&gt;
  background: var(--wix-bg-subtle);&lt;br /&gt;
  border: 1px solid var(--wix-border);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.65rem 0.85rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-stat-val--profit {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 21. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 280px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-pm-chart {&lt;br /&gt;
    height: 220px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 22. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal legend row below the chart.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--rev {&lt;br /&gt;
  background: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--exp {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pm-swatch--profit {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   RESERVE SENSITIVITY — data-wix-module=&amp;quot;reserve-sensitivity&amp;quot;&lt;br /&gt;
   Slider showing reserve reassessment impact on P&amp;amp;L and equity.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 23. Slider Row ─────────────────────────────────────────────&lt;br /&gt;
   Range input flanked by -5% / +5% labels.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-slider-row input[type=&amp;quot;range&amp;quot;] {&lt;br /&gt;
  flex: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bound {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 24. Stat Cards Grid ────────────────────────────────────────&lt;br /&gt;
   Two-column grid of metric cards.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.75rem 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.15rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num {&lt;br /&gt;
  font-size: 1.3em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--pos {&lt;br /&gt;
  color: var(--wix-correct);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--neg {&lt;br /&gt;
  color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-card-num--muted {&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 25. Bar Charts ─────────────────────────────────────────────&lt;br /&gt;
   Horizontal bidirectional bars with a center line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bars {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-top: 1.25rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-rs-bars {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-track {&lt;br /&gt;
  height: 32px;&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-fill {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  transition: left 0.15s ease, width 0.15s ease;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-rs-bar-center {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 50%;&lt;br /&gt;
  width: 1px;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   IFRS TIMELINE — data-wix-module=&amp;quot;ifrs-timeline&amp;quot;&lt;br /&gt;
   Interactive horizontal milestone timeline.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 26. Track ──────────────────────────────────────────────────&lt;br /&gt;
   Horizontal line with positioned dots.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-track {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  margin: 0 0 1.25rem;&lt;br /&gt;
  padding: 0 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-line {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 7px;&lt;br /&gt;
  left: 0.75rem;&lt;br /&gt;
  right: 0.75rem;&lt;br /&gt;
  height: 2px;&lt;br /&gt;
  background: var(--wix-border);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dots {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 27. Dot Wraps ──────────────────────────────────────────────&lt;br /&gt;
   Clickable dot + year label pairs along the track.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-direction: column;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  -webkit-tap-highlight-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot {&lt;br /&gt;
  width: 14px;&lt;br /&gt;
  height: 14px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  border: 2px solid var(--wix-accent);&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  transition:&lt;br /&gt;
    border-color var(--wix-transition),&lt;br /&gt;
    background   var(--wix-transition),&lt;br /&gt;
    transform    var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap:hover .wix-tl-dot {&lt;br /&gt;
  transform: scale(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-accent);&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
  transform: scale(1.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Insurance-specific category */&lt;br /&gt;
.wix-tl-dot-wrap--ins .wix-tl-dot {&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--ins.wix-tl-dot-wrap--active .wix-tl-dot {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
  border-color: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-year {&lt;br /&gt;
  font-size: 0.75em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-dot-wrap--active .wix-tl-year {&lt;br /&gt;
  color: var(--wix-text);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 28. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Content panel shown for the selected event.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-left: 4px solid var(--wix-accent);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  min-height: 4.5rem;&lt;br /&gt;
  transition: border-left-color var(--wix-transition);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-card-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 29. Legend ──────────────────────────────────────────────────&lt;br /&gt;
   Category legend below the card.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-item {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.35rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot {&lt;br /&gt;
  width: 10px;&lt;br /&gt;
  height: 10px;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ifrs {&lt;br /&gt;
  background: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-tl-legend-dot--ins {&lt;br /&gt;
  background: var(--wix-wrong);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 30. Navigation Buttons ─────────────────────────────────────&lt;br /&gt;
   Previous / Next row.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-tl-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 31. Timeline Mobile ────────────────────────────────────────&lt;br /&gt;
   On narrow screens, hide year labels for non-active dots to&lt;br /&gt;
   prevent overlap, and tighten padding.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-tl-dot-wrap:not(.wix-tl-dot-wrap--active) .wix-tl-year {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-track {&lt;br /&gt;
    padding: 0 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .wix-tl-line {&lt;br /&gt;
    left: 0.25rem;&lt;br /&gt;
    right: 0.25rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   LIABILITY WATERFALL — data-wix-module=&amp;quot;liability-waterfall&amp;quot;&lt;br /&gt;
   Waterfall chart decomposing an insurance liability into IFRS 17&lt;br /&gt;
   building blocks.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 32. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 290px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 33. Detail Card ────────────────────────────────────────────&lt;br /&gt;
   Info panel below the chart for the selected block.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail {&lt;br /&gt;
  background: var(--wix-bg);&lt;br /&gt;
  border: 1px solid var(--wix-border-subtle);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  min-height: 3.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-title {&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-wf-detail-body {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   PROB-WEIGHTED — data-wix-module=&amp;quot;prob-weighted&amp;quot;&lt;br /&gt;
   Probability-weighted estimate calculator with two scenarios.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 34. Scenario Calc Grid ─────────────────────────────────────&lt;br /&gt;
   Three-column layout: quiet | + | flood.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-calc {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  align-items: start;&lt;br /&gt;
  margin-bottom: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene {&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-title {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-scene-val {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-op {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  font-size: 1.15em;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  align-self: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 35. Probability Row ────────────────────────────────────────&lt;br /&gt;
   Multiplier row: x quiet% | (spacer) | x flood%.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-row {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: 1fr auto 1fr;&lt;br /&gt;
  gap: 0.5rem;&lt;br /&gt;
  margin-bottom: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-mult-x {&lt;br /&gt;
  font-size: 0.95em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.5rem 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-prob-num {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 36. Equals Sign ────────────────────────────────────────────&lt;br /&gt;
   Centered = between probability row and result.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
  margin-bottom: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-eq-sign {&lt;br /&gt;
  font-size: 1.25em;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 37. Result Card ────────────────────────────────────────────&lt;br /&gt;
   Final probability-weighted estimate.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result {&lt;br /&gt;
  background: var(--wix-accent-light);&lt;br /&gt;
  border-radius: var(--wix-radius);&lt;br /&gt;
  padding: 0.85rem 1rem;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-label {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-num {&lt;br /&gt;
  font-size: 1.5em;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
  margin-bottom: 0.3rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-pw-result-vs {&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
  color: var(--wix-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   DISCOUNT RATE — data-wix-module=&amp;quot;discount-rate&amp;quot;&lt;br /&gt;
   Discount-rate dashboard with chart and table.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 38. Stat Cards (3-column) ──────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-cards {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(3, minmax(0, 1fr));&lt;br /&gt;
  gap: 0.65rem;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-cards {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-box {&lt;br /&gt;
  margin-top: 0.65rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 39. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 260px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-dr-chart {&lt;br /&gt;
    height: 200px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 40. Nominal Legend Swatch ───────────────────────────────────&lt;br /&gt;
   Dashed line swatch for the nominal reference line.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-nom-swatch {&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
  width: 16px;&lt;br /&gt;
  height: 0;&lt;br /&gt;
  border-top: 1.5px dashed var(--wix-border);&lt;br /&gt;
  vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 41. Table ──────────────────────────────────────────────────&lt;br /&gt;
   Year-by-year unwinding table.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-dr-table {&lt;br /&gt;
  margin-top: 0.75rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse;&lt;br /&gt;
  font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th,&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  padding: 0.4rem 0.6rem;&lt;br /&gt;
  border-bottom: 1px solid var(--wix-border-subtle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
  color: var(--wix-text-muted);&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl th:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td {&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-dr-tbl td:first-child {&lt;br /&gt;
  text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ================================================================&lt;br /&gt;
   BALANCE SHEET — data-wix-module=&amp;quot;balance-sheet&amp;quot;&lt;br /&gt;
   Two-column stacked bar: assets vs liabilities with brackets.&lt;br /&gt;
   ================================================================ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ── 42. Chart Area ─────────────────────────────────────────────&lt;br /&gt;
   Canvas wrapper with fixed height.&lt;br /&gt;
   ──────────────────────────────────────────────────────────────── */&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 400px;&lt;br /&gt;
  margin-bottom: 0.5rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wix-bs-chart canvas {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 480px) {&lt;br /&gt;
  .wix-bs-chart {&lt;br /&gt;
    height: 340px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Wix:Training/IFRS17/Free_cash_flows/quiz&amp;diff=22987</id>
		<title>Wix:Training/IFRS17/Free cash flows/quiz</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Wix:Training/IFRS17/Free_cash_flows/quiz&amp;diff=22987"/>
		<updated>2026-04-06T14:27:16Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: Created page with &amp;quot;{{Quiz/start}} {{Quiz | topic          = Which cash flows to include | question       = AXA underwrites 5,000 home insurance policies in Saint-Malo, a coastal town in Brittany exposed to Atlantic storms. When measuring this portfolio under IFRS 17, which of the following would NOT be included in the estimates of future cash flows? | option_a       = Commissions paid to the brokers who sold the policies | option_b       = Salaries of the claims adjusters who will handle s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quiz/start}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Which cash flows to include&lt;br /&gt;
| question       = AXA underwrites 5,000 home insurance policies in Saint-Malo, a coastal town in Brittany exposed to Atlantic storms. When measuring this portfolio under IFRS 17, which of the following would NOT be included in the estimates of future cash flows?&lt;br /&gt;
| option_a       = Commissions paid to the brokers who sold the policies&lt;br /&gt;
| option_b       = Salaries of the claims adjusters who will handle storm damage claims&lt;br /&gt;
| option_c       = The cost of AXA&#039;s new corporate headquarters in Paris&lt;br /&gt;
| option_d       = Expected salvage recoveries from damaged properties&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = IFRS 17 requires inclusion of all cash flows that would not exist if the contracts had never been written. The Paris headquarters cost is a general corporate expense, not directly attributable to the Saint-Malo portfolio. Commissions, claims handling salaries, and salvage recoveries all arise directly from fulfilling these contracts.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Which cash flows to include&lt;br /&gt;
| question       = A junior actuary preparing the Saint-Malo portfolio estimate includes expected claims but excludes policy administration costs, arguing they are &amp;quot;overhead, not insurance costs.&amp;quot; Is this correct?&lt;br /&gt;
| option_a       = Yes, only claims and premiums belong in the estimate&lt;br /&gt;
| option_b       = No, all cash flows directly attributable to fulfilling the contracts must be included, which covers administration costs tied to the portfolio&lt;br /&gt;
| option_c       = Yes, administration costs are captured separately under IFRS 17 as a disclosure item&lt;br /&gt;
| option_d       = No, but only if the administration costs exceed 5% of expected claims&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = IFRS 17 casts a wide net: any cash flow that would not exist if the contracts had never been written must be included. Policy administration costs tied to the portfolio are directly attributable and must form part of the estimate. There is no materiality threshold that exempts them.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = The contract boundary&lt;br /&gt;
| question       = Each Saint-Malo home policy has a one-year legal term and renews annually. At renewal, AXA can reprice each policyholder based on their updated claims history and current storm-risk models. What is the contract boundary for these policies?&lt;br /&gt;
| option_a       = The expected lifetime of the property&lt;br /&gt;
| option_b       = One year, because AXA can fully reassess and reprice at each renewal&lt;br /&gt;
| option_c       = Two years, to capture at least one renewal cycle&lt;br /&gt;
| option_d       = Six months, since storm season lasts only half the year&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The contract boundary ends where the insurer can reassess the individual policyholder&#039;s risk and reprice or reject. Since AXA has full repricing power at each annual renewal, the boundary is one year. The legal term and the contract boundary coincide here.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = The contract boundary&lt;br /&gt;
| question       = AXA now offers a &amp;quot;Loyalty Shield&amp;quot; variant in Saint-Malo that guarantees renewal at the same premium for three years, regardless of the policyholder&#039;s claims experience. What is the contract boundary for this variant?&lt;br /&gt;
| option_a       = One year, because the policy document still shows annual renewal dates&lt;br /&gt;
| option_b       = Three years, because AXA cannot reprice the individual policyholder during that period&lt;br /&gt;
| option_c       = Three years only if the policyholder actually renews each year&lt;br /&gt;
| option_d       = One year, because annual renewal dates always define the boundary&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The contract boundary is determined by the insurer&#039;s practical ability to reprice for the individual&#039;s risk, not by the dates printed on the policy. Because the guaranteed-premium clause removes AXA&#039;s repricing power for three years, the boundary extends to three years from inception.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
| question       = AXA&#039;s meteorologists model two scenarios for the Saint-Malo portfolio this year: a 75% probability of a mild storm season with total claims of €6 million, and a 25% probability of a severe season with claims of €22 million. What is the probability-weighted estimate of claims?&lt;br /&gt;
| option_a       = €6 million&lt;br /&gt;
| option_b       = €10 million&lt;br /&gt;
| option_c       = €14 million&lt;br /&gt;
| option_d       = €22 million&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The probability-weighted estimate is (0.75 × €6m) + (0.25 × €22m) = €4.5m + €5.5m = €10 million. Choosing €6 million would be the error of selecting only the most likely outcome and ignoring tail risk.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
| question       = A colleague argues that AXA should use the €6 million mild-season figure from the previous question because it is the most likely outcome and therefore the best predictor. Why is this reasoning flawed under IFRS 17?&lt;br /&gt;
| option_a       = IFRS 17 always requires the worst-case scenario to be used&lt;br /&gt;
| option_b       = The most likely outcome ignores the impact of less probable but high-severity events, systematically understating the liability&lt;br /&gt;
| option_c       = The most likely outcome is only permitted for life insurance, not property insurance&lt;br /&gt;
| option_d       = IFRS 17 requires the median outcome, not the mode&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = IFRS 17 requires a probability-weighted estimate precisely because the most likely outcome can understate the liability by ignoring severe tail scenarios. The standard does not require worst-case or median figures; it requires the weighted average across all plausible outcomes.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = The contract boundary&lt;br /&gt;
| question       = Suppose AXA introduces a clause in the Saint-Malo policies allowing it to reprice at renewal but capping any premium increase at 2% per year. A risk assessor says the contract boundary is still one year because repricing is permitted. Is this correct?&lt;br /&gt;
| option_a       = Yes, any ability to change the premium at renewal sets the boundary at one year&lt;br /&gt;
| option_b       = No, because the 2% cap may prevent AXA from repricing to fully reflect the policyholder&#039;s updated risk, potentially extending the boundary&lt;br /&gt;
| option_c       = No, because premium caps automatically extend the boundary to ten years&lt;br /&gt;
| option_d       = Yes, because IFRS 17 only considers whether any repricing is possible, not whether it is sufficient&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = The key test is whether the insurer can set a price that fully reflects the policyholder&#039;s risk. A tight cap on increases may prevent this, meaning the insurer is effectively locked into below-risk pricing. The boundary could extend beyond one year depending on whether the cap genuinely restricts full repricing. There is no automatic ten-year rule.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Which cash flows to include&lt;br /&gt;
| question       = After a severe winter storm damages 800 homes in Saint-Malo, AXA expects to recover €1.2 million through subrogation claims against a construction company whose faulty roofing contributed to the damage. How should this expected recovery be treated in the cash flow estimates?&lt;br /&gt;
| option_a       = Excluded, because subrogation is a legal matter unrelated to insurance measurement&lt;br /&gt;
| option_b       = Included as a cash inflow, since it is a recovery the insurer reasonably expects to receive because of the contracts&lt;br /&gt;
| option_c       = Included, but only after the court confirms the amount&lt;br /&gt;
| option_d       = Netted against acquisition costs rather than included in claims estimates&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = IFRS 17 requires all cash flows the insurer reasonably expects to receive because of the contract, including subrogation recoveries. The estimate should be probability-weighted to reflect uncertainty about the recovery amount; it does not need to wait for court confirmation.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
| question       = Six months into the policy year, new climate research significantly increases the estimated probability of severe Atlantic storms hitting Brittany. AXA&#039;s original assumptions assigned a 25% probability to a severe season; the new research suggests 40%. What must AXA do under IFRS 17?&lt;br /&gt;
| option_a       = Keep the original 25% assumption until the policies expire, then update for the next underwriting year&lt;br /&gt;
| option_b       = Update the probability-weighted estimate at the next reporting date to reflect the 40% figure and any other revised assumptions&lt;br /&gt;
| option_c       = Update only if the change exceeds a 10% materiality threshold set by the standard&lt;br /&gt;
| option_d       = Disclose the new research in the notes but leave the liability unchanged&lt;br /&gt;
| correct_answer = b&lt;br /&gt;
| explanation    = IFRS 17&#039;s &amp;quot;current estimate&amp;quot; philosophy requires the insurer to revise its assumptions at every reporting date to reflect the latest available information. There is no materiality threshold in the standard that permits ignoring significant new evidence. The balance sheet must show AXA&#039;s best current view of fulfilment costs.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz&lt;br /&gt;
| topic          = Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
| question       = After updating the storm probability to 40%, AXA recalculates the probability-weighted claims estimate. At the same time, recent court rulings in Rennes have raised average bodily injury awards in Brittany by 15%, and construction cost inflation has increased expected repair costs. An actuary proposes updating only the storm probability and leaving other assumptions unchanged to keep the model simple. Is this approach acceptable under IFRS 17?&lt;br /&gt;
| option_a       = Yes, IFRS 17 only requires updating the single most material assumption at each reporting date&lt;br /&gt;
| option_b       = Yes, provided the other changes are disclosed in the financial statement notes&lt;br /&gt;
| option_c       = No, the insurer must update all assumptions that have materially changed, including legal trends and inflation, to reflect current conditions&lt;br /&gt;
| option_d       = No, but only because inflation adjustments are mandatory; legal trends are optional&lt;br /&gt;
| correct_answer = c&lt;br /&gt;
| explanation    = IFRS 17 requires estimates to reflect all current information at the reporting date. Cherry-picking one assumption while ignoring other significant changes — such as inflation and legal developments — would produce a stale and incomplete view of the liability. All assumptions must be brought up to date together.&lt;br /&gt;
}}&lt;br /&gt;
{{Quiz/end}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/Future_cash_flows&amp;diff=22986</id>
		<title>Internal:Training/IFRS17/Future cash flows</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17/Future_cash_flows&amp;diff=22986"/>
		<updated>2026-04-06T14:27:09Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🔗 &#039;&#039;&#039;Recall.&#039;&#039;&#039; In the previous page, you learned how IFRS 17 decomposes an insurance [[Definition:Liability|liability]] into two main building blocks: [[Definition:Fulfilment cash flows|fulfilment cash flows]] and the [[Definition:Contractual service margin|contractual service margin]]. You also learned that fulfilment cash flows are themselves made up of three ingredients: estimates of future cash flows, [[Definition:Discounting|discounting]], and the [[Definition:Risk adjustment|risk adjustment]]. Now we take a close look at the first and most foundational of those ingredients: the estimates of future cash flows.&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Objective.&#039;&#039;&#039; In this page, you will learn:&lt;br /&gt;
* Which types of cash flows an insurer must include when measuring an insurance contract, and which it must leave out.&lt;br /&gt;
* What the [[Definition:Contract boundary|contract boundary]] is, why it exists, and how it determines the point at which future cash flows stop belonging to the current contract.&lt;br /&gt;
* How [[Definition:Probability-weighted estimate|probability-weighted estimates]] work, and why the insurer must keep its assumptions current at every [[Definition:Reporting date|reporting date]].&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Which cash flows to include ==&lt;br /&gt;
&lt;br /&gt;
💰 &#039;&#039;&#039;Starting with the basics.&#039;&#039;&#039; Estimates of future cash flows are the foundation of IFRS 17&#039;s measurement model. They represent every future cash flow that the insurer expects to arise as it fulfils its obligations under a group of [[Definition:Insurance contract|insurance contracts]]. The idea is intuitive: if you want to know what a promise costs, you need to list all the money you expect to flow in and all the money you expect to flow out because of that promise. IFRS 17 requires the insurer to consider both directions, inflows and outflows, as part of a single integrated estimate.&lt;br /&gt;
&lt;br /&gt;
📥 &#039;&#039;&#039;Cash inflows.&#039;&#039;&#039; The most obvious inflow is the [[Definition:Premium|premium]] the [[Definition:Policyholder|policyholder]] pays. But premiums are not always a single upfront payment. A [[Definition:Motor insurance|motor insurance]] customer in Germany might pay monthly instalments over the year, so the insurer must include all expected future premium receipts that fall within the contract. Other inflows can include recoveries the insurer expects to receive, for example [[Definition:Salvage|salvage]] from a written-off vehicle or [[Definition:Subrogation|subrogation]] rights that allow the insurer to reclaim money from a third party who caused the loss. Every euro the insurer reasonably expects to receive because of the contract counts as an inflow.&lt;br /&gt;
&lt;br /&gt;
📤 &#039;&#039;&#039;Cash outflows.&#039;&#039;&#039; On the other side, outflows include everything the insurer expects to pay. The largest category is [[Definition:Claims|claims]]: the compensation paid to [[Definition:Policyholders|policyholders]] when insured events occur. Beyond claims, the insurer must include [[Definition:Acquisition costs|acquisition costs]] such as [[Definition:Commission|commissions]] paid to [[Definition:Brokers|brokers]], [[Definition:Claims handling costs|claims handling costs]] such as the salaries of claims adjusters and legal fees, and ongoing [[Definition:Administrative expenses|administrative expenses]] directly attributable to the contracts. For example, if AXA underwrites a portfolio of [[Definition:Home insurance|home insurance]] policies in Belgium, the estimates of future cash flows must capture not just the expected storm and fire claims, but also the broker commissions, the cost of running the claims department, and the policy administration costs tied to that portfolio.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A frequent mistake is to assume that the cash flow estimates include only claims. In reality, IFRS 17 casts a wide net: any cash flow that would not exist if the contracts had never been written must be included. This means acquisition costs, maintenance expenses, and claims handling costs are all in scope. Leaving them out would understate the true cost of fulfilling the insurer&#039;s promise.&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; If the estimates of future cash flows must include all future premiums and all future costs, where exactly does the insurer draw the line? At what point do future cash flows stop belonging to the current contract and start belonging to a new one?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== The contract boundary ==&lt;br /&gt;
&lt;br /&gt;
🚧 &#039;&#039;&#039;Drawing the line.&#039;&#039;&#039; The [[Definition:Contract boundary|contract boundary]] is IFRS 17&#039;s answer to a critical question: how far into the future should the insurer look when estimating the cash flows of a contract? The boundary marks the point beyond which the insurer is no longer compelled to provide coverage or accept risk. Cash flows inside the boundary belong to the current contract measurement. Cash flows outside it do not, even if the insurer fully expects the customer to renew. This concept prevents insurers from bundling the economics of future, yet-to-be-written contracts into today&#039;s measurement.&lt;br /&gt;
&lt;br /&gt;
🔑 &#039;&#039;&#039;The key test.&#039;&#039;&#039; IFRS 17 defines the contract boundary by asking a practical question: can the insurer, at a given future date, reassess the risk of the individual [[Definition:Policyholder|policyholder]] and reprice or reject accordingly? If the insurer has the right to change the premium to fully reflect the policyholder&#039;s updated risk, or the right to terminate the contract, then the boundary falls at that point. Everything beyond it is considered a future contract. Consider a one-year [[Definition:Motor insurance|motor policy]] in Spain that renews annually. At each renewal date, the insurer can adjust the premium based on the driver&#039;s updated [[Definition:Claims history|claims history]] and current risk profile. The contract boundary for that policy is one year, because at renewal the insurer has full repricing power.&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; Many people confuse the contract boundary with the legal term of the contract. They are not the same thing. A contract might have a legal duration of one year but include a guaranteed renewal clause that prevents the insurer from repricing for three years. In that case, the contract boundary extends to three years, because the insurer is obligated to provide coverage at the current price for that entire period. The test is about economic substance, specifically the insurer&#039;s practical ability to reprice, not the date printed on the policy document.&lt;br /&gt;
&lt;br /&gt;
🏥 &#039;&#039;&#039;A longer example.&#039;&#039;&#039; Imagine a [[Definition:Health insurance|health insurance]] policy in France where the insurer guarantees renewal at community-rated premiums regardless of the policyholder&#039;s health status. Even though the policy renews annually on paper, the insurer cannot adjust the premium to reflect a particular individual&#039;s deteriorating health. The contract boundary may therefore extend well beyond one year, potentially across the policyholder&#039;s expected lifetime, because the insurer lacks the ability to reprice for that individual&#039;s specific risk. This creates a much longer stream of cash flows to estimate, which has a significant effect on the measurement of the [[Definition:Liability|liability]].&lt;br /&gt;
&lt;br /&gt;
🤔 &#039;&#039;&#039;Think about it.&#039;&#039;&#039; Now that we know which cash flows to include and how far into the future to project them, a new challenge arises: the future is uncertain. How does the insurer handle the fact that it does not know exactly how many claims will occur, how large they will be, or when they will be paid?&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Probability-weighted estimates and keeping assumptions current ==&lt;br /&gt;
&lt;br /&gt;
🎲 &#039;&#039;&#039;Embracing uncertainty.&#039;&#039;&#039; IFRS 17 does not ask the insurer to predict the future with certainty. Instead, it requires a [[Definition:Probability-weighted estimate|probability-weighted estimate]], sometimes called an [[Definition:Expected value|expected value]]. The insurer must consider a range of possible outcomes and weight each one by its probability. Suppose an insurer like AXA is estimating [[Definition:Claims|claims]] for a portfolio of [[Definition:Property insurance|property insurance]] in southern France, a region exposed to both minor weather events and rare but catastrophic floods. The estimate does not pick a single &amp;quot;most likely&amp;quot; scenario. Instead, it blends together many possibilities: a calm year, a year with one moderate storm, a year with severe flooding, and so on, each multiplied by how likely it is to occur. The weighted average of all these scenarios produces the probability-weighted estimate.&lt;br /&gt;
&lt;br /&gt;
📊 &#039;&#039;&#039;Why the average matters.&#039;&#039;&#039; To see the logic, think of a simple example. A portfolio of 10,000 [[Definition:Home insurance|home policies]] in the Rhône valley faces two broad scenarios this year: a 90% chance of a quiet year with total claims of €8 million, and a 10% chance of a major flood causing claims of €40 million. The probability-weighted estimate is (0.90 × €8 million) + (0.10 × €40 million) = €11.2 million. This figure is not the outcome in either scenario, but it represents the average expected cost across all possibilities. IFRS 17 uses this average as the starting point for the [[Definition:Liability|liability]], because over many contracts and many years, the average is the best unbiased predictor of the insurer&#039;s total outflows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div data-wix-module=&amp;quot;prob-weighted&amp;quot;&amp;gt;Loading…&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
⚠️ &#039;&#039;&#039;Common misconception.&#039;&#039;&#039; A common error is to confuse the probability-weighted estimate with the &amp;quot;most likely&amp;quot; outcome. These are not the same thing. In the Rhône valley example above, the most likely outcome is €8 million (the quiet year), but the probability-weighted estimate is €11.2 million because it also reflects the tail risk of flooding. Choosing only the most likely outcome would systematically understate the [[Definition:Liability|liability]], ignoring the impact of severe but plausible events.&lt;br /&gt;
&lt;br /&gt;
🔄 &#039;&#039;&#039;Keeping assumptions current.&#039;&#039;&#039; IFRS 17 adds one more crucial requirement: the insurer must update its estimates at every [[Definition:Reporting date|reporting date]]. Assumptions made when the contract was first written do not remain frozen. If new information emerges, such as a change in claims trends, updated weather models, shifts in [[Definition:Inflation|inflation]], or new legal rulings affecting [[Definition:Bodily injury|bodily injury]] awards, the insurer must revise its estimates of future cash flows to reflect current conditions. This &amp;quot;current estimate&amp;quot; philosophy means that the [[Definition:Balance sheet|balance sheet]] always shows the insurer&#039;s latest and best view of what it will cost to fulfil its promises, rather than a stale figure locked in at inception. It keeps the financial statements honest and transparent, even when the world around the contract changes.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Takeaways ==&lt;br /&gt;
&lt;br /&gt;
📌 &#039;&#039;&#039;Key takeaways.&#039;&#039;&#039;&lt;br /&gt;
* Estimates of future cash flows include all future cash inflows (premiums, recoveries) and outflows (claims, acquisition costs, administrative expenses, claims handling costs) that arise directly from fulfilling a group of [[Definition:Insurance contract|insurance contracts]].&lt;br /&gt;
* The [[Definition:Contract boundary|contract boundary]] determines how far into the future the insurer projects those cash flows; it ends at the point where the insurer can reassess the policyholder&#039;s risk and reprice or reject, regardless of the legal term of the contract.&lt;br /&gt;
* Cash flow estimates must be [[Definition:Probability-weighted estimate|probability-weighted]], reflecting a full range of scenarios rather than a single &amp;quot;most likely&amp;quot; outcome, and must be updated at every [[Definition:Reporting date|reporting date]] to incorporate the latest available information.&lt;br /&gt;
&lt;br /&gt;
{{Section separator}}&lt;br /&gt;
== Quiz ==&lt;br /&gt;
&lt;br /&gt;
{{Wix:Training/IFRS17/Free cash flows/quiz}}&lt;br /&gt;
&lt;br /&gt;
{{Internal:Training/IFRS17/nav-dropdown}}&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
	<entry>
		<id>https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17&amp;diff=22985</id>
		<title>Internal:Training/IFRS17</title>
		<link rel="alternate" type="text/html" href="https://www.insurerbrain.com/w/index.php?title=Internal:Training/IFRS17&amp;diff=22985"/>
		<updated>2026-04-06T14:21:00Z</updated>

		<summary type="html">&lt;p&gt;Wikilah admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Internal:Training/IFRS17/nav-dropdown}}&lt;br /&gt;
&lt;br /&gt;
🎯 &#039;&#039;&#039;Introduction.&#039;&#039;&#039; This training program takes you from first principles to a complete understanding of IFRS 17, the international accounting standard for insurance contracts. Each page builds on the last, starting from the most basic notions and adding complexity one step at a time. No prior knowledge of insurance or accounting is assumed. By the end, you will be able to read, interpret, and work with IFRS 17 financial statements with confidence. Click to explore the training.&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Why insurance exists|Why insurance exists]] ====&lt;br /&gt;
* Uncertainty and risk&lt;br /&gt;
* Pooling as a solution&lt;br /&gt;
* The role of the insurer&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The economics of an insurance contract|The economics of an insurance contract]] ====&lt;br /&gt;
* Anatomy of a premium&lt;br /&gt;
* The timing mismatch and the time value of money&lt;br /&gt;
* Where profit comes from&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/What is accounting and why it matters|What is accounting and why it matters]] ====&lt;br /&gt;
* The purpose of accounting: who needs it and why&lt;br /&gt;
* The balance sheet and the income statement&lt;br /&gt;
* Key principles: recognition, measurement, and matching&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Accounting for an insurer|Accounting for an insurer]] ====&lt;br /&gt;
* The insurer&#039;s balance sheet: reserves as the dominant liability&lt;br /&gt;
* The insurer&#039;s income statement: premiums, claims, and expenses&lt;br /&gt;
* The hard questions: when is revenue earned, how do you value an uncertain promise?&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Why insurance broke global standards|Why insurance broke global standards]] ====&lt;br /&gt;
* Different countries, different answers&lt;br /&gt;
* IFRS and the promise of one global language&lt;br /&gt;
* IFRS 4 as a temporary compromise and why IFRS 17 was needed&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The building blocks: overview|The building blocks: overview]] ====&lt;br /&gt;
* The idea of decomposing a liability into transparent pieces&lt;br /&gt;
* The four components at a glance: FCF, discounting, RA, CSM&lt;br /&gt;
* How the building blocks solve the problems of the old world&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Future cash flows|Future cash flows]] ====&lt;br /&gt;
* Which cash flows to include&lt;br /&gt;
* The contract boundary&lt;br /&gt;
* Probability-weighted estimates and keeping assumptions current&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Discounting|Discounting]] ====&lt;br /&gt;
* Why discounting is essential for insurance liabilities&lt;br /&gt;
* Choosing the discount rate: top-down vs. bottom-up&lt;br /&gt;
* How discounting affects the liability over time&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The risk adjustment|The risk adjustment]] ====&lt;br /&gt;
* What the risk adjustment represents&lt;br /&gt;
* How to measure it: confidence levels, cost of capital, VaR&lt;br /&gt;
* How the risk adjustment releases as risk expires&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The contractual service margin|The contractual service margin]] ====&lt;br /&gt;
* What the CSM represents: unearned profit locked away on day one&lt;br /&gt;
* How the CSM absorbs changes in estimates&lt;br /&gt;
* How the CSM releases into revenue: coverage units&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Grouping contracts|Grouping contracts]] ====&lt;br /&gt;
* Portfolios: contracts with similar risks&lt;br /&gt;
* Profitability groups: separating profitable from onerous&lt;br /&gt;
* Annual cohorts: why contracts issued more than a year apart must be separated&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The general model: initial recognition|The general model: initial recognition]] ====&lt;br /&gt;
* Day one: measuring the four building blocks&lt;br /&gt;
* Profitable contracts: CSM is positive&lt;br /&gt;
* Onerous contracts: CSM is zero, loss recognized immediately&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The general model: subsequent measurement|The general model: subsequent measurement]] ====&lt;br /&gt;
* Passage of time: unwinding discount, releasing RA, releasing CSM&lt;br /&gt;
* Changes in estimates: future service adjusts CSM, current/past service hits P&amp;amp;L&lt;br /&gt;
* Claims incurred, settled, and derecognition&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The income statement under IFRS 17|The income statement under IFRS 17]] ====&lt;br /&gt;
* Insurance revenue: not premiums, but service delivered&lt;br /&gt;
* Insurance service expenses and the insurance service result&lt;br /&gt;
* Insurance finance income/expense and the OCI option&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The premium allocation approach|The premium allocation approach]] ====&lt;br /&gt;
* When PAA is available: the eligibility test&lt;br /&gt;
* How PAA works: simplified measurement&lt;br /&gt;
* What you keep and what you skip vs. the general model&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/The variable fee approach|The variable fee approach]] ====&lt;br /&gt;
* What are direct participating contracts&lt;br /&gt;
* The variable fee concept: how VFA modifies the general model&lt;br /&gt;
* Scope and the three eligibility criteria&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Reinsurance held|Reinsurance held]] ====&lt;br /&gt;
* Reinsurance as the mirror image: the insurer is the customer&lt;br /&gt;
* Key asymmetries: day-one gains and loss recovery&lt;br /&gt;
* Proportionate vs. non-proportionate reinsurance&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Contract modifications and portfolio transfers|Contract modifications and portfolio transfers]] ====&lt;br /&gt;
* When contract terms change: derecognize or continue?&lt;br /&gt;
* The criteria and consequences of modification&lt;br /&gt;
* Portfolio transfers: measuring at the transaction date&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Transition to IFRS 17|Transition to IFRS 17]] ====&lt;br /&gt;
* The full retrospective approach: the gold standard&lt;br /&gt;
* The modified retrospective approach: practical approximation&lt;br /&gt;
* The fair value approach: when history is unavailable&lt;br /&gt;
&lt;br /&gt;
==== [[Internal:Training/IFRS17/Presentation, disclosure, and interpretation|Presentation, disclosure, and interpretation]] ====&lt;br /&gt;
* How IFRS 17 numbers appear in published financial statements&lt;br /&gt;
* Key disclosure requirements&lt;br /&gt;
* Reading IFRS 17 reports as an analyst or stakeholder&lt;/div&gt;</summary>
		<author><name>Wikilah admin</name></author>
	</entry>
</feed>