From 8f147512f40db2d8c1a59668166ad4a74197a27b Mon Sep 17 00:00:00 2001 From: syoul Date: Tue, 2 Dec 2025 19:24:23 +0100 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20du=20script=20de=20strat?= =?UTF-8?q?=C3=A9gie=20pour=20inclure=20les=20pages=20Business=20et=20Data?= =?UTF-8?q?Viz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/strategie-script.js | 517 +++++++++++++++++++++++++------------ 1 file changed, 348 insertions(+), 169 deletions(-) diff --git a/public/strategie-script.js b/public/strategie-script.js index 2ab4d0b..ab4641b 100644 --- a/public/strategie-script.js +++ b/public/strategie-script.js @@ -1,7 +1,8 @@ -// Script pour la stratégie - avec contenu complet du fichier Markdown +// Script pour la gestion des pages de stratégie (function() { - // Contenu de la stratégie (extrait de docs/strategie-evolution-technique.md) - const strategieMarkdown = `# Stratégie d'Évolution Technique - Laplank + // Contenu des pages Markdown + const pagesContent = { + 'strategie': `# Stratégie d'Évolution Technique - Laplank **Date de mise à jour** : 02/12/2025 @@ -289,12 +290,231 @@ Aucune migration urgente identifiée actuellement. Cette stratégie d'évolution technique vise à aligner les choix technologiques avec les objectifs business, réduire les risques, optimiser les coûts et favoriser l'innovation. -La mise en œuvre de cette stratégie nécessite un engagement continu de l'équipe et un suivi régulier des métriques définies.`; +La mise en œuvre de cette stratégie nécessite un engagement continu de l'équipe et un suivi régulier des métriques définies.`, + + 'business': `# Stratégie Business : Data Visualization & Flux Économiques + +**Date** : 02/12/2025 +**Contexte** : En marge de l'écosystème Duniter/Ğ1, exploration des opportunités de marché autour de la visualisation de données économiques et logistiques. + +--- + +## 1. Analyse du Marché de la Data Visualization + +### Vue d'ensemble +Le marché de la visualisation de données est en pleine expansion, porté par la complexité croissante des flux d'informations et le besoin de transparence. + +**Taille du marché** : En croissance constante (CAGR estimé à >10% annuel). +**Moteurs** : +- Besoin de prise de décision basée sur les données (Data-Driven Decision Making). +- Complexité des chaînes d'approvisionnement (Supply Chain). +- Demande de transparence financière et RSE (Responsabilité Sociétale des Entreprises). + +### Segments Pertinents pour Laplank + +1. **Visualisation de Flux Financiers Complexes (FinTech / DeFi)** + * **Besoin** : Comprendre les mouvements de fonds, la création monétaire, les graphes de transactions. + * **Cible** : DAOs, projets Blockchain, ONG, Auditeurs financiers. + * **Offre** : Dashboards interactifs de transparence, explorateurs de blockchain visuels (au-delà des simples listes de transactions). + +2. **Transparence de la Supply Chain (Flux de Marchandises)** + * **Besoin** : Tracer l'origine et le parcours des produits (traçabilité). + * **Cible** : Coopératives, circuits courts, commerce équitable, industrie agroalimentaire. + * **Lien avec Duniter** : Utilisation possible de la blockchain pour certifier les étapes, visualisées ensuite pour le consommateur final. + +3. **Visualisation de Réseaux et Communautés (Web of Trust)** + * **Besoin** : Cartographier les relations humaines, la confiance, la gouvernance décentralisée. + * **Cible** : Associations, collectifs, réseaux sociaux décentralisés. + +--- + +## 2. Opportunité : Flux Économiques & Marchandises + +C'est le segment le plus prometteur "en marge" de la crypto pure, car il touche l'économie réelle. + +### Le Problème +- Les ERP (Enterprise Resource Planning) classiques sont austères et peu visuels. +- La donnée est silotée. +- Le consommateur ou le décideur ne "voit" pas le flux global. + +### La Solution Laplank +Proposer une **plateforme de visualisation unifiée** capable de représenter graphiquement : +- **Flux monétaires** (€, Ğ1, Crypto) +- **Flux physiques** (Marchandises, Stocks, Logistique) + +### Cas d'Usage Concret : "Le Circuit Court Augmenté" +Imaginez une coopérative de producteurs. +- **Input** : Données de production, transport, vente. +- **Visualisation** : + - **Carte interactive (Leaflet)** : Localisation des producteurs et trajets. + - **Graphe de flux (Sankey Diagram)** : Répartition de la valeur (combien va au producteur, au transporteur, à la coopérative). *Transparence radicale.* + - **Tableau de bord (ECharts/D3)** : Saisonnalité, stocks en temps réel. + +### Avantage Concurrentiel (Différenciation) +- **Expertise Technique** : Maîtrise de technologies avancées (D3.js, Rust/Wasm pour la perf, ThreeFold pour l'hébergement souverain). +- **Approche Éthique/Souveraine** : Hébergement décentralisé (ThreeFold), pas de GAFAM, respect des données. +- **Double Compétence** : Capacité à lier Blockchain (certitude de la donnée) et DataViz (lisibilité de la donnée). + +--- + +## 3. Modèle Économique Potentiel + +1. **Service B2B (SaaS / On-Premise)** + - Abonnement pour les entreprises/coopératives souhaitant visualiser leurs données. + - Hébergement sur ThreeFold (revenus récurrents). + +2. **Prestation de Conseil & Développement** + - Création de dashboards sur mesure pour des clients spécifiques. + - Audit de données et mise en qualité avant visualisation. + +3. **Produit "Open Core"** + - Version de base open-source (attraction communautaire). + - Modules "Premium" pour connecteurs spécifiques (ERP propriétaires, Banques) ou fonctionnalités avancées d'analyse prédictive (IA). + +--- + +## 4. Roadmap Business (Piste) + +### Phase 1 : POC & Vitrine (6 mois) +- Utiliser l'écosystème Duniter/Ğ1 comme "Client Zéro". +- Développer l'explorateur visuel de Web of Trust et de flux monétaires. +- **Objectif** : Démontrer la capacité technique et l'impact visuel. "Rendre sexy la donnée complexe". + +### Phase 2 : Extension aux Flux Physiques (6-12 mois) +- Trouver un partenaire dans l'économie réelle (ex: coopérative bio, réseau de logistique locale). +- Adapter les outils de visualisation pour tracer des produits physiques. +- **Objectif** : Valider le marché hors crypto. + +### Phase 3 : Plateforme de Transparence Économique (12+ mois) +- Lancer une offre packagée. +- "Visualisez votre impact économique et écologique en temps réel". + +--- + +## 5. Technologies Clés à Surveiller + +- **Digital Twins (Jumeaux Numériques)** : Représentation virtuelle d'objets physiques. +- **IoT (Internet of Things)** : Capteurs pour alimenter les données de flux physiques. +- **Standardisation (GS1 / EPCIS)** : Normes d'échange de données logistiques. + +--- + +## Conclusion + +Le marché de la DataViz appliquée aux **flux économiques mixtes (monnaie + matière)** est une niche stratégique pertinente. Elle valorise l'expertise technique de l'équipe tout en s'ouvrant à des clients "traditionnels" cherchant transparence et optimisation. L'infrastructure ThreeFold apporte la couche de souveraineté nécessaire pour traiter ces données sensibles.`, + + 'dataviz': `# Opportunités d'Extension : Data Visualization + +**Date** : 02/12/2025 +**Objectif** : Identifier les secteurs porteurs pour l'expertise DataViz de l'équipe, au-delà des flux économiques. + +--- + +## 1. Territoires & Open Data (Smart Cities Souveraines) + +Les collectivités locales disposent de plus en plus de données (Open Data) mais manquent d'outils pour les rendre intelligibles aux citoyens. + +* **Opportunité** : Créer des portails de transparence pour les mairies/collectivités. +* **Cas d'usage** : + * **Visualisation budgétaire** : "Où vont mes impôts ?" (Diagrammes de Sankey, Treemaps). + * **Urbanisme** : Cartographie des travaux, permis de construire, zones inondables. + * **Démocratie participative** : Visualiser les résultats de consultations citoyennes. +* **Synergie Technique** : Leaflet (cartes), D3.js (budgets), ThreeFold (hébergement local et souverain des données citoyennes). + +## 2. Green Tech & Impact Environnemental + +La mesure et la communication de l'impact écologique deviennent obligatoires (CSRD) et stratégiques. + +* **Opportunité** : Tableaux de bord RSE (Responsabilité Sociétale des Entreprises) et empreinte carbone. +* **Cas d'usage** : + * **Visualisation de l'empreinte carbone** : Scope 1, 2, 3. Graphiques d'évolution. + * **Monitoring énergétique** : Visualisation temps réel de la consommation (bâtiments, serveurs). *Lien direct avec l'offre ThreeFold "Green IT".* + * **Traçabilité des déchets** : Suivre le cycle de vie des produits. +* **Synergie Technique** : IoT (capteurs), ECharts (séries temporelles), Rust (traitement performant de gros volumes de données capteurs). + +## 3. Visualisation de la Connaissance (Knowledge Management) + +Dans un monde infobèse, organiser et visualiser l'information est une valeur clé. + +* **Opportunité** : Outils de "Second Cerveau" ou de gestion des connaissances pour entreprises/recherche. +* **Cas d'usage** : + * **Graphes de connaissances** : Visualiser les liens entre documents, personnes, projets (comme Obsidian ou Roam, mais version web/collaborative). + * **Cartographie des compétences** : Version avancée du Radar Technologique pour les RH (gestion des talents). + * **Exploration documentaire** : Naviguer visuellement dans des bases documentaires complexes (juridique, technique). +* **Synergie Technique** : Cytoscape.js (graphes), ElasticSearch/MeiliSearch (indexation), IA (pour générer les liens). + +## 4. Cybersécurité & Réseaux + +Visualiser l'invisible pour mieux protéger. + +* **Opportunité** : Interfaces de monitoring sécurité pour PME. +* **Cas d'usage** : + * **Cartographie du réseau** : Visualiser tous les appareils connectés et leurs communications. + * **Visualisation d'attaques** : Représenter les tentatives d'intrusion en temps réel (cartes de chaleur, flux). + * **Analyse de logs** : Rendre les logs serveurs lisibles graphiquement. +* **Synergie Technique** : Rust (sondes réseau), WebGL/Canvas (visualisation haute performance), ThreeFold (réseau overlay). + +--- + +## Matrice de Priorisation + +| Secteur | Potentiel Marché | Synergie Technique Actuelle | Complexité Métier | Priorité | +| :--- | :---: | :---: | :---: | :---: | +| **Flux Éco (Business)** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Moyenne | **1** | +| **Territoires (Smart City)** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Élevée (Politique) | **2** | +| **Green Tech** | ⭐⭐⭐⭐ | ⭐⭐⭐ | Moyenne | **3** | +| **Connaissance (KM)** | ⭐⭐⭐ | ⭐⭐⭐⭐ | Faible | **2** (Interne d'abord) | +| **Cybersécurité** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Très Élevée | **4** | + +## Conclusion + +Si le focus principal reste les **Flux Économiques** (cohérent avec l'historique Duniter), l'axe **Territoires/Open Data** est le pivot le plus naturel : il s'agit toujours de visualiser des ressources et des flux, mais appliqués à la cité. De plus, l'argument de la "Souveraineté Numérique" (ThreeFold) y résonne très fort.` + }; + + const pageTitles = { + 'strategie': 'Stratégie Technique', + 'business': 'Business', + 'dataviz': 'Opportunités DataViz' + }; // Fonction pour convertir Markdown en HTML function markdownToHtml(md) { let html = md; + // Tableaux + html = html.replace(/\|(.+)\|/g, function(match) { + // Gestion basique des tableaux markdown + if (match.includes('---')) return ''; // Ignore la ligne de séparation + const cells = match.split('|').filter(c => c.trim() !== ''); + const cellTag = match.includes('Secteur') || match.includes('Potentiel') ? 'th' : 'td'; + return '' + cells.map(c => `<${cellTag} style="border: 1px solid #ddd; padding: 8px; text-align: left;">${c.trim()}`).join('') + ''; + }); + + // Envelopper les lignes de tableau dans une table si nécessaire (simplifié) + // Pour une vraie implémentation, utiliser une lib comme marked ou showdown + // Ici on fait un fix rapide pour que les tableaux s'affichent à peu près correctement + if (html.includes('')) { + // C'est très rudimentaire, idéalement on utiliserait une vraie lib + const parts = html.split('\n'); + let inTable = false; + html = parts.map(line => { + if (line.startsWith('')) { + if (!inTable) { + inTable = true; + return '' + line; + } + return line; + } else { + if (inTable && line.trim() === '') { + inTable = false; + return '
'; + } + return line; + } + }).join('\n'); + if (inTable) html += ''; + } + // Titres html = html.replace(/^# (.*$)/gim, '

