

<!DOCTYPE html>

<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">

  <link rel="stylesheet" href="/assets/css/just-the-docs-default.css">

  <link rel="stylesheet" href="/assets/css/just-the-docs-head-nav.css" id="jtd-head-nav-stylesheet">

  <style id="jtd-nav-activation">
  
    .site-nav ul li a {
      background-image: none;
    }

  </style>

  

  
    <script src="/assets/js/vendor/lunr.min.js"></script>
  

  <script src="/assets/js/just-the-docs.js"></script>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  



  <!-- Begin Jekyll SEO tag v2.9.0 -->
<title>ProvCollector | A distributed system-provenance collection platform. Agents turn OS telemetry into a uniform event stream; a backend resolves stable object identities and writes a partitioned PostgreSQL provenance graph; analysis tools query and visualise it.</title>
<meta name="generator" content="Jekyll v4.4.1" />
<meta property="og:title" content="ProvCollector" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="A distributed system-provenance collection platform. Agents turn OS telemetry into a uniform event stream; a backend resolves stable object identities and writes a partitioned PostgreSQL provenance graph; analysis tools query and visualise it." />
<meta name="twitter:description" property="og:description" content="A distributed system-provenance collection platform. Agents turn OS telemetry into a uniform event stream; a backend resolves stable object identities and writes a partitioned PostgreSQL provenance graph; analysis tools query and visualise it." />
<link rel="canonical" href="/assets/css/just-the-docs-head-nav.css" />
<meta property="og:url" content="/assets/css/just-the-docs-head-nav.css" />
<meta property="og:site_name" content="ProvCollector" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="ProvCollector" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","description":"A distributed system-provenance collection platform. Agents turn OS telemetry into a uniform event stream; a backend resolves stable object identities and writes a partitioned PostgreSQL provenance graph; analysis tools query and visualise it.","headline":"ProvCollector","url":"/assets/css/just-the-docs-head-nav.css"}</script>
<!-- End Jekyll SEO tag -->


  <link rel="icon" type="image/svg+xml" href="/assets/img/favicon.svg">
<meta name="theme-color" content="#0a5b64">

<script>
  (function () {
    try {
      var stored = localStorage.getItem('provcollector-theme');
      if (stored !== 'provcollector-dark' && stored !== 'provcollector') {
        stored = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
          ? 'provcollector-dark'
          : 'provcollector';
      }
      document.documentElement.setAttribute('data-pc-theme', stored);
      if (stored === 'provcollector-dark') {
        var link = document.querySelector('link[rel=stylesheet]');
        if (link) {
          link.setAttribute(
            'href',
            '/assets/css/just-the-docs-provcollector-dark.css'
          );
        }
      }
    } catch (e) {
      /* localStorage unavailable (private mode, blocked cookies) — keep the light scheme. */
    }
  })();
</script>


</head>

<body>
  <a class="skip-to-main" href="#main-content">Skip to main content</a>
  <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
  <symbol id="svg-link" viewBox="0 0 24 24">
  <title>Link</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link">
    <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
  </svg>
</symbol>

  <symbol id="svg-menu" viewBox="0 0 24 24">
  <title>Menu</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu">
    <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line>
  </svg>
</symbol>

  <symbol id="svg-arrow-right" viewBox="0 0 24 24">
  <title>Expand</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right">
    <polyline points="9 18 15 12 9 6"></polyline>
  </svg>
</symbol>

  <!-- Feather. MIT License: https://github.com/feathericons/feather/blob/master/LICENSE -->
<symbol id="svg-external-link" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-external-link">
  <title id="svg-external-link-title">(external link)</title>
  <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line>
</symbol>

  
    <symbol id="svg-doc" viewBox="0 0 24 24">
  <title>Document</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file">
    <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline>
  </svg>
</symbol>

    <symbol id="svg-search" viewBox="0 0 24 24">
  <title>Search</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search">
    <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line>
  </svg>
