Fixes for scatterplot
Test and deploy / deploy (push) Successful in 31s

This commit is contained in:
2026-07-29 10:06:39 -05:00
parent 3c7abc1cbc
commit cf56445915
8 changed files with 77 additions and 347 deletions
+1 -2
View File
@@ -196,7 +196,7 @@ export function renderStatisticsPage(statistics) {
</nav> </nav>
</header> </header>
<main class="statistics-container"> <main class="statistics-container">
<p class="statistics-intro">Explore addressed Issue-IDs by release, followed by counts of the releases represented in the issue data.</p> <p class="statistics-intro">Explore addressed Issue-IDs by product and release.</p>
<section class="issue-plot" aria-labelledby="issue-plot-heading"> <section class="issue-plot" aria-labelledby="issue-plot-heading">
<div class="issue-plot-heading"> <div class="issue-plot-heading">
<div> <div>
@@ -218,7 +218,6 @@ export function renderStatisticsPage(statistics) {
</div> </div>
<p id="issue-plot-summary" class="issue-plot-summary" aria-live="polite"></p> <p id="issue-plot-summary" class="issue-plot-summary" aria-live="polite"></p>
</section> </section>
${statistics.map(renderProduct).join('\n')}
</main> </main>
<script type="module" src="js/statistics.js"></script> <script type="module" src="js/statistics.js"></script>
</body> </body>
+12
View File
@@ -9,6 +9,7 @@ globalThis.Element = dom.window.Element;
globalThis.localStorage = dom.window.localStorage; globalThis.localStorage = dom.window.localStorage;
const { CheckboxTree } = await import('../web/vendor/checkbox-tree/checkbox-tree.js'); const { CheckboxTree } = await import('../web/vendor/checkbox-tree/checkbox-tree.js');
const { findAddressedReleaseNode } = await import('../web/js/tree.js');
function createTree(options = {}) { function createTree(options = {}) {
const container = document.createElement('div'); const container = document.createElement('div');
@@ -103,3 +104,14 @@ test('rejects duplicate node ids', () => {
/Duplicate CheckboxTree node id/ /Duplicate CheckboxTree node id/
); );
}); });
test('finds an addressed release leaf by product and exact filename', () => {
const nodes = [
{ id: 'known', metadata: { path: ['PAN-OS'], addressed: [] } },
{ id: 'release', metadata: { path: ['PAN-OS', '11', '11.1'], addressed: ['11.1.13-h3.md'] } },
{ id: 'other', metadata: { path: ['GlobalProtect'], addressed: ['11.1.13-h3.md'] } }
];
assert.equal(findAddressedReleaseNode(nodes, 'PAN-OS', '11.1.13-h3')?.id, 'release');
assert.equal(findAddressedReleaseNode(nodes, 'PAN-OS', '11.1.13'), undefined);
});
+2 -16
View File
@@ -56,26 +56,12 @@ test('counts unique releases at major and minor levels and hotfixes at patch lev
); );
}); });
test('renders the nested levels into a static HTML page', () => { test('renders the graph without displaying the legacy release tables', () => {
const html = renderStatisticsPage(buildReleaseStatistics([ const html = renderStatisticsPage(buildReleaseStatistics([
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' } { product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' }
])); ]));
assert.match(html, /class="stats-major"/);
assert.match(html, /class="stats-minor"[^>]+hidden/);
assert.match(html, /class="stats-patch"[^>]+hidden/);
assert.match(html, /class="stats-toggle"[^>]+aria-expanded="false"/);
assert.match(html, /src="js\/statistics\.js"/); assert.match(html, /src="js\/statistics\.js"/);
assert.match(html, /id="issue-plot-canvas"/); assert.match(html, /id="issue-plot-canvas"/);
assert.match(html, />1 hotfix</); assert.doesNotMatch(html, /class="stats-product"/);
});
test('pluralizes hotfix counts correctly', () => {
const html = renderStatisticsPage(buildReleaseStatistics([
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h1' },
{ product: 'PAN-OS', issueType: 'addressed', version: '10.1.2-h2' }
]));
assert.match(html, />2 hotfixes</);
assert.doesNotMatch(html, /hotfixs/);
}); });
+9 -1
View File
@@ -1,5 +1,11 @@
import { loadIssuesForCheckedPaths } from './issues.js'; import { loadIssuesForCheckedPaths } from './issues.js';
import { getCheckedFileRefs, initializeTree, renderProductTree, restoreTreeState } from './tree.js'; import {
getCheckedFileRefs,
initializeTree,
renderProductTree,
restoreTreeState,
selectAddressedRelease
} from './tree.js';
import { applyIssueSearchFilter, getIssueTypeFilters, initializeUI } from './ui.js'; import { applyIssueSearchFilter, getIssueTypeFilters, initializeUI } from './ui.js';
import { expandFilePrefixLevel } from './product-tree-model.js'; import { expandFilePrefixLevel } from './product-tree-model.js';
@@ -26,6 +32,8 @@ function loadProductTree() {
productsData = expandFilePrefixLevel(data); productsData = expandFilePrefixLevel(data);
await renderProductTree(productsData); await renderProductTree(productsData);
restoreTreeState(); restoreTreeState();
const params = new URLSearchParams(window.location.search);
selectAddressedRelease(params.get('product'), params.get('release'));
refreshIssuesForCurrentSelection(); refreshIssuesForCurrentSelection();
}) })
.catch(error => console.error('Error loading products:', error)); .catch(error => console.error('Error loading products:', error));
+30 -2
View File
@@ -34,6 +34,10 @@ const productCache = new Map();
let currentProduct = null; let currentProduct = null;
let renderedPoints = []; let renderedPoints = [];
let hoveredPoint = null; let hoveredPoint = null;
const initialParams = new URLSearchParams(window.location.search);
const initialProduct = initialParams.get('product') || 'PAN-OS';
const initialTrain = initialParams.get('train') || '11.1';
let restoreInitialSelection = true;
function releaseTrain(version) { function releaseTrain(version) {
return version.match(/^\d+\.\d+/)?.[0] ?? version; return version.match(/^\d+\.\d+/)?.[0] ?? version;
@@ -48,6 +52,14 @@ function fillSelect(select, options) {
})); }));
} }
function updatePlotQuery() {
if (!currentProduct || !trainSelect.value) return;
const url = new URL(window.location.href);
url.searchParams.set('product', currentProduct.product);
url.searchParams.set('train', trainSelect.value);
history.replaceState(null, '', url);
}
async function loadProduct(filename) { async function loadProduct(filename) {
if (!productCache.has(filename)) { if (!productCache.has(filename)) {
productCache.set(filename, fetch(`data/statistics/${filename}`).then(response => { productCache.set(filename, fetch(`data/statistics/${filename}`).then(response => {
@@ -167,7 +179,7 @@ function drawPlot() {
renderedPoints.forEach(point => { renderedPoints.forEach(point => {
context.beginPath(); context.beginPath();
const hovered = point.id === hoveredPoint?.id && point.release === hoveredPoint?.release; const hovered = point.issueNumber === hoveredPoint?.issueNumber;
context.arc(point.x, point.y, hovered ? 5 : 3, 0, Math.PI * 2); context.arc(point.x, point.y, hovered ? 5 : 3, 0, Math.PI * 2);
context.fillStyle = hovered ? colors.hover : colors.point; context.fillStyle = hovered ? colors.hover : colors.point;
context.globalAlpha = hovered ? 1 : 0.72; context.globalAlpha = hovered ? 1 : 0.72;
@@ -212,12 +224,20 @@ canvas?.addEventListener('pointerleave', () => {
canvas?.addEventListener('click', event => { canvas?.addEventListener('click', event => {
const point = pointNear(event); const point = pointNear(event);
if (point) window.location.href = `index.html?issue=${encodeURIComponent(point.id)}`; if (point) {
const params = new URLSearchParams({
issue: point.id,
product: currentProduct.product,
release: point.release
});
window.location.href = `index.html?${params}`;
}
}); });
trainSelect?.addEventListener('change', () => { trainSelect?.addEventListener('change', () => {
hoveredPoint = null; hoveredPoint = null;
tooltip.hidden = true; tooltip.hidden = true;
updatePlotQuery();
drawPlot(); drawPlot();
}); });
@@ -225,6 +245,12 @@ productSelect?.addEventListener('change', async () => {
try { try {
currentProduct = await loadProduct(productSelect.value); currentProduct = await loadProduct(productSelect.value);
fillSelect(trainSelect, Array.from(new Set(currentProduct.releases.map(releaseTrain))).reverse()); fillSelect(trainSelect, Array.from(new Set(currentProduct.releases.map(releaseTrain))).reverse());
if (restoreInitialSelection && initialProduct === currentProduct.product && initialTrain &&
Array.from(trainSelect.options).some(option => option.value === initialTrain)) {
trainSelect.value = initialTrain;
}
restoreInitialSelection = false;
updatePlotQuery();
drawPlot(); drawPlot();
} catch (error) { } catch (error) {
summary.textContent = error.message; summary.textContent = error.message;
@@ -245,6 +271,8 @@ if (canvas) {
option.textContent = product; option.textContent = product;
return option; return option;
})); }));
const requestedProduct = products.find(([product]) => product === initialProduct);
if (requestedProduct) productSelect.value = requestedProduct[1];
productSelect.dispatchEvent(new Event('change')); productSelect.dispatchEvent(new Event('change'));
}) })
.catch(error => { .catch(error => {
+18
View File
@@ -62,6 +62,24 @@ export function getCheckedFileRefs() {
}; };
} }
export function selectAddressedRelease(product, release) {
if (!productTree || !product || !release) return false;
const node = findAddressedReleaseNode(productTree.nodesById.values(), product, release);
if (!node) return false;
productTree.setSelectedIds([node.id]);
pushTreeState();
return true;
}
export function findAddressedReleaseNode(nodes, product, release) {
const filename = `${release}.md`;
return Array.from(nodes).find(candidate =>
candidate.metadata?.path?.[0] === product &&
candidate.metadata?.addressed?.includes(filename)
);
}
// State restoration now happens when setData renders the generic tree. // State restoration now happens when setData renders the generic tree.
export function restoreTreeState() {} export function restoreTreeState() {}
+4
View File
@@ -65,6 +65,10 @@ function initializeIssueSearch() {
function initializeIssueTypeFilters(onSelectionChange) { function initializeIssueTypeFilters(onSelectionChange) {
const addressedFilter = document.getElementById('filter-addressed'); const addressedFilter = document.getElementById('filter-addressed');
const knownFilter = document.getElementById('filter-known'); const knownFilter = document.getElementById('filter-known');
if (new URLSearchParams(window.location.search).has('release')) {
issueTypeFilters.addressed = true;
saveTypeFilters();
}
// Restore checkbox state from persisted filters // Restore checkbox state from persisted filters
addressedFilter.checked = issueTypeFilters.addressed; addressedFilter.checked = issueTypeFilters.addressed;
+1 -326
View File
@@ -21,7 +21,7 @@
</nav> </nav>
</header> </header>
<main class="statistics-container"> <main class="statistics-container">
<p class="statistics-intro">Explore addressed Issue-IDs by release, followed by counts of the releases represented in the issue data.</p> <p class="statistics-intro">Explore addressed Issue-IDs by product and release.</p>
<section class="issue-plot" aria-labelledby="issue-plot-heading"> <section class="issue-plot" aria-labelledby="issue-plot-heading">
<div class="issue-plot-heading"> <div class="issue-plot-heading">
<div> <div>
@@ -43,331 +43,6 @@
</div> </div>
<p id="issue-plot-summary" class="issue-plot-summary" aria-live="polite"></p> <p id="issue-plot-summary" class="issue-plot-summary" aria-live="polite"></p>
</section> </section>
<section class="stats-product">
<h2>GlobalProtect <span class="stats-product-total">50 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0"><span class="version-label">6</span></button></th><td>50 releases</td></tr>
<tr class="stats-minor" id="p0-major-0-0" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-0"><span class="version-label">6.3</span></button></th><td>13 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.3</span></th><td>10 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p0-major-0-1" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-1"><span class="version-label">6.2</span></button></th><td>19 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.8</span></th><td>9 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p0-major-0-2" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-2"><span class="version-label">6.1</span></button></th><td>6 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p0-major-0-3" data-stats-parent="p0-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p0-major-0-minor-3"><span class="version-label">6.0</span></button></th><td>12 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p0-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.1</span></th><td>0 hotfixes</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stats-product">
<h2>GlobalProtect-Android <span class="stats-product-total">16 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0"><span class="version-label">6</span></button></th><td>16 releases</td></tr>
<tr class="stats-minor" id="p1-major-0-0" data-stats-parent="p1-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0-minor-0"><span class="version-label">6.1</span></button></th><td>10 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p1-major-0-1" data-stats-parent="p1-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p1-major-0-minor-1"><span class="version-label">6.0</span></button></th><td>6 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p1-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.1</span></th><td>0 hotfixes</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stats-product">
<h2>GlobalProtect-iOS <span class="stats-product-total">14 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0"><span class="version-label">6</span></button></th><td>14 releases</td></tr>
<tr class="stats-minor" id="p2-major-0-0" data-stats-parent="p2-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0-minor-0"><span class="version-label">6.1</span></button></th><td>9 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.1.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p2-major-0-1" data-stats-parent="p2-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p2-major-0-minor-1"><span class="version-label">6.0</span></button></th><td>5 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p2-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.0.2</span></th><td>0 hotfixes</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stats-product">
<h2>GlobalProtect-Linux <span class="stats-product-total">15 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0"><span class="version-label">6</span></button></th><td>15 releases</td></tr>
<tr class="stats-minor" id="p3-major-0-0" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-0"><span class="version-label">6.3</span></button></th><td>2 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-0" hidden><th scope="row"><span class="version-label">6.3.3</span></th><td>1 hotfix</td></tr>
<tr class="stats-minor" id="p3-major-0-1" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-1"><span class="version-label">6.2</span></button></th><td>6 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-1" hidden><th scope="row"><span class="version-label">6.2.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p3-major-0-2" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-2"><span class="version-label">6.1</span></button></th><td>5 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-2" hidden><th scope="row"><span class="version-label">6.1.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p3-major-0-3" data-stats-parent="p3-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p3-major-0-minor-3"><span class="version-label">6.0</span></button></th><td>2 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p3-major-0-minor-3" hidden><th scope="row"><span class="version-label">6.0.3</span></th><td>0 hotfixes</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stats-product">
<h2>PAN-OS <span class="stats-product-total">487 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-0"><span class="version-label">12</span></button></th><td>17 releases</td></tr>
<tr class="stats-minor" id="p4-major-0-0" data-stats-parent="p4-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-0-minor-0"><span class="version-label">12.1</span></button></th><td>17 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.7</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.4</span></th><td>6 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.3</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-0-minor-0" hidden><th scope="row"><span class="version-label">12.1.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1"><span class="version-label">11</span></button></th><td>195 releases</td></tr>
<tr class="stats-minor" id="p4-major-1-0" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-0"><span class="version-label">11.2</span></button></th><td>60 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.13</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.10</span></th><td>10 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.7</span></th><td>14 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.5</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.4</span></th><td>15 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.3</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.2</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.1</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-0" hidden><th scope="row"><span class="version-label">11.2.0</span></th><td>1 hotfix</td></tr>
<tr class="stats-minor" id="p4-major-1-1" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-1"><span class="version-label">11.1</span></button></th><td>102 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.16</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.15</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.14</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.13</span></th><td>8 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.10</span></th><td>13 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.7</span></th><td>6 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.6</span></th><td>20 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.5</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.4</span></th><td>15 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.3</span></th><td>7 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.2</span></th><td>9 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.1</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-1" hidden><th scope="row"><span class="version-label">11.1.0</span></th><td>4 hotfixes</td></tr>
<tr class="stats-minor" id="p4-major-1-2" data-stats-parent="p4-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-1-minor-2"><span class="version-label">11.0</span></button></th><td>33 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.6</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.5</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.4</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.3</span></th><td>6 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.2</span></th><td>5 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.1</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-1-minor-2" hidden><th scope="row"><span class="version-label">11.0.0</span></th><td>4 hotfixes</td></tr>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2"><span class="version-label">10</span></button></th><td>154 releases</td></tr>
<tr class="stats-minor" id="p4-major-2-0" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-0"><span class="version-label">10.2</span></button></th><td>96 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.18</span></th><td>5 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.16</span></th><td>6 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.15</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.14</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.13</span></th><td>12 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.11</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.10</span></th><td>14 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.9</span></th><td>5 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.8</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.7</span></th><td>8 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.6</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.5</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.4</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.3</span></th><td>6 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.2</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.1</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-0" hidden><th scope="row"><span class="version-label">10.2.0</span></th><td>4 hotfixes</td></tr>
<tr class="stats-minor" id="p4-major-2-1" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-1"><span class="version-label">10.1</span></button></th><td>40 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.14</span></th><td>10 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.13</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.12</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.11</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.10</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.9</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.8</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.7</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.6</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.5</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.4</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.3</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-1" hidden><th scope="row"><span class="version-label">10.1.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p4-major-2-2" data-stats-parent="p4-major-2" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-2-minor-2"><span class="version-label">10.0</span></button></th><td>18 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.12</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.11</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.8</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-2-minor-2" hidden><th scope="row"><span class="version-label">10.0.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3"><span class="version-label">9</span></button></th><td>76 releases</td></tr>
<tr class="stats-minor" id="p4-major-3-0" data-stats-parent="p4-major-3" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3-minor-0"><span class="version-label">9.1</span></button></th><td>43 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.19</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.18</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.17</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.16</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.15</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.14</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.13</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.12</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.11</span></th><td>4 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.9</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.3</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.2</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-0" hidden><th scope="row"><span class="version-label">9.1.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p4-major-3-1" data-stats-parent="p4-major-3" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-3-minor-1"><span class="version-label">9.0</span></button></th><td>33 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.17</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.16</span></th><td>5 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.15</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.14</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.13</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.9</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.8</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.6</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.5</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.4</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.3</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.2</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-3-minor-1" hidden><th scope="row"><span class="version-label">9.0.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-4"><span class="version-label">8</span></button></th><td>45 releases</td></tr>
<tr class="stats-minor" id="p4-major-4-0" data-stats-parent="p4-major-4" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p4-major-4-minor-0"><span class="version-label">8.1</span></button></th><td>45 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.26</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.25</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.24</span></th><td>2 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.23</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.22</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.21</span></th><td>3 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.20</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.19</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.18</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.17</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.16</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.15</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.14</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.13</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.12</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.11</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.10</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.9</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.8</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.7</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.6</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.5</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.4</span></th><td>1 hotfix</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.3</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p4-major-4-minor-0" hidden><th scope="row"><span class="version-label">8.1.0</span></th><td>0 hotfixes</td></tr>
</tbody>
</table>
</div>
</section>
<section class="stats-product">
<h2>Prisma Access Agent <span class="stats-product-total">15 releases</span></h2>
<div class="stats-table-wrap">
<table class="stats-table">
<thead><tr><th scope="col">Version</th><th scope="col">Count</th></tr></thead>
<tbody>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-0"><span class="version-label">26</span></button></th><td>3 releases</td></tr>
<tr class="stats-minor" id="p5-major-0-0" data-stats-parent="p5-major-0" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-0-minor-0"><span class="version-label">26.1</span></button></th><td>3 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-0-minor-0" hidden><th scope="row"><span class="version-label">26.1.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-0-minor-0" hidden><th scope="row"><span class="version-label">26.1.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-major"><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1"><span class="version-label">25</span></button></th><td>12 releases</td></tr>
<tr class="stats-minor" id="p5-major-1-0" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-0"><span class="version-label">25.7</span></button></th><td>3 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-0" hidden><th scope="row"><span class="version-label">25.7.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p5-major-1-1" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-1"><span class="version-label">25.6</span></button></th><td>3 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-1" hidden><th scope="row"><span class="version-label">25.6.2</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-1" hidden><th scope="row"><span class="version-label">25.6.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p5-major-1-2" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-2"><span class="version-label">25.4</span></button></th><td>1 release</td></tr>
<tr class="stats-minor" id="p5-major-1-3" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-3"><span class="version-label">25.3</span></button></th><td>4 releases</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-3" hidden><th scope="row"><span class="version-label">25.3.1</span></th><td>0 hotfixes</td></tr>
<tr class="stats-patch" data-stats-parent="p5-major-1-minor-3" hidden><th scope="row"><span class="version-label">25.3.0</span></th><td>0 hotfixes</td></tr>
<tr class="stats-minor" id="p5-major-1-4" data-stats-parent="p5-major-1" hidden><th scope="row"><button class="stats-toggle" type="button" aria-expanded="false" aria-controls="p5-major-1-minor-4"><span class="version-label">25.1</span></button></th><td>1 release</td></tr>
</tbody>
</table>
</div>
</section>
</main> </main>
<script type="module" src="js/statistics.js"></script> <script type="module" src="js/statistics.js"></script>
</body> </body>