$1

'); html = html.replace(/^## (.*$)/gim, '

$1

'); @@ -314,14 +534,16 @@ La mise en œuvre de cette stratégie nécessite un engagement continu de l'équ // Paragraphes html = html.split('\n\n').map(block => { - if (block.trim().startsWith('' + block.trim() + '

'; + return '

' + trimmed + '

'; }).join('\n'); // Grouper les listes - html = html.replace(/(
  • .*?<\/li>)/gim, function(match) { + html = html.replace(/(
  • .*?<\/li>(\s*
  • .*?<\/li>)*)/gim, function(match) { return '
      ' + match + '
    '; }); html = html.replace(/<\/ul>\s*
      /gim, ''); @@ -330,209 +552,166 @@ La mise en œuvre de cette stratégie nécessite un engagement continu de l'équ } function initStrategyLinks() { - addStrategyLinkToHeader(); - interceptStrategyLinks(); - handleStrategyRoute(); + addLinksToHeader(); + handleRoute(); } - function handleStrategyRoute() { - if (window.location.pathname === '/business/strategie' || window.location.pathname === '/business/strategie.html' || window.location.hash === '#strategie') { - createStrategyPage(); - } + function handleRoute() { + const path = window.location.pathname; + const hash = window.location.hash; + + // Détection simple + if (hash === '#strategie' || path.includes('/strategie')) showPage('strategie'); + else if (hash === '#business' || path.includes('/business-strat')) showPage('business'); + else if (hash === '#dataviz' || path.includes('/dataviz')) showPage('dataviz'); } - function interceptStrategyLinks() { - document.addEventListener('click', function(e) { - const link = e.target.closest('a'); - if (link && (link.href.includes('/business/strategie') || link.getAttribute('href') === '/business/strategie' || link.id === 'strategie-link' || link.classList.contains('strategie-link'))) { - e.preventDefault(); - e.stopPropagation(); - createStrategyPage(); - return false; - } - }, true); - } + function showPage(pageId) { + if (!pagesContent[pageId]) return; - function createStrategyPage() { if (!window.originalBodyContent) { window.originalBodyContent = document.body.innerHTML; } - // Convertir le Markdown en HTML - const htmlContent = markdownToHtml(strategieMarkdown); + const htmlContent = markdownToHtml(pagesContent[pageId]); document.body.innerHTML = `
      - ← Retour au Radar -
      +
      + ← Retour au Radar +
      + ${Object.keys(pageTitles).map(key => + `${pageTitles[key]}` + ).join('')} +
      +
      +
      ${htmlContent}
      `; - // Appliquer des styles pour le contenu Markdown - const contentDiv = document.getElementById('strategie-content'); - if (contentDiv) { - contentDiv.querySelectorAll('h1').forEach(h => { + // Styles + styleContent(); + + // Event listeners + document.getElementById('back-to-radar').addEventListener('click', function(e) { + e.preventDefault(); + if (window.originalBodyContent) { + document.body.innerHTML = window.originalBodyContent; + window.history.pushState(null, null, window.location.pathname.replace(/\/business\/.*$/, '/business/')); + setTimeout(initStrategyLinks, 100); + } else { + window.location.href = '/business/'; + } + }); + + document.querySelectorAll('.nav-link').forEach(link => { + link.addEventListener('click', function(e) { + e.preventDefault(); + const target = this.getAttribute('data-page'); + showPage(target); + }); + }); + + window.history.pushState({page: pageId}, pageTitles[pageId], `/business/${pageId}`); + } + + function styleContent() { + const contentDiv = document.getElementById('page-content'); + if (!contentDiv) return; + + contentDiv.querySelectorAll('h1').forEach(h => { h.style.color = '#1a4d3a'; h.style.borderBottom = '3px solid #2ecc71'; h.style.paddingBottom = '10px'; h.style.marginTop = '30px'; - h.style.marginBottom = '20px'; - }); - contentDiv.querySelectorAll('h2').forEach(h => { + }); + contentDiv.querySelectorAll('h2').forEach(h => { h.style.color = '#2ecc71'; h.style.marginTop = '30px'; h.style.marginBottom = '15px'; - }); - contentDiv.querySelectorAll('h3').forEach(h => { + }); + contentDiv.querySelectorAll('h3').forEach(h => { h.style.color = '#3498db'; h.style.marginTop = '20px'; - h.style.marginBottom = '10px'; - }); - contentDiv.querySelectorAll('h4').forEach(h => { - h.style.color = '#555'; - h.style.marginTop = '15px'; - h.style.marginBottom = '8px'; - }); - contentDiv.querySelectorAll('ul').forEach(ul => { - ul.style.margin = '10px 0'; - ul.style.paddingLeft = '30px'; - ul.style.listStyleType = 'disc'; - }); - contentDiv.querySelectorAll('li').forEach(li => { - li.style.margin = '5px 0'; - }); - contentDiv.querySelectorAll('p').forEach(p => { - p.style.margin = '10px 0'; - }); - contentDiv.querySelectorAll('a').forEach(a => { + }); + contentDiv.querySelectorAll('ul, ol').forEach(l => { + l.style.marginLeft = '20px'; + l.style.marginBottom = '15px'; + }); + contentDiv.querySelectorAll('li').forEach(li => { + li.style.marginBottom = '5px'; + }); + contentDiv.querySelectorAll('p').forEach(p => { + p.style.marginBottom = '15px'; + }); + contentDiv.querySelectorAll('a').forEach(a => { a.style.color = '#2ecc71'; a.style.textDecoration = 'none'; - }); - contentDiv.querySelectorAll('a').forEach(a => { - a.addEventListener('mouseenter', function() { - this.style.textDecoration = 'underline'; - }); - a.addEventListener('mouseleave', function() { - this.style.textDecoration = 'none'; - }); - }); - contentDiv.querySelectorAll('hr').forEach(hr => { - hr.style.border = 'none'; - hr.style.borderTop = '2px solid #2ecc71'; - hr.style.margin = '30px 0'; - }); - contentDiv.querySelectorAll('strong').forEach(s => { - s.style.color = '#1a4d3a'; - }); - } - - const backLink = document.getElementById('back-to-radar'); - if (backLink) { - backLink.addEventListener('click', function(e) { - e.preventDefault(); - if (window.originalBodyContent) { - document.body.innerHTML = window.originalBodyContent; - setTimeout(initStrategyLinks, 100); - } else { - window.location.href = '/business/'; - } - }); - } - - window.history.pushState({page: 'strategie'}, 'Stratégie', '/business/strategie'); + }); } - function addStrategyLinkToHeader() { - // Chercher le header ou la barre de navigation + function addLinksToHeader() { + // Chercher le header const header = document.querySelector('header') || document.querySelector('nav') || - document.querySelector('[class*="header"]') || - document.querySelector('[class*="nav"]') || - document.querySelector('[class*="Header"]') || - document.querySelector('[class*="Nav"]') || document.querySelector('div[role="banner"]'); - if (header) { - if (header.querySelector('#strategie-link') || header.querySelector('a[href*="strategie"]')) { - return; - } - const strategyLink = document.createElement('a'); - strategyLink.id = 'strategie-link'; - strategyLink.className = 'strategie-link'; - strategyLink.href = '#strategie'; - strategyLink.textContent = '📋 Stratégie'; - strategyLink.style.marginLeft = '15px'; - strategyLink.style.color = '#2ecc71'; - strategyLink.style.textDecoration = 'none'; - strategyLink.style.fontWeight = 'bold'; - strategyLink.style.cursor = 'pointer'; - strategyLink.style.display = 'inline-block'; - strategyLink.style.padding = '5px 10px'; - strategyLink.style.borderRadius = '4px'; - strategyLink.style.transition = 'background 0.2s'; - strategyLink.addEventListener('mouseenter', function() { - this.style.background = 'rgba(46, 204, 113, 0.1)'; - }); - strategyLink.addEventListener('mouseleave', function() { - this.style.background = 'transparent'; - }); - strategyLink.addEventListener('click', function(e) { - e.preventDefault(); - createStrategyPage(); - }); - header.appendChild(strategyLink); + let container = header; + + // Si pas de header, créer une barre fixe + if (!header) { + let fixedBar = document.getElementById('custom-nav-bar'); + if (!fixedBar) { + fixedBar = document.createElement('div'); + fixedBar.id = 'custom-nav-bar'; + fixedBar.style.cssText = 'position: fixed; top: 0; right: 0; padding: 10px 20px; z-index: 9999; display: flex; gap: 15px; background: rgba(255,255,255,0.9); border-bottom-left-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);'; + document.body.appendChild(fixedBar); + } + container = fixedBar; } else { - // Si pas de header trouvé, créer une barre en haut de page - const existingTopBar = document.getElementById('strategie-top-bar'); - if (existingTopBar) { - return; - } - - const topBar = document.createElement('div'); - topBar.id = 'strategie-top-bar'; - topBar.style.cssText = 'position: fixed; top: 0; left: 0; right: 0; background: rgba(26, 77, 58, 0.95); padding: 10px 20px; z-index: 1000; text-align: right; box-shadow: 0 2px 4px rgba(0,0,0,0.1);'; - - const strategyLink = document.createElement('a'); - strategyLink.id = 'strategie-link'; - strategyLink.className = 'strategie-link'; - strategyLink.href = '#strategie'; - strategyLink.textContent = '📋 Stratégie'; - strategyLink.style.color = '#2ecc71'; - strategyLink.style.textDecoration = 'none'; - strategyLink.style.fontWeight = 'bold'; - strategyLink.style.cursor = 'pointer'; - strategyLink.style.padding = '5px 15px'; - strategyLink.style.borderRadius = '4px'; - strategyLink.style.transition = 'background 0.2s'; - strategyLink.addEventListener('mouseenter', function() { - this.style.background = 'rgba(46, 204, 113, 0.2)'; - }); - strategyLink.addEventListener('mouseleave', function() { - this.style.background = 'transparent'; - }); - strategyLink.addEventListener('click', function(e) { - e.preventDefault(); - createStrategyPage(); - }); - - topBar.appendChild(strategyLink); - document.body.insertBefore(topBar, document.body.firstChild); - - // Ajouter un padding au body pour compenser la barre fixe - if (!document.body.style.paddingTop || document.body.style.paddingTop === '0px') { - document.body.style.paddingTop = '50px'; - } + // Si header existant, on s'assure qu'on n'a pas déjà ajouté les liens + if (header.querySelector('.custom-nav-link')) return; + + // Créer un conteneur pour nos liens s'il n'existe pas + let linkContainer = document.createElement('div'); + linkContainer.style.cssText = 'display: flex; gap: 15px; margin-left: auto; align-items: center; padding-right: 20px;'; + header.appendChild(linkContainer); + container = linkContainer; } + + // Ajouter les liens + Object.keys(pageTitles).forEach(key => { + if (document.getElementById(`link-${key}`)) return; + + const link = document.createElement('a'); + link.id = `link-${key}`; + link.className = 'custom-nav-link'; + link.href = `#${key}`; + link.textContent = pageTitles[key]; + link.style.cssText = 'color: #2ecc71; text-decoration: none; font-weight: bold; cursor: pointer; font-size: 14px; padding: 5px 8px; border-radius: 4px; transition: background 0.2s;'; + + link.addEventListener('mouseenter', () => link.style.background = 'rgba(46, 204, 113, 0.1)'); + link.addEventListener('mouseleave', () => link.style.background = 'transparent'); + + link.addEventListener('click', (e) => { + e.preventDefault(); + showPage(key); + }); + + container.appendChild(link); + }); } window.addEventListener('popstate', function(event) { - if (window.originalBodyContent && !event.state) { - document.body.innerHTML = window.originalBodyContent; - setTimeout(initStrategyLinks, 100); + if (event.state && event.state.page) { + showPage(event.state.page); + } else if (window.originalBodyContent) { + document.body.innerHTML = window.originalBodyContent; + setTimeout(initStrategyLinks, 100); } });