</symbol>

  
  
    <!-- Bootstrap Icons. MIT License: https://github.com/twbs/icons/blob/main/LICENSE.md -->
<symbol id="svg-copy" viewBox="0 0 16 16">
  <title>Copy</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16">
    <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/>
    <path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/>
  </svg>
</symbol>
<symbol id="svg-copied" viewBox="0 0 16 16">
  <title>Copied</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-check-fill" viewBox="0 0 16 16">
    <path d="M6.5 0A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3Zm3 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3Z"/>
    <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1A2.5 2.5 0 0 1 9.5 5h-3A2.5 2.5 0 0 1 4 2.5v-1Zm6.854 7.354-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708L7.5 10.793l2.646-2.647a.5.5 0 0 1 .708.708Z"/>
  </svg>
</symbol>

  
</svg>

  
    <header class="side-bar">
  <div class="site-header">
    <a href="/" class="site-title lh-tight"><span class="pc-brand">
  <svg class="pc-brand__mark" viewBox="0 0 34 34" width="26" height="26" aria-hidden="true" focusable="false">
    <rect x="1" y="1" width="32" height="32" rx="8" class="pc-brand__plate"/>
    <path d="M11 11 L23 17 M11 11 L11 23 M11 23 L23 17" class="pc-brand__edge"/>
    <circle cx="11" cy="11" r="3.4" class="pc-brand__node pc-brand__node--src"/>
    <circle cx="11" cy="23" r="2.6" class="pc-brand__node"/>
    <circle cx="23" cy="17" r="2.6" class="pc-brand__node"/>
  </svg>
  <span class="pc-brand__text"><strong>Prov</strong>Collector</span>
</span>
</a>
    <button id="menu-button" class="site-button btn-reset" aria-label="Menu" aria-expanded="false">
      <svg viewBox="0 0 24 24" class="icon" aria-hidden="true"><use xlink:href="#svg-menu"></use></svg>
    </button>
  </div>

  <nav aria-label="Main" id="site-nav" class="site-nav">
  
  
    <ul class="nav-list"><li class="nav-list-item"><a href="/" class="nav-list-link">Home</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Getting started submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/getting-started/" class="nav-list-link">Getting started</a><ul class="nav-list"><li class="nav-list-item"><a href="/getting-started/installation/" class="nav-list-link">Installation</a></li><li class="nav-list-item"><a href="/getting-started/quickstart/" class="nav-list-link">Quick start</a></li><li class="nav-list-item"><a href="/getting-started/deploying-agents/" class="nav-list-link">Deploying agents</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Architecture submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/architecture/" class="nav-list-link">Architecture</a><ul class="nav-list"><li class="nav-list-item"><a href="/architecture/pipeline/" class="nav-list-link">The pipeline</a></li><li class="nav-list-item"><a href="/architecture/data-model/" class="nav-list-link">Data model</a></li><li class="nav-list-item"><a href="/architecture/security/" class="nav-list-link">Security model</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Components submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/components/" class="nav-list-link">Components</a><ul class="nav-list"><li class="nav-list-item"><a href="/components/common/" class="nav-list-link">ProvCollector.Common</a></li><li class="nav-list-item"><a href="/components/agent/" class="nav-list-link">ProvCollector.Agent</a></li><li class="nav-list-item"><a href="/components/backend/" class="nav-list-link">ProvCollector.Backend</a></li><li class="nav-list-item"><a href="/components/analysis/" class="nav-list-link">ProvCollector.Analysis</a></li><li class="nav-list-item"><a href="/components/management/" class="nav-list-link">ProvCollector.Management</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Operations submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/operations/" class="nav-list-link">Operations</a><ul class="nav-list"><li class="nav-list-item"><a href="/operations/compose-stack/" class="nav-list-link">Compose stack</a></li><li class="nav-list-item"><a href="/operations/kafka/" class="nav-list-link">Kafka topics and ACLs</a></li><li class="nav-list-item"><a href="/operations/configuration/" class="nav-list-link">Configuration</a></li><li class="nav-list-item"><a href="/operations/ci-and-packages/" class="nav-list-link">CI and packages</a></li><li class="nav-list-item"><a href="/operations/invariants/" class="nav-list-link">Operational invariants</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Reference submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/reference/" class="nav-list-link">Reference</a><ul class="nav-list"><li class="nav-list-item"><a href="/reference/tracker-cli/" class="nav-list-link">Tracker CLI</a></li><li class="nav-list-item"><a href="/reference/event-types/" class="nav-list-link">Event and object types</a></li><li class="nav-list-item"><a href="/reference/settings/" class="nav-list-link">Settings</a></li></ul></li></ul>
  <ul class="nav-list"><li class="nav-list-item external">
          <a href="https://gitlab.syssec.org/prov-research/provcollector" class="nav-list-link external"
            
          >
            Source (GitLab)
            <svg viewBox="0 0 24 24" aria-labelledby="svg-external-link-title"><use xlink:href="#svg-external-link"></use></svg>
          </a>
        </li></ul>
