PageSourceSearch

https://lists.projectacrn.org/g/acrn-users

html projectacrn.org collected 2026-10-03 22:32:35 UTC 65,700 bytes, 2,081 lines download raw bytes

1
2	
3	<!DOCTYPE html>
4	<html lang="en-US">
5		<head>
6			<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
7			<meta http-equiv="X-UA-Compatible" content="IE=edge">
8			
9				<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
10			
11			<meta name="theme-color" content="#2f6fa7">
12			<meta name="pinterest" content="nopin" />
13			<meta name="pinterest" content="nohover" />
14			
15			<meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" />
16			<link rel="apple-touch-icon" sizes="57x57" href="/orgimg/org.19/favicons/apple-icon-57x57.png?v=1680450446766446918">
17			<link rel="apple-touch-icon" sizes="60x60" href="/orgimg/org.19/favicons/apple-icon-60x60.png?v=1680450446766446918">
18			<link rel="apple-touch-icon" sizes="72x72" href="/orgimg/org.19/favicons/apple-icon-72x72.png?v=1680450446766446918">
19			<link rel="apple-touch-icon" sizes="76x76" href="/orgimg/org.19/favicons/apple-icon-76x76.png?v=1680450446766446918">
20			<link rel="apple-touch-icon" sizes="114x114" href="/orgimg/org.19/favicons/apple-icon-114x114.png?v=1680450446766446918">
21			<link rel="apple-touch-icon" sizes="120x120" href="/orgimg/org.19/favicons/apple-icon-120x120.png?v=1680450446766446918">
22			<link rel="apple-touch-icon" sizes="144x144" href="/orgimg/org.19/favicons/apple-icon-144x144.png?v=1680450446766446918">
23			<link rel="apple-touch-icon" sizes="152x152" href="/orgimg/org.19/favicons/apple-icon-152x152.png?v=1680450446766446918">
24			<link rel="apple-touch-icon" sizes="180x180" href="/orgimg/org.19/favicons/apple-icon-180x180.png?v=1680450446766446918">
25			<link rel="icon" type="image/png" sizes="192x192"  href="/orgimg/org.19/favicons/android-icon-192x192.png?v=1680450446766446918">
26			<link rel="icon" type="image/png" sizes="32x32" href="/orgimg/org.19/favicons/favicon-32x32.png?v=1680450446766446918">
27			<link rel="icon" type="image/png" sizes="96x96" href="/orgimg/org.19/favicons/favicon-96x96.png?v=1680450446766446918">
28			<link rel="icon" type="image/png" sizes="16x16" href="/orgimg/org.19/favicons/favicon-16x16.png?v=1680450446766446918">
29			<link rel="manifest" href="/orgimg/org.19/favicons/manifest.json?v=1680450446766446918">
30			<meta name="msapplication-TileColor" content="#ffffff">
31			<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
32			
33			
34			
35
36<script>
37/* stubs */
38	const hapticsImpactHeavy = async () => {
39	};
40	const hapticsImpactMedium = async () => {
41	};
42	const hapticsImpactLight = async () => {
43	};
44	const hapticsVibrate = async () => {
45	};
46	const hapticsSelectionStart = async () => {
47	};
48	const hapticsSelectionChanged = async () => {
49	};
50	const hapticsSelectionEnd = async () => {
51	};
52</script>
52
53
54			
55<script>
56	
57		function setPullToRefresh() {}
58	
59	function gotoURL(inurl) {
60		window.location.href = inurl;
61		return;
62	}
63	function contentLoaded(isHTMX, f, caller = "") {
64		console.log("contentLoaded: " + isHTMX + " " + caller);
65		if (isHTMX == true) {
66			document.body.addEventListener('htmx:afterSettle', f, {once: true});
67		} else {
68			if (document.readyState !== 'loading') {
69				console.log('document is already ready, just execute code here');
70				f();
71			} else {
72				console.log('document was not ready, place code here');
73				document.addEventListener('DOMContentLoaded', f, {once: true});
74			}
75		}
76	}
77
78	function HideAppSidebarOnKeyboard() {
79		console.log("In HideAppSidebarOnKeyboard");
80		
81	}
82	// stub
83	function logError(data, url, linenumber) {
84		console.log(data)
85		return;
86	}
87	var pushSubToken;
88	var ignoreErrors = false;
89	var lastError = "";
90
91	// Auto-hide the fixed app top navbar on reading-heavy pages. The
92	// navbar tracks scroll delta 1:1 in both directions: scrolling down
93	// slides it off at the same pixel rate as the page; scrolling up —
94	// even one pixel — starts bringing it back at the same rate. When
95	// the user is at the very top, it's always fully visible. Opt-in
96	// per page; xs only. Bottom tab bar is untouched.
97	function EnableTopbarAutoHide() {
98		if (document.documentElement.clientWidth > 767) return;
99		var body = document.body;
100		body.classList.add('auto-hide-topbar');
101		// Measure the actual headerbar height so notched devices (iOS)
102		// hide the full bar including the safe-area-inset-top padding,
103		// not just the 50px content row. Fall back to 50 if the
104		// element isn't found for any reason.
105		var headerEl = document.getElementById('headerbar');
106		var navHeight = headerEl ? headerEl.offsetHeight : 50;
107		var offset = 0;
108		var lastY = window.scrollY;
109		function onScroll() {
110			var y = window.scrollY;
111			var dy = y - lastY;
112			lastY = y;
113			if (y <= 0) {
114				offset = 0;
115			} else {
116				offset -= dy;
117				if (offset > 0) offset = 0;
118				if (offset < -navHeight) offset = -navHeight;
119			}
120			body.style.setProperty('--topbar-offset', offset + 'px');
121		}
122		window.addEventListener('scroll', onScroll, { passive: true });
123		gioDestroy(function() {
124			window.removeEventListener('scroll', onScroll);
125			body.classList.remove('auto-hide-topbar');
126			body.style.removeProperty('--topbar-offset');
127		});
128	}
129	
130				var gioBundleReported = false;
131		function gioReport(fields) {
132			try {
133				var pairs = [];
134				for (var k in fields) {
135					if (fields[k] !== undefined && fields[k] !== null) {
136						pairs.push(encodeURIComponent(k) + '=' + encodeURIComponent(fields[k]));
137					}
138				}
139				var xhr = new XMLHttpRequest();
140				xhr.open('POST', '/jsclienterror', true);
141				xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
142				xhr.send(pairs.join('&'));
143			} catch (e) {}
144		}
145		// The report cannot depend on the application bundle: when the bundle
146		// is what failed to load, a jQuery transport has nothing to stand on.
147		// The script tag's onerror stores the src if it fires before this
148		// script runs.
149		window.__gioBundleFailed = function(src) {
150			if (gioBundleReported) return;
151			gioBundleReported = true;
152			gioReport({
153				msg: "bundle-load-failure",
154				url: src,
155				client_id: "web.app01-g2.5877799.1791066753887697256"
156			});
157		};
158		if (window.__gioBundleErr) {
159			window.__gioBundleFailed(window.__gioBundleErr);
160		}
161		window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) {
162			let column;
163			let stack;
164			if (console && console.log) {
165				console.log("msg:", errorMessage);
166				console.log("url:", errorUrl);
167				console.log("line:", errorLine);
168				if (errorColumn !== undefined && errorObj != null) {
169					console.log("column:", errorColumn);
170					column = errorColumn;
171				}
172				if (errorObj !== undefined && errorObj != null) {
173					console.log("stack:", errorObj.stack);
174					stack = errorObj.stack;
175				}
176				console.log("client_id:", "web.app01-g2.5877799.1791066753887697256");
177				console.log("last_error:", lastError);
178				console.log("stack:", stack);
179			}
180			if (errorUrl == "" || errorUrl === null) {
181				errorUrl = window.location.href;
182			}
183			if (errorMessage.includes("SecurityError:") == true) {
184				ignoreErrors = true;
185			}
186			if (ignoreErrors == true) {
187				console.log("cookies, disabled, ignoring");
188				lastError = errorMessage;
189				return;
190			}
191						// With the bundle absent, every reference to a bundle global and
192			// every style-injection into the missing sheet throws; the
193			// bundle-load-failure report already carries the cause, so the
194			// cascade is noise.
195			if ((typeof jQuery === 'undefined' || typeof htmx === 'undefined') &&
196				(errorMessage.indexOf("is not defined") !== -1 || errorMessage.indexOf("Can't find variable") !== -1 || errorMessage.indexOf("insertRule") !== -1)) {
197				lastError = errorMessage;
198				return;
199			}
200			var ignoreMessages = ["ResizeObserver loop limit exceeded",
201				"TypeError: can't redefine non-configurable property \"userAgent\"",
202				"TypeError: can't redefine non-configurable property \"getChannelData\"",
203				"ReferenceError: tinymce is not defined",
204				"Uncaught ReferenceError: timeoutId is not defined",
205				"ReferenceError: Can't find variable: tinymce"];
206			for (var i = 0; i < ignoreMessages.length; i++) {
207				if (errorMessage === ignoreMessages[i]) {
208					lastError = errorMessage;
209					return;
210				}
211			}
212			if (errorUrl.indexOf("safari-extension:") === 0 || errorUrl.indexOf("moz-extension:") === 0 || errorUrl.indexOf("chrome-extension:") === 0) {
213				lastError = errorMessage;
214				return;
215			}
216			if (errorUrl.indexOf("googletagmanager.com") !== -1 || errorUrl.indexOf("socialsearch.com") !== -1) {
217				lastError = errorMessage;
218				return;
219			}
220			if (errorLine === 0 || errorLine === 1) {
221				lastError = errorMessage;
222				return;
223			}
224			gioReport({
225				msg: errorMessage,
226				url: errorUrl,
227				line: errorLine,
228				column: column,
229				stack: stack,
230				last_error: lastError,
231				client_id: "web.app01-g2.5877799.1791066753887697256"
232			});
233			lastError = errorMessage;
234			return true;
235		}
236	
237</script>
237
238			
239			
240			
240<script src="/tinymce-5.10.9/tinymce.min.js"></script>
240
241			
241<script src="/js/browser-image-compression-2.0.2.min.js"></script>
241
242			<link href="/css/application-07b87eb5d00416f24d1d9fb6b4e4ed02.css" rel="stylesheet" id="groupsio-css">
243			
243<script src="/js/application-c16d4980043b6020f21de2d46d113a60.js" id="groupsio-js" onerror="(window.__gioBundleFailed||function(s){window.__gioBundleErr=s})(this.src)"></script>
243
244			
244<script src="/js/run_prettify.js"></script>
244
245			<title>[email protected] | Home</title>
246			
247
248			
249				
250
251
252
253<link rel="stylesheet" type="text/css" href="/css/cookieconsent-3.1.0.min.css" />
254<script src="/js/cookieconsent-3.1.0.min.js"></script>
vendor: 1 bytes, line 254
254
255<script>
256  window.addEventListener("load", function(){
257  window.cookieconsent.initialise({
258    "palette": {
259      "popup": {
260        "background": "#d9edf7",
261        "text": "#31708f"
262      },
263      "button": {
264        "background": "#56cbdb",
265        "text": "#ffffff"
266      }
267    },
268    "cookie": {
269        "domain": ".{{.Org.Domain}}"
270    },
271    "content": {
272      "message": "Our site uses cookies so that we can remember you and understand how you and other visitors use our site, to improve your browsing experience and help us improve our site. By continuing to use our website, you agree to our use of such cookies.",
273      "dismiss": "I Agree",
274      "href": "https://groups.io/static/cookie_policy"
275    }
276  })});
277</script>
277
278
279
280			
281			
282	<link rel="alternate" type="application/rss+xml" 
283title="RSS Feed for acrn-users"
284  href="https://lists.projectacrn.org/g/acrn-users/rss" />
285	<meta property="og:url"           content="https://lists.projectacrn.org/g/acrn-users" />
286	<meta property="og:type"          content="website" />
287	<meta property="og:title"         content="acrn-users lists.projectacrn.org Group" />
288	<meta property="og:description"   content="Mailing list to discuss ACRN hypervisor environment setup, configuration, tool usage, debug information, bug reporting and feedback, etc." />
289	<meta property="og:image"         content="https://groups.io/orgimg/org.19/logofull.png?v=1680450446766446918" />
290
291<script>
292	htmx.config.scrollBehavior = "instant";
293	htmx.config.historyCacheSize = 0;
294	htmx.config.defaultSettleDelay = 0;
295	console.log("FULL PAGE LOAD");
296
297	// Short fade-in on #maincontent-refresh after every HTMX swap — adds zero latency
298	// because it runs AFTER the new content has arrived. We listen to afterRequest
299	// (fires once per HTMX request) rather than afterSwap (fires once per swapped
300	// element, including every hx-swap-oob badge — which would cancel the animation).
301	// Listen on document because this script runs in <head> before <body> exists.
302	document.addEventListener('htmx:afterRequest', function(evt) {
303		if (!evt.detail || !evt.detail.successful) return;
304		var refresh = document.getElementById('maincontent-refresh');
305		if (!refresh) return;
306		refresh.classList.remove('gio-fade-in');
307		// force reflow so removing then adding re-starts the animation each time
308		void refresh.offsetWidth;
309		refresh.classList.add('gio-fade-in');
310	});
311
312	// Top-of-viewport progress bar shown while an HTMX request is in flight.
313	// Provides immediate visual feedback for taps even before content arrives.
314	document.addEventListener('htmx:beforeRequest', function() {
315		var bar = document.getElementById('gio-progress-bar');
316		if (bar) bar.classList.add('active');
317	});
318	document.addEventListener('htmx:afterRequest', function() {
319		var bar = document.getElementById('gio-progress-bar');
320		if (bar) bar.classList.remove('active');
321	});
322
323	// Bootstrap appends an open tooltip to <body>, outside the content HTMX
324	// replaces, so clicking a boosted link while its tooltip shows would leave
325	// the tooltip stranded on the new page. Dispose of the open tooltips
326	// whose triggers are about to be swapped out.
327	document.addEventListener('htmx:beforeSwap', function(evt) {
328		var target = evt.detail && evt.detail.target;
329		if (!target || typeof bootstrap === 'undefined') return;
330		target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) {
331			var tip = bootstrap.Tooltip.getInstance(el);
332			if (tip) tip.dispose();
333		});
334	});
335
336	// Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back
337	// chevron, and the navbar overflow action slot. Uses the shared helpers
338	// from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes,
339	// so this is safe on the plain web too.
340	document.addEventListener('click', function(ev) {
341		if (typeof hapticsSelectionChanged !== 'function') return;
342		var target = ev.target;
343		if (!target || !target.closest) return;
344		if (target.closest('.mobilesidebar-item') ||
345			target.closest('#logo a') ||
346			target.closest('#header-action-slot a')) {
347			hapticsSelectionChanged();
348		}
349	}, true);
350</script>
350
351		</head>
352		<body id="body" class="" hx-headers='{"Accept-Version": "9136901318d0dc36d9b8d1a76bd6f080d4b68e79"}' hx-ext="preload" hx-boost="false">
353			<div id="gio-progress-bar" aria-hidden="true"></div>
354			
355				
355<script>
356					if (window.matchMedia) {
357						var darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
358						if (darkModeQuery.matches) {
359							document.body.classList.add('dark-mode');
360						}
361						var darkModeChanged = function(e) {
362							document.body.classList.toggle('dark-mode', e.matches);
363						};
364						if (darkModeQuery.addEventListener) {
365							darkModeQuery.addEventListener('change', darkModeChanged);
366						} else if (darkModeQuery.addListener) {
367							// Safari before 14 has no addEventListener on MediaQueryList
368							darkModeQuery.addListener(darkModeChanged);
369						}
370					}
371				</script>
371
372			
373
374			
375				<div class="navbar navbar-head navbar-fixed-top navbar-expand-md fixed-top"  role="navigation" id="headerbar">
376					<div class="container-fluid" style="padding-left:0px;">
377						<a href="https://lists.projectacrn.org" hx-boost="false" hx-disinherit="*">
378							<img src="https://lists.projectacrn.org/orgimg/org.19/mainlogo.png?v=1680450446766446918" height="50" alt="Groups.io">
379						</a>
380							
381							<ul class="nav navbar-nav float-end d-md-none" style="margin-top:5px;margin-bottom:5px;">
382								<li>
383									<a href="#" data-bs-toggle="modal" data-bs-target="#mobileAccount" class="nav-link">
384										<i class="fa-fw fa fa-bars fa-lg"></i>
385									</a>
386								</li>
387							</ul>
388
389							<ul class="nav navbar-nav float-end d-none d-md-flex">
390								<li class="dropdown">
391									<a href="#" class="dropdown-toggle nav-link" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
392										<i class="fa-fw fa-regular fa-globe"></i>
393										
394											English
395										
396										<b class="caret"></b>
397									</a>
398									<ul class="dropdown-menu dropdown-menu-end">
399										<li>
400											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/ar">
401												العربية
402											</a>
403										</li>
404										<li>
405											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/de">
406												Deutsch
407											</a>
408										</li>
409										<li>
410											<a class="dropdown-item" href="https://lists.projectacrn.org/unsetlang">
411												English
412											</a>
413										</li>
414										<li>
415											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/es">
416												Español
417											</a>
418										</li>
419										<li>
420											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/fr">
421												Français
422											</a>
423										</li>
424										<li>
425											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/it">
426												Italiano
427											</a>
428										</li>
429										<li>
430											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/nl">
431												Nederlands
432											</a>
433										</li>
434										<li>
435											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt-br">
436												Português do Brasil
437											</a>
438										</li>
439										<li>
440											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt">
441												Português
442											</a>
443										</li>
444										<li>
445											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/uk">
446												Українська
447											</a>
448										</li>
449										<li>
450											<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/zh-hans">
451												简体中文
452											</a>
453										</li>
454									</ul>
455								</li>
456								<li>
457									<a href="https://lists.projectacrn.org/helpcenter" target="_blank" class="nav-link">
458										Help
459									</a>
460								</li>
461								<li>
462									<a id="login" href="https://lists.projectacrn.org/login" hx-boost="false" hx-disinherit="*" class="nav-link">
463										<i class="fa fa-sign-in-alt"></i>
464										Log In
465									</a>
466								</li>
467								
468							</ul>
469					</div>
470				</div>
471				<div class="modal fade" id="mobileAccount" role="dialog">
472					<div class="modal-dialog" style="margin-top:50px;">
473						<div class="modal-content">
474							<div class="modal-body">
475
476									<ul class="list-group noborderlist">
477
478										<li class="noborderitem list-group-item">
479											<a href="https://lists.projectacrn.org/login" hx-boost="false" hx-disinherit="*">
480												<i class="fa fa-sign-in-alt"></i>
481												Log In
482											</a>
483										</li>
484										
485										<li class="noborderitem list-group-item">
486											<a href="https://lists.projectacrn.org/helpcenter" target="_blank">
487												<i class="fa-fw fa fa-question-circle"></i>
488												Help
489											</a>
490										</li>
491
492										<li class="dropdown noborderitem list-group-item">
493											<a href="#" class="dropdown-toggle nav-link" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
494												<i class="fa-fw fa-regular fa-globe"></i>
495												
496													English
497												
498												<b class="caret"></b>
499											</a>
500											<ul class="dropdown-menu">
501												<li>
502													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/ar">
503														العربية
504													</a>
505												</li>
506												<li>
507													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/de">
508														Deutsch
509													</a>
510												</li>
511												<li>
512													<a class="dropdown-item" href="https://lists.projectacrn.org/unsetlang">
513														English
514													</a>
515												</li>
516												<li>
517													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/es">
518														Español
519													</a>
520												</li>
521												<li>
522													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/fr">
523														Français
524													</a>
525												</li>
526												<li>
527													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/it">
528														Italiano
529													</a>
530												</li>
531												<li>
532													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/nl">
533														Nederlands
534													</a>
535												</li>
536												<li>
537													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt-br">
538														Português do Brasil
539													</a>
540												</li>
541												<li>
542													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt">
543														Português
544													</a>
545												</li>
546												<li>
547													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/uk">
548														Українська
549													</a>
550												</li>
551												<li>
552													<a class="dropdown-item" href="https://lists.projectacrn.org/setlang/zh-hans">
553														简体中文
554													</a>
555												</li>
556											</ul>
557										</li>
558
559									</ul>
560							</div>
561						</div>
562					</div>
563				</div>
564			
565<script>
566var groupnavigatorData = [
567
568];
569</script>
569
570
571
572<!-- Modal Dialog for Autocomplete -->
573<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
574  <div class="modal-dialog" role="document">
575    <div class="modal-content">
576      <div class="modal-body">
577        <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px">
578        <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
579		<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
580      </div>
581    </div>
582  </div>
583</div>
584
585
586<script>
587// Keep track of the currently selected index
588var selectedIndex = -1;
589
590// Function to highlight the matched substring
591function highlightSubstring(str, substring) {
592  var index = str.toLowerCase().indexOf(substring.toLowerCase());
593  if (index !== -1) {
594    var before = str.substring(0, index);
595    var middle = str.substring(index, index + substring.length);
596    var after = str.substring(index + substring.length);
597    return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after;
598  }
599  return str;
600}
601
602// Function to highlight the selected item and ensure it is visible in the scrollable list
603function highlightSelectedItem(modalName) {
604  var listContainer = document.getElementById(modalName + 'Container');
605  var items = document.getElementsByClassName(modalName + '-list-item');
606  Array.from(items).forEach(function(item, idx) {
607    item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item
608  });
609  if (items.length > 0 && selectedIndex >= 0) {
610    var selectedItem = items[selectedIndex];
611    var containerTop = listContainer.scrollTop;
612    var containerBottom = containerTop + listContainer.clientHeight;
613    var itemTop = selectedItem.offsetTop;
614    var itemBottom = itemTop + selectedItem.offsetHeight;
615	const fudge = 59;
616    if (selectedIndex > 0 && itemTop > containerBottom) {
617      // If there are items below the selected item and the selected item is not fully visible, scroll down
618      listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight;
619    } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) {
620      // If there are items above the selected item and the selected item is not fully visible, scroll up
621      listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight;
622    }
623  }
624}
625
626// function to populate the list based on the input
627function populateList(modalName, data) {
628  var input = document.getElementById(modalName+'Input').value;
629  var listContainer = document.getElementById(modalName+'Container');
630  listContainer.innerHTML = '';
631  data.forEach(function(item) {
632    if (item.name.toLowerCase().includes(input.toLowerCase())) {
633      var div = document.createElement('div');
634      div.innerHTML = highlightSubstring(item.name, input);
635      div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class
636      div.addEventListener('click', function() {
637        // Navigate to the specified URL when a list item is clicked
638        window.location.href = item.url;
639      });
640      div.addEventListener('mousemove', function() {
641        // Remove no-hover class from all items when the mouse is moved over any item
642		console.log("mouse move");
643        var items = document.getElementsByClassName(modalName+'-list-item');
644        Array.from(items).forEach(function(item) {
645          item.classList.remove('no-hover');
646        });
647      });
648      listContainer.appendChild(div);
649    }
650  });
651  highlightSelectedItem(modalName);
652}
653
654function InitAutocomplete(modalName, data) {
655	// Focus the input field when the modal is shown and populate the list
656	$('#' + modalName + 'Modal').on('shown.bs.modal', function () {
657		$('#' + modalName + 'Input').focus().val('');
658		populateList(modalName, data);
659		selectedIndex = 0;
660		highlightSelectedItem(modalName);
661	});
662
663	// Event listener for input field typing
664	document.getElementById(modalName + 'Input').addEventListener('input', function() {
665		populateList(modalName, data);
666		selectedIndex = 0;
667	});
668
669	// Event listener for arrow keys and enter key
670	document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) {
671		var items = document.getElementsByClassName(modalName + '-list-item');
672		if (event.key === 'ArrowDown') {
673			event.preventDefault();
674			if (selectedIndex < items.length - 1) selectedIndex++;
675			highlightSelectedItem(modalName);
676		} else if (event.key === 'ArrowUp') {
677			event.preventDefault();
678			if (selectedIndex > 0) selectedIndex--;
679			highlightSelectedItem(modalName);
680		} else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) {
681			event.preventDefault();
682			items[selectedIndex].click();
683		}
684	});
685}
686
687function showAutocompleteModal(modalName) {
688	$('#' + modalName + 'Modal').modal('show');
689	selectedIndex = -1;
690}
691</script>
691
692
693			<div id="content" class="container-fluid">
694<script>
695	InitAutocomplete("groupnavigator", groupnavigatorData);
696
697	document.body.addEventListener("showReloadPageDialog", function(evt) {
698		console.log("Forced reload");
699		location.reload();
700	});
701
702	// ShowHeaderAction adds an icon button (e.g. settings cog) to the mobile navbar,
703	// to the left of the profile icon. modalTarget is optional — if given, clicking
704	// opens that Bootstrap modal. ariaLabel is for accessibility.
705	function ShowHeaderAction(iconClass, modalTarget, ariaLabel) {
706		var slot = document.getElementById("header-action-slot");
707		if (!slot) {
708			return;
709		}
710		slot.innerHTML = '';
711		var a = document.createElement('a');
712		a.href = '#';
713		a.className = 'navbar-action-xs';
714		if (ariaLabel) {
715			a.setAttribute('aria-label', ariaLabel);
716		}
717		if (modalTarget) {
718			a.setAttribute('data-bs-toggle', 'modal');
719			a.setAttribute('data-bs-target', modalTarget);
720		}
721		var icon = document.createElement('i');
722		icon.className = iconClass;
723		a.appendChild(icon);
724		slot.appendChild(a);
725		slot.style.display = '';
726	}
727
728	function HideHeaderAction() {
729		var slot = document.getElementById("header-action-slot");
730		if (slot) {
731			slot.innerHTML = '';
732			slot.style.display = 'none';
733			slot.style.float = 'left';
734		}
735	}
736
737	function goBack() {
738		history.back();
739	}
740
741	// --- Native date/time picker helpers -----------------------------------
742	// On touch devices we swap flatpickr-wrapped <input type="text"> fields
743	// for native <input type="date"> / type="time" so iOS / Android bring up
744	// their OS pickers (wheel, spinner, Material dialog). On pointer
745	// devices we leave the flatpickr popover in place, since Chrome's
746	// default date popover looks out of place. Both helpers are global so
747	// every page with a date/time input can call them the same way.
748	window.__isTouchPicker = function() {
749		return window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches;
750	};
751	// Fallback formats if data.User is nil on this page (logged out, etc).
752	window.__userDateFmt = "M/D/YYYY";
753	window.__userTimeFmt = "h:mmA";
754	// Hybrid native picker: the field is shown to the user as a plain
755	// type=text input holding the date/time formatted per the user's
756	// Groups.io preference (e.g., "19/04/2026" for an International
757	// user). When the user taps the field, we briefly swap the input's
758	// type to 'date' or 'time' so the OS brings up its native picker
759	// (iOS wheel, Android calendar/spinner). When the user finishes
760	// picking and blurs the field, we swap back to text and reformat
761	// the value in the user's chosen format. The server sees the
762	// user-format value on submit, same as with flatpickr.
763	//
764	// `kind` is 'date' or 'time'. `onHumanChange(humanStr, momentObj)`
765	// fires whenever the user picks a new value, with the value already
766	// in the user's format.
767	window.useNativePicker = function(id, kind, onHumanChange) {
768		var input = document.getElementById(id);
769		if (!input) return null;
770		var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt;
771		var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD';
772		// Page loads with input type=text holding a user-format value —
773		// leave it as is until the user actually taps.
774		function toPicker() {
775			if (input.type !== kind) {
776				var m = moment(input.value, userFmt);
777				input.type = kind;
778				input.value = m.isValid() ? m.format(isoFmt) : '';
779			}
780		}
781		function toDisplay() {
782			if (input.type === kind) {
783				var m = moment(input.value, isoFmt);
784				input.type = 'text';
785				input.value = m.isValid() ? m.format(userFmt) : '';
786			}
787		}
788		// pointerdown fires before focus/click so we can swap the type
789		// in time for the browser's default tap-handling to open the
790		// correct native picker. Fall back to 'focus' for keyboard users.
791		input.addEventListener('pointerdown', toPicker);
792		input.addEventListener('focus', toPicker);
793		input.addEventListener('change', function() {
794			if (input.type === kind) {
795				var m = moment(input.value, isoFmt);
796				if (m.isValid() && onHumanChange) {
797					onHumanChange(m.format(userFmt), m);
798				}
799			}
800		});
801		input.addEventListener('blur', toDisplay);
802		// Make sure the server always sees the user-format value.
803		var form = input.closest('form');
804		if (form) form.addEventListener('submit', toDisplay);
805		return input;
806	};
807	// Set a field's value as a user-format string, whether the field is a
808	// flatpickr-wrapped text input (desktop) or a native type=date/time
809	// input (touch). Used by onChange handlers that update sibling fields.
810	window.setFieldHuman = function(id, humanStr, kind) {
811		var input = document.getElementById(id);
812		if (!input) return;
813		if (input._flatpickr) {
814			input._flatpickr.setDate(humanStr);
815		} else if (input.type === 'date' || input.type === 'time') {
816			var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt;
817			var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD';
818			var m = moment(humanStr, userFmt);
819			if (m.isValid()) input.value = m.format(isoFmt);
820		} else {
821			input.value = humanStr;
822		}
823	};
824
825	// submitEvent acts like .submit(), except it is compatible with the app, by using events instead.
826	function submitEvent(ele) {
827		console.log("in submitEvent");
828		if (ele.startsWith('#')) {
829    		ele = ele.slice(1);
830		}
831		document.getElementById(ele).submit();
832		return;
833		/*
834		const theEvent = new CustomEvent('submit', {
835			bubbles: true,
836			cancelable: true
837		});
838		if (typeof ele === 'string' || ele instanceof String) {
839			if (ele.startsWith("#") == true) {
840				ele = ele.slice(1);
841			}
842			if (document.getElementById(ele).dispatchEvent(theEvent) == true) {
843				// if not cancelled, do normal submit
844				console.log("calling submit");
845				document.getElementById(ele).submit();
846			}
847			return;
848		}
849		// assume ele is the element
850		if (ele.dispatchEvent(theEvent) == true) {
851			// if not cancelled, do normal submit
852			console.log("calling submit");
853			ele.submit();
854		}
855		*/
856	}
857
858	// gioDestroy is a convenience function for destroy callbacks
859	function gioDestroy(eventCB) {
860		let internalGioDestroy = function(evt) {
861			// do not activate on infinite scroll events
862			if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") {
863				console.log("Ignoring infinite scroll event");
864				return;
865			}
866			console.log("Calling destroy callback");
867			eventCB(evt);
868		}
869		document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true});
870		document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true});
871	}
872			
873	var drawerCloseFunc = function(evt) {
874		console.log("in drawerCloseFunc");
875		// Find all elements with the class 'drawer'
876		var drawers = document.querySelectorAll('.drawer');
877
878		// Iterate over each element and call closeDrawer() on each
879		drawers.forEach(function(obj) {
880			drawerObj.closeDrawer(obj);
881		});
882		$('.modal').modal('hide');
883	}
884	document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc);
885	document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc);
886
887	var keydownFunc = function(event) {
888		var tagName = event.target.tagName.toLowerCase();
889		if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
890			if (event.key === 'Escape') {
891				event.target.blur();
892			}
893			return;
894		}
895		// check if the viewimages viewer is up
896		let element = document.getElementById('overlay');
897		if (element && element.classList.contains('visible')) {
898			return;
899		}
900		console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey);
901		if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) {
902			event.preventDefault(); // Prevent the default action
903			// Show the modal dialog for keyboard shortcuts
904			$('#shortcutModal').modal('show');
905			return;
906		}
907		// Pressing the chord above delivers a keydown for each key in it:
908		// Control, then Shift, then '?'. Without this guard the first two fall
909		// through to the hide below, so re-pressing the chord while the modal is
910		// open starts a hide that the '?' a moment later interrupts with a show.
911		// Bootstrap 3 tracks only its most recent backdrop element, so each such
912		// overlap strands the previous one in the DOM as an undismissable mask.
913		if (event.key === 'Control' || event.key === 'Shift' || event.key === 'Alt' || event.key === 'Meta') {
914			return;
915		}
916		$('#shortcutModal').modal('hide');
917
918		if (event.key.toLowerCase() === 'g') {
919			// For Windows and Linux
920			if (event.ctrlKey) {
921				event.preventDefault();
922				showAutocompleteModal("groupnavigator");
923				return;
924			}
925		}
926
927		// Check if the pressed key is '/'
928		if ((event.key === 'f' || event.key === 'F') && event.shiftKey) {
929			if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
930				if (event.metaKey) {
931					event.preventDefault(); // Prevent the default action
932					// Focus on the search box
933					let box = document.getElementById('searchbox')
934					if (box != null) {
935						document.getElementById('searchbox').focus();
936					}
937				}
938			} else {
939				// For Windows and Linux
940				if (event.ctrlKey) {
941					event.preventDefault(); // Prevent the default action
942					// Focus on the search box
943					let box = document.getElementById('searchbox')
944					if (box != null) {
945						document.getElementById('searchbox').focus();
946					}
947				}
948			}
949		}
950	}
951	document.addEventListener('keydown', keydownFunc);
952	var removeDrawerCloseFunc = function(evt) {
953		document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc);
954		document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc);
955		document.removeEventListener('keydown', keydownFunc);
956	}
957	document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true});
958
959	// Check for passkey enrollment prompt after cross-device authentication
960	$(function() {
961		if (sessionStorage.getItem('passkeyPromptAfterCDA') === 'true') {
962			console.log('Passkey CDA flag detected, showing enrollment modal');
963
964			// Show the modal
965			$('#passkeyEnrollmentModal').modal('show');
966
967			// Clear the flag when modal is dismissed
968			$('#passkeyEnrollmentModal').on('hidden.bs.modal', function() {
969				console.log('Modal dismissed, clearing flag');
970				sessionStorage.removeItem('passkeyPromptAfterCDA');
971			});
972
973			// Set up enrollment button handler
974			var enrollBtn = document.getElementById('enrollLocalPasskeyBtn');
975			if (enrollBtn) {
976				enrollBtn.addEventListener('click', function() {
977					console.log('Enrollment button clicked');
978					// Redirect to settings page where they can add a passkey
979					sessionStorage.removeItem('passkeyPromptAfterCDA');
980					window.location.href = 'https://lists.projectacrn.org/settings/security';
981				});
982			}
983		}
984	});
985</script>
985
986<!-- Passkey Enrollment Modal -->
987<div class="modal fade webauthn-only" id="passkeyEnrollmentModal" tabindex="-1" role="dialog">
988	<div class="modal-dialog" role="document">
989		<div class="modal-content">
990			<div class="modal-header">
991				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
992				<h4 class="modal-title">
993					<i class="fa fa-fingerprint"></i>
994					Add a Passkey to This Device
995				</h4>
996			</div>
997			<div class="modal-body">
998				<p>
999					You logged in using a passkey from another device. For faster access next time, add a passkey to this device.
1000				</p>
1001				<p>
1002					<strong>Benefits:</strong>
1003				</p>
1004				<ul>
1005					<li>Faster login with just your fingerprint or face</li>
1006					<li>No need to use your phone each time</li>
1007					<li>Works even when offline</li>
1008				</ul>
1009			</div>
1010			<div class="modal-footer">
1011				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
1012					Maybe Later
1013				</button>
1014				<button type="button" class="btn btn-primary" id="enrollLocalPasskeyBtn">
1015					<i class="fa fa-plus"></i>
1016					Add Passkey Now
1017				</button>
1018			</div>
1019		</div>
1020	</div>
1021</div>
1022<!-- Modal Dialog for Keyboard Shortcuts -->
1023<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
1024  <div class="modal-dialog" role="document">
1025    <div class="modal-content">
1026      <div class="modal-header">
1027        <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4>
1028      </div>
1029      <div class="modal-body">
1030		<div class="row">
1031			<div class="col-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>&nbsp;&nbsp;:</div>
1032			<div class="col-9" style="margin-left: -23px;">Show all keyboard shortcuts</div>
1033		</div>
1034		<div class="row">
1035			<div class="col-3 text-right"><strong>ctrl</strong> + <strong>g</strong>&nbsp;&nbsp;:</div>
1036			<div class="col-9" style="margin-left: -23px;">Navigate to a group</div>
1037		</div>
1038		<div class="row">
1039			<div class="col-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>&nbsp;&nbsp;:</div>
1040			<div class="col-9" style="margin-left: -23px;">Find</div>
1041		</div>
1042		<div class="row">
1043			<div class="col-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>&nbsp;&nbsp;:</div>
1044			<div class="col-9" style="margin-left: -23px;">Quick actions</div>
1045		</div>
1046		</div>
1047		<div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div>
1048    </div>
1049  </div>
1050</div>
1051				
1052	
1053	<div id="mainrow" class=""  hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
1054		<div id="groupsidebar" class="scrollbar hidden-print">
1055			<div class="scrollbar-content">
1056				<div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;">
1057					<div class="list-group noborderlist" style="border:0;margin-bottom:0px">
1058						
1059	<a title="Group Home" href="https://lists.projectacrn.org/g/acrn-users" class="list-group-item sidebar-item">
1060		<i class="fa-fw fa fa-home fa-lg"></i>
1061		Home
1062		
1063	</a>
1064
1065	
1066
1067	
1068
1069	
1070		
1071	
1072		
1073
1074	<a title="Messages" href="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> 
1075		<i class="fa-fw fa fa-comments fa-lg"></i>
1076		Messages
1077		<span id="sidebar-archives-badge" class="badge"></span>
1078	</a>
1079
1080	
1081	
1082	
1083	
1084	
1085	
1086	
1087		
1088
1089	<a title="Hashtags" href="https://lists.projectacrn.org/g/acrn-users/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> 
1090		<i class="fa-fw fa fa-hashtag fa-lg"></i>
1091		Hashtags
1092		<span id="sidebar-hashtags-badge" class="badge"></span>
1093	</a>
1094
1095	
1096
1097		
1098	
1099
1100	
1101
1102	
1103
1104	
1105			
1106			
1107
1108	<a title="All Subgroups" href="https://lists.projectacrn.org/g/acrn-users/subgroups" id="sidebar-subgroups" class="noborderitem list-group-item sidebar-item sidebar-item-subgroups"> 
1109		<i class="fa-fw fa fa-chart-pie fa-lg"></i>
1110		All Subgroups
1111		<span id="sidebar-subgroups-badge" class="badge"></span>
1112	</a>
1113
1114	
1115
1116	
1117
1118	
1119
1120	
1121
1122	
1123
1124	
1125
1126	
1127
1128					</div>
1129				</div>
1130				
1131	<div class="text-center" style="font-size:13px;margin-bottom:30px">
1132		<div style="padding-bottom:10px;">
1133			<strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts
1134		</div>
1135		<div style="padding-bottom:5px;">
1136			<a href="/static/about">
1137				About
1138			</a>
1139			
1140			
1141				&middot;
1142				<a href="/static/features">
1143					Features
1144				</a> &middot;
1145				<a href="/static/pricing">
1146					Pricing
1147				</a>
1148			
1149		</div>
1150		<div style="padding-bottom:5px;">
1151			<a href="/home">
1152				Home
1153			</a> &middot;
1154			<a rel="nofollow" href="/changelog">
1155				Changelog
1156			</a> &middot;
1157			<a href="/static/tos">
1158				Terms
1159			</a>
1160		</div>
1161		<div style="padding-bottom:5px;">
1162			<a href="/helpcenter" target="_blank">
1163				Help
1164			</a>
1165		</div>
1166		<div style="padding-bottom:5px;">
1167			&copy; 2026 Groups.io
1168		</div>
1169	</div>
1170
1171			</div>
1172		</div>
1173		<div id="maincontent" class="groupmaincontent">
1174			<div id="maincontent-refresh">
1175				<div id="maincontent-column" class="col-xs-12 maincontent-column">
1176					
1177<script>
1178function toggleGrouphomeDesc() {
1179	var desc = document.getElementById("grouphomeDesc");
1180	if (!desc) return;
1181	// Toggle between the clipped and expanded states. Keep "clipped"
1182	// on the element so the gradient fade returns when collapsed.
1183	if (desc.classList.contains("expanded")) {
1184		desc.classList.remove("expanded");
1185		desc.classList.add("clipped");
1186	} else {
1187		desc.classList.remove("clipped");
1188		desc.classList.add("expanded");
1189	}
1190}
1191contentLoaded(false, function() {
1192	// Has to run on every navigation in (including HTMX boost) so the
1193	// sidebar's active state and the navbar's header-action slot get
1194	// reset — otherwise icons set by the previous page (e.g. /messages
1195	// search) linger here and dispatch to the previous page's modals.
1196	UpdateSidebar("home");
1197	// Flag this page so group-home-specific mobile CSS (slightly wider
1198	// body margin) can scope to it without affecting other pages.
1199	document.body.classList.add("grouphome-page");
1200	gioDestroy(function() {
1201		document.body.classList.remove("grouphome-page");
1202	});
1203	function set_body_height()
1204	{
1205		var wh = $(window).height();
1206		$('body').attr('style', 'height:' + wh + 'px;');
1207	}
1208    set_body_height();
1209    $(window).bind('resize', function() { set_body_height(); });
1210	// Clip the description and expose the Show more/less toggle only
1211	// on phone widths and only when its natural height would exceed
1212	// the clamp. Desktop has plenty of vertical space, so the full
1213	// description shows untruncated there.
1214	if (document.documentElement.clientWidth <= 767) {
1215		var desc = document.getElementById("grouphomeDesc");
1216		var toggle = document.getElementById("grouphomeDescToggle");
1217		if (desc && toggle) {
1218			var maxH = 160;
1219			if (desc.scrollHeight > maxH + 1) {
1220				desc.classList.add("clipped");
1221				toggle.hidden = false;
1222			}
1223		}
1224	}
1225});
1226</script>
1226
1227	
1228	
1229	
1230
1231	
1232
1233	
1234	<div id="alertdiv"></div>
1235	<div class="noticetemplate template">
1236		<div class="alert alert-success alert-dismissible" role="alert">
1237				<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
1238			<span class="flashmsg"></span>
1239		</div>
1240	</div>
1241	<div class="alerttemplate template">
1242		<div class="alert alert-danger alert-dismissible" role="alert">
1243				<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
1244			<span class="flashmsg"></span>
1245		</div>
1246	</div>
1247	<div class="alertnoclosetemplate template">
1248		<div class="alert alert-danger" role="alert">
1249			<span class="flashmsg"></span>
1250		</div>
1251	</div>
1252
1253
1254
1255 
1256<script>
1257function dismiss() {
1258    console.log("dismiss");
1259    $.get( "/dismissalert");
1260}
1261
1262var $alerttemplate = $(".alerttemplate");
1263var $alertnoclosetemplate = $(".alertnoclosetemplate");
1264var $noticetemplate = $(".noticetemplate");
1265function createAlert(msg, isError, autoClose, noClose) {
1266	if (isError == false) {
1267		$newPanel = $noticetemplate.clone();
1268	} else {
1269        if (noClose) {
1270		  $newPanel = $alertnoclosetemplate.clone();
1271        } else {
1272		  $newPanel = $alerttemplate.clone();
1273        }
1274	}
1275	$newPanel.removeClass("template");
1276	$newPanel.find(".flashmsg").html(msg);
1277	if (autoClose == true) {
1278		$("#alertdiv").append($newPanel.fadeTo(2000, 500).slideUp(500, function(){
1279		    $newPanel.slideUp(500);
1280		    $newPanel.remove();
1281		}));  	
1282	} else {
1283		$("#alertdiv").append($newPanel.fadeIn());
1284	}
1285    return $newPanel;
1286}
1287
1288
1289
1290
1291</script>
1291
1292
1293
1294
1295	
1296	
1297	<div class="grouphome-hero d-md-none">
1298		<img src="https://lists.projectacrn.org/g/acrn-users/coverphoto" class="grouphome-hero-img">
1299	</div>
1300	<div class="row d-none d-md-flex">
1301		<div class="col-lg-12">
1302			<img src="https://lists.projectacrn.org/g/acrn-users/coverphoto" class="grouphome-center grouphome-fit">
1303		</div>
1304	</div>
1305	
1306		<h3 class="d-none d-md-block">
1307			[email protected]
1308		</h3>
1309	
1310	
1311		<div class="grouphome-desc-wrap">
1312			<div class="user-content grouphome-desc" id="grouphomeDesc">
1313				<span style="font-family: 'Calibri',sans-serif; font-size: 10.5pt; mso-fareast-language: ZH-CN; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-bidi-language: AR-SA;"><span style="color: #000000;">Mailing&nbsp;list to&nbsp;discuss ACRN hypervisor environment setup, configuration, tool usage, debug information, bug reporting and feedback, etc.</span></span>
1314			</div>
1315			<button type="button" class="grouphome-desc-toggle" id="grouphomeDescToggle" onclick="toggleGrouphomeDesc()" hidden>
1316				<span class="grouphome-desc-more">Show more</span>
1317				<span class="grouphome-desc-less">Show less</span>
1318			</button>
1319		</div>
1320	
1321	
1322
1323
1324<div class="row grouphome-tiles d-lg-none">
1325	
1326		<div class="col-3 grouphome-tile-col">
1327			<a href="https://lists.projectacrn.org/g/acrn-users/topics" class="grouphome-tile">
1328				<i class="fa fa-comments"></i>
1329				<span class="grouphome-tile-label">Messages</span>
1330				
1331			</a>
1332		</div>
1333	
1334
1335	
1336
1337	
1338
1339	
1340
1341	
1342
1343	
1344
1345	
1346
1347	
1348</div>
1349
1350	
1351
1352	
1353	<div class="grouphome-card grouphome-recent">
1354		<div class="grouphome-recent-head">
1355			<h4 class="grouphome-recent-title">
1356				<i class="fa fa-comments"></i>
1357				Recent Topics
1358			</h4>
1359			<a class="grouphome-recent-link" href="https://lists.projectacrn.org/g/acrn-users/topics">
1360				View all
1361			</a>
1362		</div>
1363		<ul class="grouphome-recent-list">
1364			
1365				<li class="grouphome-recent-item">
1366					<a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/118798426">
1367						
1368							acrn crashed when i enable &quot;Cache Allocation Technology&quot;
1369						
1370						
1371							<span class="badge">3<span class="visually-hidden"> messages</span></span>
1372						
1373					</a>
1374					<div class="grouphome-recent-meta">
1375						
1376<script id="timedisprecenttopic118798426">
1377	$('#timedisprecenttopic118798426').replaceWith(DisplayShortTime(1779523820306956767, false
1378		));
1379</script>
1379
1380
1381					</div>
1382				</li>
1383			
1384				<li class="grouphome-recent-item">
1385					<a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/115935951">
1386						
1387							No display console after: Loading ACRN Service VM initial ramdisk ...
1388						
1389						
1390					</a>
1391					<div class="grouphome-recent-meta">
1392						
1393<script id="timedisprecenttopic115935951">
1394	$('#timedisprecenttopic115935951').replaceWith(DisplayShortTime(1761340349696291174, false
1395		));
1396</script>
1396
1397
1398					</div>
1399				</li>
1400			
1401				<li class="grouphome-recent-item">
1402					<a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/109932901">
1403						
1404							(3) [acrn-users] Support for ARM Architecture
1405						
1406						
1407							<span class="badge">2<span class="visually-hidden"> messages</span></span>
1408						
1409					</a>
1410					<div class="grouphome-recent-meta">
1411						
1412<script id="timedisprecenttopic109932901">
1413	$('#timedisprecenttopic109932901').replaceWith(DisplayShortTime(1755842684204935673, false
1414		));
1415</script>
1415
1416
1417					</div>
1418				</li>
1419			
1420				<li class="grouphome-recent-item">
1421					<a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/113712786">
1422						
1423							ACRN support for Core Ultra Arrow Lake platform
1424						
1425						
1426							<span class="badge">2<span class="visually-hidden"> messages</span></span>
1427						
1428					</a>
1429					<div class="grouphome-recent-meta">
1430						
1431<script id="timedisprecenttopic113712786">
1432	$('#timedisprecenttopic113712786').replaceWith(DisplayShortTime(1750303396284992775, false
1433		));
1434</script>
1434
1435
1436					</div>
1437				</li>
1438			
1439				<li class="grouphome-recent-item">
1440					<a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/110604724">
1441						
1442							[WaaG]Passthrough UART usage failed on the Windows VM.
1443						
1444						
1445					</a>
1446					<div class="grouphome-recent-meta">
1447						
1448<script id="timedisprecenttopic110604724">
1449	$('#timedisprecenttopic110604724').replaceWith(DisplayShortTime(1736847005098343551, false
1450		));
1451</script>
1451
1452
1453					</div>
1454				</li>
1455			
1456		</ul>
1457	</div>
1458
1459
1460	
1461	<div class="grouphome-stats d-lg-none">
1462		<span class="grouphome-stat">
1463			<i class="fa fa-users"></i>
1464			115 members
1465		</span>
1466		
1467			<span class="grouphome-stat-sep"> · </span>
1468			<span class="grouphome-stat">
1469				<i class="fa fa-comments"></i>
1470				420 topics
1471			</span>
1472			<span class="grouphome-stat-sep"> · </span>
1473			<span class="grouphome-stat">
1474				Last post
1475				
1476<script id="timedisplastmobile13723">
1477	$('#timedisplastmobile13723').replaceWith(DisplayShortTime(1779523820306956767, false
1478		));
1479</script>
1479
1480
1481			</span>
1482		
1483	</div>
1484	
1485	<div class="row d-none d-md-flex">
1486		<div class="col-lg-6">
1487			<div class="grouphome-card">
1488				<h4>
1489					Group Information
1490				</h4>
1491				<ul class="list-unstyled">
1492					
1493					<li>
1494						<i class="fa-fw fa fa-users"></i>
1495						115 Members
1496					</li>
1497					
1498						<li>
1499							<i class="fa-fw fa fa-comments"></i>
1500							420 Topics
1501							, Last Post: 
1502<script id="timedisplast13723">
1503	$('#timedisplast13723').replaceWith(DisplayShortTime(1779523820306956767, false
1504		));
1505</script>
1505
1506
1507						</li>
1508					
1509					<li>
1510						<i class="fa-fw fa fa-clock"></i>
1511						Started on 
1512<script id="timedispcreated13723">
1513	$('#timedispcreated13723').replaceWith(DisplayShortTime(1519957300211657304, false
1514		));
1515</script>
1515
1516
1517					</li>
1518					
1519						
1520							<li>
1521								<i class="fa-fw fa fa-rss-square"></i>
1522								<a hx-disable href="https://lists.projectacrn.org/g/acrn-users/rss">
1523									RSS Feed
1524								</a>
1525							</li>
1526						
1527					
1528				</ul>
1529				
1530			</div>
1531			<div class="grouphome-card" id="groupemailaddresses">
1532				<h4>
1533					Group Email Addresses
1534				</h4>
1535				<dl class="grouphome-email-list">
1536					<dt>Post</dt>
1537					<dd>
1538						<a href="mailto:[email protected]">
1539							[email protected]
1540						</a>
1541					</dd>
1542					
1543						<dt>Subscribe</dt>
1544						<dd>
1545							
1546								<a href="mailto:[email protected]">
1547									[email protected]
1548								</a>
1549							
1550						</dd>
1551					
1552					<dt>Unsubscribe</dt>
1553					<dd>
1554						<a href="mailto:[email protected]">
1555							[email protected]
1556						</a>
1557					</dd>
1558					<dt>Group Owner</dt>
1559					<dd>
1560						<a href="mailto:[email protected]">
1561							[email protected]
1562						</a>
1563					</dd>
1564					<dt>Help</dt>
1565					<dd>
1566						<a href="mailto:[email protected]">
1567							[email protected]
1568						</a>
1569					</dd>
1570				</dl>
1571			</div>
1572		</div>
1573		<div class="col-lg-6">
1574			<div class="grouphome-card">
1575				<h4>
1576					Group Settings
1577				</h4>
1578			<ul class="list-unstyled">
1579				
1580
1581				
1582				
1583					<li>
1584						<i class="fa-fw fa fa-chart-pie"></i>
1585						This is a subgroup of
1586						<a href="https://lists.projectacrn.org/g/main" hx-boost="false" hx-disinherit="*">
1587							main
1588						</a>
1589						.
1590					</li>
1591				
1592				
1593					<li>
1594						<i class="fa-fw fa fa-bullhorn"></i>
1595						All members can post to the group.
1596					</li>
1597				
1598				
1599					<li>
1600						<i class="fa-fw fa fa-check"></i>
1601						Posts to this group do not require approval from the moderators.
1602					</li>
1603				
1604				
1605				
1606						<li>
1607							<i class="fa-fw fa fa-reply"></i>
1608							Messages are set to reply to group.
1609						</li>
1610					
1611
1612				
1613					<li>
1614						<i class="fa-fw fa fa-lock"></i>
1615						Subscriptions to this group do not require approval from the moderators.
1616					</li>
1617				
1618				
1619				
1620					
1621							<li>
1622								<i class="fa-fw fa fa-folder-open"></i>
1623								Archive is visible to anyone.
1624							</li>
1625					
1626				
1627				
1628					
1629						<li>
1630							<i class="fa-fw fa fa-book"></i>
1631							Wiki is visible to members only.
1632						</li>
1633					
1634				
1635				
1636				
1637				
1638					<li>
1639						<i class="fa-fw fa fa-check"></i>
1640						Members can edit their messages.
1641					</li>
1642				
1643				
1644					<li>
1645						<i class="fa-fw fa fa-ban"></i>
1646						Members can set their subscriptions to no email.
1647					</li>
1648				
1649				
1650				</ul>
1651			</div>
1652		</div>
1653	</div>
1654	<div class="row d-none d-md-flex">
1655		<div class="col-lg-6">
1656			
1657
1658			
1659				<div class="grouphome-card">
1660					<div class="grouphome-recent-head">
1661						<h4 class="grouphome-recent-title">Top Hashtags</h4>
1662						<a class="grouphome-recent-link" href="https://lists.projectacrn.org/g/acrn-users/hashtags">View all</a>
1663					</div>
1664					
1665						No used hashtags.
1666					
1667				</div>
1668			
1669		</div>
1670	</div>
1671	
1672	
1673	
1674		
1675			
1676				<p>
1677					<form role="form" method="POST" action="/ssostartauth" hx-boost="false" hx-disinherit="*">
1678						
1679						<input type="hidden" name="group_id" value="13723">
1680						<input type="hidden" name="type" value="register">
1681						
1682						
1683							
1684								
1685									<button class="btn btn-primary btn-sm">
1686										<i class="fa fa-plus"></i>
1687										Join This Group
1688									</button>
1689								
1690								
1691									&nbsp;or
1692								
1693							
1694						
1695						
1696							<a class="btn btn-success btn-sm" href="/login?group_id=13723&r=https%3A%2F%2Flists.projectacrn.org%2Fg%2Facrn-users" hx-boost="false" hx-disinherit="*">
1697								<i class="fa fa-sign-in-alt"></i>
1698								Log In If You Are Already A Member
1699							</a>
1700						
1701					</form>
1702				</p>
1703			
1704		
1705	
1706	
1707		
1708		<div class="row d-none d-md-flex">
1709			<div class="col-lg-12">
1710				<div class="grouphome-card">
1711					<h4>
1712						Archived Messages
1713					</h4>
1714					<div id="monthview"></div>
1715				</div>
1716			</div>
1717		</div>
1718	
1719	
1720
1721<script>
1722contentLoaded(false, function() {
1723	var d = new Date()
1724	var offset=d.getTimezoneOffset()
1725	$.ajax({
1726	type: "GET",
1727	url: "https://lists.projectacrn.org/g/acrn-users/months",
1728	data: {"offset":offset},
1729	cache: false,
1730	xhrFields: {
1731		withCredentials: true
1732	},
1733	success: function(data){
1734		$("#monthview").html(data);
1735	}
1736	});
1737});
1738</script>
1738
1739
1740
1741				</div>
1742			</div>
1743		</div>
1744	</div>
1745	<div class="row hidden-print" id="mobileSidebar"  hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
1746		<div id="mobileSidebarSub" class="col-12 d-lg-none">
1747			<div class="navbar fixed-bottom">
1748				<div class="container" style="display: flex; justify-content: space-around;">
1749					
1750					
1751	
1752	
1753		
1754		<a id="mobilesidebar-groups" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center; color: inherit; text-decoration: none;" href="https://lists.projectacrn.org/groups" hx-boost="false">
1755			<div style="display: inline-block; position: relative;">
1756				<div style="position: relative;display: inline-block;">
1757				<i class="fa-fw fa-light fa-users fa-2x"></i>
1758				
1759				</div><br>
1760				<span style="font-size:12px;">Groups</span>
1761			</div>
1762		</a>
1763	
1764
1765					
1766						
1767	
1768		
1769	
1770	<div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true"  hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
1771		<div style="display: inline-block; position: relative;">
1772			<div style="position: relative;display: inline-block;">
1773			<i class="fa-fw fa-light fa-comments fa-2x"></i>
1774			
1775			</div><br>
1776			<span style="font-size:12px;">Messages</span>
1777		</div>
1778	</div>
1779
1780	
1781	
1782
1783						
1784	
1785
1786					
1787					<div style="flex: 1; text-align: center;margin-top:10px" data-drawer-trigger aria-controls="drawer-name" aria-expanded="false">
1788						<i class="fa-fw fa-light fa-bars fa-2x"></i><br>
1789						<span style="font-size:12px;">More</span>
1790					</div>
1791				</div>
1792			</div>
1793			<section class="drawer drawer-left" id="drawer-name" data-drawer-target>
1794				<div class="drawer-overlay" data-drawer-close tabindex="-1"></div>
1795				<div class="drawer-wrapper drawer-wrapper-top">
1796					<div class="drawer-header">
1797						<div class="drawer-title">
1798							<i class="fa-fw fa-regular fa-bars fa-3x"></i>
1799							<span class="visually-hidden">
1800								More Options
1801							</span>
1802							More
1803						</div>
1804						<button class="drawer-close" data-drawer-close aria-label="Close Drawer"></button>
1805					</div>
1806					<div class="drawer-content">
1807						<div class="list-group noborderlist">
1808							
1809	<a title="Group Home" href="https://lists.projectacrn.org/g/acrn-users" class="list-group-item sidebar-item">
1810		<i class="fa-fw fa fa-home fa-lg"></i>
1811		Home
1812		
1813	</a>
1814
1815	
1816
1817	
1818
1819	
1820		
1821	
1822		
1823
1824	<a title="Messages" href="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> 
1825		<i class="fa-fw fa fa-comments fa-lg"></i>
1826		Messages
1827		<span id="sidebar-archives-mobile-badge" class="badge"></span>
1828	</a>
1829
1830	
1831	
1832	
1833	
1834	
1835	
1836	
1837		
1838
1839	<a title="Hashtags" href="https://lists.projectacrn.org/g/acrn-users/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> 
1840		<i class="fa-fw fa fa-hashtag fa-lg"></i>
1841		Hashtags
1842		<span id="sidebar-hashtags-mobile-badge" class="badge"></span>
1843	</a>
1844
1845	
1846
1847		
1848	
1849
1850	
1851
1852	
1853
1854	
1855			
1856			
1857
1858	<a title="All Subgroups" href="https://lists.projectacrn.org/g/acrn-users/subgroups" id="sidebar-subgroups-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-subgroups"> 
1859		<i class="fa-fw fa fa-chart-pie fa-lg"></i>
1860		All Subgroups
1861		<span id="sidebar-subgroups-mobile-badge" class="badge"></span>
1862	</a>
1863
1864	
1865
1866	
1867
1868	
1869
1870	
1871
1872	
1873
1874	
1875
1876	
1877
1878							
1879								<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos" target="_blank">
1880									<i class="fa-fw fal fa-newspaper fa-lg"></i>
1881									Terms
1882								</a>
1883								
1884							
1885						</div>
1886					</div>
1887				</div>
1888			</section>
1889		</div>
1890	</div>
1891
1892<!-- Modal Dialog for Autocomplete -->
1893<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
1894  <div class="modal-dialog" role="document">
1895    <div class="modal-content">
1896      <div class="modal-body">
1897        <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px">
1898        <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
1899		<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
1900      </div>
1901    </div>
1902  </div>
1903</div>
1904
1905
1906<script>
1907	var quickActionsData = [
1908		
1909		
1910			{name: "Group Home", url: "https://lists.projectacrn.org/g/acrn-users"},
1911		
1912
1913		
1914			{name: "Topics", url: "https://lists.projectacrn.org/g/acrn-users/topics"},
1915			{name: "Messages", url: "https://lists.projectacrn.org/g/acrn-users/messages"},
1916			{name: "Expanded Messages", url: "https://lists.projectacrn.org/g/acrn-users/messages?expanded=1"},
1917		
1918		
1919		
1920			{name: "Polls", url: "https://lists.projectacrn.org/g/acrn-users/polls"},
1921		
1922		
1923			{name: "Hashtags", url: "https://lists.projectacrn.org/g/acrn-users/hashtags"},
1924		
1925		
1926		
1927		
1928		
1929
1930		
1931
1932		
1933			{name: "Subgroups", url: "https://lists.projectacrn.org/g/acrn-users/subgroups"},
1934		
1935		
1936		
1937
1938		
1939
1940		
1941		
1942		
1943		/* other pages */
1944		{name: "Help", url: "/helpcenter"},
1945		{name: "Feed", url: "/feed"},
1946		{name: "Your Groups", url: "/groups"},
1947		{name: "Your Calendar", url: "/calendar"},
1948		{name: "Your Activity", url: "/activity"},
1949		{name: "Your Pending Messages", url: "/pendingmsgs"},
1950		{name: "Account Login", url: "/account"},
1951		{name: "Account Preferences", url: "/account?page=prefs"},
1952		{name: "Account Security", url: "/account?page=security"},
1953		{name: "Account Identity", url: "/account?page=profile&member_info_id=0"},
1954		{name: "Account Notifications", url: "/account?page=notifications"},
1955		{name: "Account Other Services", url: "/account?page=oauth"},
1956		{name: "Account Bounces", url: "/account?page=bounces"},
1957		{name: "Account Billing", url: "/account?page=billing"},
1958		{name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"},
1959	];
1960
1961
1962	InitAutocomplete("quickActions", quickActionsData);
1963
1964	document.addEventListener('keydown', function(event) {
1965		var tagName = event.target.tagName.toLowerCase();
1966		if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
1967			return;
1968		}
1969		// check if the viewimages viewer is up
1970		let element = document.getElementById('overlay');
1971		if (element && element.classList.contains('visible')) {
1972			return;
1973		}
1974		if (event.key.toLowerCase() === '/') {
1975			if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
1976				// For Mac
1977				// Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not
1978				if (event.metaKey) {
1979					event.preventDefault();
1980					showAutocompleteModal("quickActions");
1981					return;
1982				}
1983			} else {
1984				// For Windows and Linux
1985				if (event.ctrlKey) {
1986					event.preventDefault();
1987					showAutocompleteModal("quickActions");
1988					return;
1989				}
1990			}
1991		}
1992	});
1993	function UpdateSidebar(id) {
1994		console.log(id + " was clicked");
1995		if (typeof HideHeaderAction === 'function') {
1996			HideHeaderAction();
1997		}
1998		// restore mobile bottom nav in case a previous page (e.g. /post) hid it
1999		var mobSidebar = document.getElementById("mobileSidebar");
2000		if (mobSidebar) mobSidebar.style.display = '';
2001		var mainContent = document.getElementById("maincontent");
2002		if (mainContent) mainContent.style.bottom = '';
2003		var sidebarItems = document.querySelectorAll('.mobilesidebar-item');
2004		sidebarItems.forEach(function(item) {
2005			var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0];
2006			if (item.id == "mobilesidebar-" + id) {
2007				console.log("making solid " + id)
2008				iElement.classList.add('fa-solid');
2009				iElement.classList.remove('fa-light');
2010			} else {
2011				iElement.classList.remove('fa-solid');
2012				iElement.classList.add('fa-light');
2013			}
2014		});
2015		var sidebarItems = document.querySelectorAll('.sidebar-item');
2016		// remove 'active' class from all 'sidebar-item' elements
2017		sidebarItems.forEach(function(item) {
2018			if (item.id == "sidebar-" + id) {
2019				console.log("making active " + id)
2020				item.classList.add('active');
2021			} else {
2022				item.classList.remove('active');
2023			}
2024		});
2025	}
2026</script>
2026
2027
2028
2029			</div>
2030			
2031				<div id="scroll-top-outer">
2032					<div id="scroll-top" class="scroll-top-wrapper hidden-xs">
2033						<span class="scroll-top-inner">
2034							<i class="fa fa-arrow-circle-up fa-fw fa-2x"></i>
2035						</span>
2036					</div>
2037				</div>
2038<script>
2039	$(function() {
2040		$(document).on('scroll', function() {
2041			if ($(window).scrollTop() > 100) {
2042				$('.scroll-top-wrapper').addClass('show');
2043			} else {
2044				$('.scroll-top-wrapper').removeClass('show');
2045			}
2046		});
2047		$('.scroll-top-wrapper').on('click', scrollToTop);
2048	});
2049
2050	function scrollToTop() {
2051		verticalOffset = typeof(verticalOffset) != 'undefined' ? verticalOffset : 0;
2052		element = $('body');
2053		offset = element.offset();
2054		offsetTop = offset.top;
2055		$('html, body').animate({
2056			scrollTop: offsetTop
2057		}, 100, 'linear');
2058	}
2059
2060	if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
2061		let elements = document.querySelectorAll('strong.ctrlmeta');
2062		elements.forEach((element) => {
2063			// Check if the innerText is "ctrl"
2064			if (element.innerText === 'ctrl') {
2065				// Create a new "i" element
2066				let newElement = document.createElement('i');
2067				newElement.classList.add('fa-solid', 'fa-command');
2068				
2069				// Replace the old "strong" element with the new "i" element
2070				element.parentNode.replaceChild(newElement, element);
2071			}
2072		});
2073	}
2074</script>
2074
2075			
2076			
2077
2078
2079		</body>
2080	</html>
2081

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.