</nav>


<div class="d-md-block d-none site-footer">
  
  
    <div class="pc-nav-footer">
  <button type="button" class="pc-theme-toggle" data-pc-theme-toggle>
    <span class="pc-theme-toggle__icon" aria-hidden="true"></span>
    <span class="pc-theme-toggle__label">Theme</span>
  </button>
</div>

<script>
  (function () {
    if (window.__pcThemeToggleBound) return;
    window.__pcThemeToggleBound = true;

    var DARK = 'provcollector-dark';
    var LIGHT = 'provcollector';

    function current() {
      return document.documentElement.getAttribute('data-pc-theme') === DARK ? DARK : LIGHT;
    }

    function render() {
      var dark = current() === DARK;
      var buttons = document.querySelectorAll('[data-pc-theme-toggle]');
      for (var i = 0; i < buttons.length; i++) {
        buttons[i].querySelector('.pc-theme-toggle__icon').textContent = dark ? '◑' : '◐';
        buttons[i].querySelector('.pc-theme-toggle__label').textContent = dark ? 'Dark' : 'Light';
        buttons[i].setAttribute('aria-label', 'Switch to ' + (dark ? 'light' : 'dark') + ' theme');
      }
    }

    function apply(theme) {
      jtd.setTheme(theme);
      document.documentElement.setAttribute('data-pc-theme', theme);
      try {
        localStorage.setItem('provcollector-theme', theme);
      } catch (e) {
        /* Preference simply will not persist. */
      }
      render();
      // Mermaid bakes its palette in at render time, so the diagrams have to be
      // drawn again rather than just restyled.
      if (window.pcRenderMermaid) window.pcRenderMermaid();
    }

    // Delegated, so the copy of this button that renders later — the mobile one —
    // is handled without a second listener.
    document.addEventListener('click', function (e) {
      var button = e.target.closest && e.target.closest('[data-pc-theme-toggle]');
      if (button) apply(current() === DARK ? LIGHT : DARK);
    });

    render();
    document.addEventListener('DOMContentLoaded', render);
  })();
</script>

  
  </div>
</header>

  
  <div class="main" id="top">
    <div id="main-header" class="main-header">
  
    

<div class="search" role="search">
  <div class="search-input-wrap">
    <input type="text" id="search-input" class="search-input" tabindex="0" placeholder="Search ProvCollector" autocomplete="off">
    <label for="search-input" class="search-label">
      <span class="sr-only">Search ProvCollector</span>
      <svg viewBox="0 0 24 24" class="search-icon" aria-hidden="true"><use xlink:href="#svg-search"></use></svg>
    </label>
  </div>
  <div id="search-results" class="search-results"></div>
</div>

  
  
  
    <nav aria-label="Auxiliary" class="aux-nav">
  <ul class="aux-nav-list">
    
      <li class="aux-nav-list-item">
        <a href="https://gitlab.syssec.org/prov-research/provcollector" class="site-button"
          
          target="_blank" rel="noopener noreferrer"
          
        >
          Source
        </a>
      </li>
    
  </ul>
</nav>

  
</div>

    <div class="main-content-wrap">
      
      <div id="main-content" class="main-content">
        <main>
          
            <h.site-nav ul li a {
  background-image: linear-gradient(-90deg, rgb(92.6134453782%, 95.0756302521%, 95.8963585434%) 0%, rgba(92.6134453782%, 95.0756302521%, 95.8963585434%, 0.8) 80%, rgba(92.6134453782%, 95.0756302521%, 95.8963585434%, 0) 100%);
}

          

          
            
          
        </main>
        
<hr>
<footer>
  
    <p><a href="#top" id="back-to-top">Back to top</a></p>
  

  <p class="text-small mb-0">ProvCollector — system-provenance collection, storage and analysis. Documentation built with <a href="https://jekyllrb.com">Jekyll</a> and <a href="https://just-the-docs.com">Just the Docs</a>.</p>

  <div class="d-md-none mt-4 fs-2">
    
    
      <div class="pc-nav-footer">
  <button type="button" class="pc-theme-toggle" data-pc-theme-toggle>
    <span class="pc-theme-toggle__icon" aria-hidden="true"></span>
    <span class="pc-theme-toggle__label">Theme</span>
  </button>
</div>

<script>
  (function () {
    if (window.__pcThemeToggleBound) return;
    window.__pcThemeToggleBound = true;

    var DARK = 'provcollector-dark';
    var LIGHT = 'provcollector';

    function current() {
      return document.documentElement.getAttribute('data-pc-theme') === DARK ? DARK : LIGHT;
    }

    function render() {
      var dark = current() === DARK;
      var buttons = document.querySelectorAll('[data-pc-theme-toggle]');
      for (var i = 0; i < buttons.length; i++) {
        buttons[i].querySelector('.pc-theme-toggle__icon').textContent = dark ? '◑' : '◐';
        buttons[i].querySelector('.pc-theme-toggle__label').textContent = dark ? 'Dark' : 'Light';
        buttons[i].setAttribute('aria-label', 'Switch to ' + (dark ? 'light' : 'dark') + ' theme');
      }
    }

    function apply(theme) {
      jtd.setTheme(theme);
      document.documentElement.setAttribute('data-pc-theme', theme);
      try {
        localStorage.setItem('provcollector-theme', theme);
      } catch (e) {
        /* Preference simply will not persist. */
      }
      render();
      // Mermaid bakes its palette in at render time, so the diagrams have to be
      // drawn again rather than just restyled.
      if (window.pcRenderMermaid) window.pcRenderMermaid();
    }

    // Delegated, so the copy of this button that renders later — the mobile one —
    // is handled without a second listener.
    document.addEventListener('click', function (e) {
      var button = e.target.closest && e.target.closest('[data-pc-theme-toggle]');
      if (button) apply(current() === DARK ? LIGHT : DARK);
    });

    render();
    document.addEventListener('DOMContentLoaded', render);
  })();
</script>

    
  </div>
</footer>

      </div>
    </div>
    
      

<div class="search-overlay"></div>

    
  </div>

  
    <script type="module">
  import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11.17.2/dist/mermaid.esm.min.mjs';

  var SELECTOR = 'pre.mermaid, .language-mermaid';

  // Mirrors the SCSS palettes in _sass/custom/custom.scss. Mermaid derives
  // contrast colours arithmetically, so these have to be concrete values
  // rather than CSS custom properties.
  var PALETTES = {
    'provcollector': {
      accent: '#0a5b64',
      accentSoft: '#e8f4f5',
      accentLine: '#b6dde1',
      amber: '#a86f13',
      amberSoft: '#fdf4e0',
      surface: '#ffffff',
      surfaceAlt: '#f6f9fa',
      line: '#dde5e9',
      muted: '#5f7180',
      textStrong: '#101a21',
      textBody: '#2b3a44'
    },
    'provcollector-dark': {
      accent: '#4fd1c5',
      accentSoft: '#14343a',
      accentLine: '#2c5f66',
      amber: '#e0b24b',
      amberSoft: '#33290f',
      surface: '#161e24',
      surfaceAlt: '#0f151a',
      line: '#253038',
      muted: '#93a3ac',
      textStrong: '#eef4f6',
      textBody: '#c3cfd6'
    }
  };

  function palette() {
    var theme = document.documentElement.getAttribute('data-pc-theme');
    return PALETTES[theme] || PALETTES['provcollector'];
  }

  function config() {
    var c = palette();
    var base = {
  startOnLoad: false,
  securityLevel: 'loose',
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
  flowchart: {
    htmlLabels: true,
    curve: 'basis',
    padding: 12,
    nodeSpacing: 38,
    rankSpacing: 44,
    useMaxWidth: true,
    // Default is 200px, which re-wraps labels that already break themselves
    // with <br/>. Raising it leaves the line breaks under the diagram's control.
    wrappingWidth: 340
  }
}
;

    base.theme = 'base';

    base.themeVariables = {
      background: c.surfaceAlt,
      primaryColor: c.accentSoft,
      primaryBorderColor: c.accent,
      primaryTextColor: c.textStrong,
      secondaryColor: c.surface,
      secondaryBorderColor: c.line,
      secondaryTextColor: c.textStrong,
      tertiaryColor: c.surface,
      tertiaryBorderColor: c.line,
      tertiaryTextColor: c.textStrong,
      mainBkg: c.accentSoft,
      nodeBorder: c.accent,
      nodeTextColor: c.textStrong,
      lineColor: c.accent,
      textColor: c.textBody,
      clusterBkg: c.surface,
      clusterBorder: c.line,
      titleColor: c.muted,
      edgeLabelBackground: c.surfaceAlt,
      fontSize: '13px'
    };

    // Semantic classes assigned in the .mmd sources. Keeping them here rather
    // than as classDef lines keeps the diagram sources colour-free.
    base.themeCSS = [
      '.edgeLabel, .edgeLabel p { color: ' + c.muted + '; font-size: 11px; }',
      '.cluster-label, .cluster-label p { color: ' + c.muted + '; font-size: 11px;',
      '  font-weight: 700; letter-spacing: 0.04em; }',

      '.node.topic > rect, .node.topic > path, .node.topic > polygon {',
      '  fill: ' + c.surface + '; stroke: ' + c.accent + '; }',

      '.node.store > rect, .node.store > path, .node.store > polygon {',
      '  fill: ' + c.surface + '; stroke: ' + c.muted + '; stroke-dasharray: 4 3; }',

      '.node.management > rect, .node.management > path, .node.management > polygon {',
      '  fill: ' + c.amberSoft + '; stroke: ' + c.amber + '; }',

      '.node.event > rect { fill: ' + c.surface + '; stroke: ' + c.accent + '; }',

      '.node.dataplane > rect, .node.dataplane > path, .node.dataplane > polygon {',
      '  fill: ' + c.accentSoft + '; stroke: ' + c.accent + '; }',

      'span.nodeLabel i { color: ' + c.muted + '; font-style: normal; font-size: 11px; }'
    ].join('\n');

    return base;
  }

  // Mermaid replaces the element's content with the rendered SVG, so the
  // original source has to be kept somewhere a re-render can reach it.
  var diagrams = [];
  document.querySelectorAll(SELECTOR).forEach(function (el) {
    diagrams.push({ el: el, source: el.textContent });
  });

  function render() {
    diagrams.forEach(function (d) {
      d.el.removeAttribute('data-processed');
      d.el.textContent = d.source;
    });
    mermaid.initialize(config());
    mermaid.run({ querySelector: SELECTOR });
  }

  // Called by the colour-scheme toggle in nav_footer_custom.html.
  window.pcRenderMermaid = render;

  render();
</script>

  
</body>
</html>

