<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-abuseLogRC-core.js</id>
	<title>MediaWiki:Gadget-abuseLogRC-core.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-abuseLogRC-core.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;action=history"/>
	<updated>2026-04-11T05:09:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=42176&amp;oldid=prev</id>
		<title>Alex at 11:06, 20 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=42176&amp;oldid=prev"/>
		<updated>2024-10-20T11:06:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;amp;diff=42176&amp;amp;oldid=39009&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=39009&amp;oldid=prev</id>
		<title>Alex at 16:14, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=39009&amp;oldid=prev"/>
		<updated>2024-10-17T16:14:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;amp;diff=39009&amp;amp;oldid=38877&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=38877&amp;oldid=prev</id>
		<title>Alex at 16:12, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=38877&amp;oldid=prev"/>
		<updated>2024-10-17T16:12:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;amp;diff=38877&amp;amp;oldid=34575&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=34575&amp;oldid=prev</id>
		<title>Alex at 23:09, 16 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=34575&amp;oldid=prev"/>
		<updated>2024-10-16T23:09:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:09, 17 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 54:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 54:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildGadget([entries, users, pages]) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildGadget([entries, users, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages]) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		lastUpdate = new Date();&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		lastUpdate = new Date();&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		// refreshed&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		// refreshed&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (gadgetLoaded) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (gadgetLoaded) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$(&#039;.gadget-abuselog-list&#039;).replaceWith(buildList(entries, users, pages));&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$(&#039;.gadget-abuselog-list&#039;).replaceWith(buildList(entries, users, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages));&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		// initial load&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		// initial load&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 65:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 65:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			let $container = $(&#039;&amp;lt;div class=&quot;gadget-abuselog&quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			let $container = $(&#039;&amp;lt;div class=&quot;gadget-abuselog&quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$container.append(buildHeader(), buildList(entries, users, pages));&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$container.append(buildHeader(), buildList(entries, users, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages));&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$(&#039;.mw-changeslist&#039;).before($container);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			$(&#039;.mw-changeslist&#039;).before($container);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			gadgetLoaded = true;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			gadgetLoaded = true;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 224:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 224:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildList(entries, users, pages) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildList(entries, users, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let $list = $(&#039;&amp;lt;div class=&quot;gadget-abuselog-list&quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let $list = $(&#039;&amp;lt;div class=&quot;gadget-abuselog-list&quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let pageArr = Object.values(pages);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let pageArr = Object.values(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let entry of entries) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let entry of entries) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 241:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 241:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			let opts = {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			let opts = {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				isRegistered: Object.hasOwn(user, &#039;userid&#039;),&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				isRegistered: Object.hasOwn(user, &#039;userid&#039;),&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				isRedirect: page === undefined, // API response separates redirects from pages object&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				isRedirect: page === undefined, // API response separates redirects from &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages object&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				pageExists: page === undefined || Object.hasOwn(page, &#039;pageid&#039;),&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				pageExists: page === undefined || Object.hasOwn(page, &#039;pageid&#039;),&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				userPageExists: Object.hasOwn(userPage, &#039;pageid&#039;),&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				userPageExists: Object.hasOwn(userPage, &#039;pageid&#039;),&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 359:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 359:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildLink(pagename, opts) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function buildLink(pagename, opts) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let url = mw.util.getUrl(pagename);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let url = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;mw.util.getUrl(pagename);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (opts.param) url = mw.util.getUrl(pagename, {[opts.param]: opts.value});&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (opts.param) url = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;mw.util.getUrl(pagename, {[opts.param]: opts.value});&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (!opts.exists) url = mw.util.getUrl(pagename, {action: &#039;edit&#039;});&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (!opts.exists) url = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;mw.util.getUrl(pagename, {action: &#039;edit&#039;});&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (opts.isRedirect) url = mw.util.getUrl(pagename, {redirect: &#039;no&#039;});&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if (opts.isRedirect) url = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;mw.util.getUrl(pagename, {redirect: &#039;no&#039;});&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let title = (opts.exists) ? pagename : pagename + &#039; (page does not exist)&#039;;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let title = (opts.exists) ? pagename : pagename + &#039; (page does not exist)&#039;;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 384:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 384:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function getPageTitles(abuselog) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	function getPageTitles(abuselog) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let pages = new Set();&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages = new Set();&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let usernames = getUsernames(abuselog);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		let usernames = getUsernames(abuselog);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let entry of abuselog) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let entry of abuselog) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			pages.add(entry.title);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages.add(entry.title);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let username of usernames) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		for (let username of usernames) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			pages.add(&#039;User:&#039; + username);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages.add(&#039;User:&#039; + username);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			pages.add(&#039;User talk:&#039; + username);&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages.add(&#039;User talk:&#039; + username);&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		return [...pages];&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		return [..&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.mw&lt;/ins&gt;.pages];&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 436:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 436:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// this api call gets:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// this api call gets:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - page info for target pages in abuselog&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - page info for target &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages in abuselog&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - user info for users listed in abuselog&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - user info for users listed in abuselog&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - page info for those users&#039; userpages and talk pages&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			// - page info for those users&#039; userpages and talk &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/ins&gt;pages&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			return api.get({&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			return api.get({&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				list: &#039;users&#039;,&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				list: &#039;users&#039;,&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 449:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 449:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				function (results) {&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				function (results) {&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					let usersResult = results.query.users;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					let usersResult = results.query.users;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					let pagesResult = results.query.pages;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					let pagesResult = results.query&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.mw&lt;/ins&gt;.pages;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					return [abuselogResult, usersResult, pagesResult];&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					return [abuselogResult, usersResult, pagesResult];&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=906&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;/*  ====================== 	      AbuseLogRC 	======================  	Shows certain Special:AbuseLog entries at the top of Special:RecentChanges 	for better vandalism detection. Use of this gadget requires the user right 	to view private filters (&quot;abusefilter-log-private&quot;).  	Keep this in sync with rsw:MediaWiki:Gadget-abuseLogRC-core.js.  	Inspired by Suppa chuppa&#039;s original script at User:Suppa chuppa/abuselog.js  	@author Iiii_I_I_I */  ;(function ($, mw) {...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-abuseLogRC-core.js&amp;diff=906&amp;oldid=prev"/>
		<updated>2024-10-13T00:56:33Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;====================== 	      AbuseLogRC 	======================  	Shows certain Special:AbuseLog entries at the top of Special:RecentChanges 	for better vandalism detection. Use of this gadget requires the user right 	to view private filters (&amp;quot;abusefilter-log-private&amp;quot;).  	Keep this in sync with &lt;a href=&quot;/index.php?title=Rsw:MediaWiki:Gadget-abuseLogRC-core.js&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Rsw:MediaWiki:Gadget-abuseLogRC-core.js (page does not exist)&quot;&gt;rsw:MediaWiki:Gadget-abuseLogRC-core.js&lt;/a&gt;.  	Inspired by Suppa chuppa&amp;#039;s original script at &lt;a href=&quot;/index.php?title=User:Suppa_chuppa/abuselog.js&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Suppa chuppa/abuselog.js (page does not exist)&quot;&gt;User:Suppa chuppa/abuselog.js&lt;/a&gt;  	@author Iiii_I_I_I: &lt;/span&gt;  ;(function ($, mw) {...&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*  ======================&lt;br /&gt;
	      AbuseLogRC&lt;br /&gt;
	======================&lt;br /&gt;
&lt;br /&gt;
	Shows certain Special:AbuseLog entries at the top of Special:RecentChanges&lt;br /&gt;
	for better vandalism detection. Use of this gadget requires the user right&lt;br /&gt;
	to view private filters (&amp;quot;abusefilter-log-private&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
	Keep this in sync with [[rsw:MediaWiki:Gadget-abuseLogRC-core.js]].&lt;br /&gt;
&lt;br /&gt;
	Inspired by Suppa chuppa&amp;#039;s original script at [[User:Suppa chuppa/abuselog.js]]&lt;br /&gt;
&lt;br /&gt;
	@author Iiii_I_I_I&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
;(function ($, mw) {&lt;br /&gt;
	let gadgetLoaded = false;&lt;br /&gt;
	let entryDays = new Set();&lt;br /&gt;
	let lastUpdate;&lt;br /&gt;
	let intervalID;&lt;br /&gt;
	let filters = &amp;#039;2|3|5|6|7|12|14|19|21|global-4&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// default config&lt;br /&gt;
	if (getConfig(&amp;#039;autoRefresh&amp;#039;) === null) setConfig(&amp;#039;autoRefresh&amp;#039;, false);&lt;br /&gt;
	if (getConfig(&amp;#039;interval&amp;#039;) === null) setConfig(&amp;#039;interval&amp;#039;, 30);&lt;br /&gt;
	if (getConfig(&amp;#039;entries&amp;#039;) === null) setConfig(&amp;#039;entries&amp;#039;, 5);&lt;br /&gt;
&lt;br /&gt;
	function getConfig(key) {&lt;br /&gt;
		return JSON.parse(localStorage.getItem(&amp;#039;gadget-abuseLogRC-&amp;#039; + key));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setConfig(key, value) {&lt;br /&gt;
		localStorage.setItem(&amp;#039;gadget-abuseLogRC-&amp;#039; + key, value);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function refreshData() {&lt;br /&gt;
		$(&amp;#039;.gadget-abuselog-list&amp;#039;).addClass(&amp;#039;loading&amp;#039;); // class is cleared when new list replaces old&lt;br /&gt;
		entryDays.clear();&lt;br /&gt;
		getData();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toggleAutoRefresh(isToggledOn, refreshButton) {&lt;br /&gt;
		if (isToggledOn) {&lt;br /&gt;
			intervalID = setInterval(refreshData, getConfig(&amp;#039;interval&amp;#039;) * 1000);&lt;br /&gt;
		} else {&lt;br /&gt;
			clearInterval(intervalID);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// hide manual refresh button when autoRefresh is on, show when it&amp;#039;s off&lt;br /&gt;
		refreshButton.toggle(!isToggledOn);&lt;br /&gt;
&lt;br /&gt;
		// update cookie&lt;br /&gt;
		setConfig(&amp;#039;autoRefresh&amp;#039;, isToggledOn);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildGadget([entries, users, pages]) {&lt;br /&gt;
		lastUpdate = new Date();&lt;br /&gt;
&lt;br /&gt;
		// refreshed&lt;br /&gt;
		if (gadgetLoaded) {&lt;br /&gt;
			$(&amp;#039;.gadget-abuselog-list&amp;#039;).replaceWith(buildList(entries, users, pages));&lt;br /&gt;
		}&lt;br /&gt;
		// initial load&lt;br /&gt;
		else {&lt;br /&gt;
			let $container = $(&amp;#039;&amp;lt;div class=&amp;quot;gadget-abuselog&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			$container.append(buildHeader(), buildList(entries, users, pages));&lt;br /&gt;
			$(&amp;#039;.mw-changeslist&amp;#039;).before($container);&lt;br /&gt;
			gadgetLoaded = true;&lt;br /&gt;
&lt;br /&gt;
			// change user tool link text if readableRC is on&lt;br /&gt;
			mw.hook(&amp;#039;ext.gadget.readableRC&amp;#039;).add(function () {&lt;br /&gt;
				$(&amp;#039;.gadget-abuselog&amp;#039;).addClass(&amp;#039;match-gadget-rc&amp;#039;);&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		mw.hook(&amp;#039;ext.gadget.abuseLogRC&amp;#039;).fire();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildHeader() {&lt;br /&gt;
		let $header = $(&amp;#039;&amp;lt;div class=&amp;quot;gadget-abuselog-header&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
		let $left = $(&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-header-left&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
		let $right = buildSettings();&lt;br /&gt;
		let $title = $(&amp;#039;&amp;lt;h4&amp;gt;Abuse log&amp;lt;/h4&amp;gt;&amp;#039;);&lt;br /&gt;
		let link = &amp;#039; (&amp;#039; + buildLink(&amp;#039;Special:AbuseLog&amp;#039;, {exists: true, text: &amp;#039;all&amp;#039;}) + &amp;#039;)&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		$left.append($title, link);&lt;br /&gt;
		$header.append($left, $right);&lt;br /&gt;
&lt;br /&gt;
		return $header;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildSettings() {&lt;br /&gt;
		let $settings = $(&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-header-right&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
		let refreshButton = new OO.ui.ButtonWidget({&lt;br /&gt;
			framed: false,&lt;br /&gt;
			icon: &amp;#039;reload&amp;#039;,&lt;br /&gt;
			flags: [&amp;#039;progressive&amp;#039;],&lt;br /&gt;
			label: &amp;#039;Refresh log&amp;#039;,&lt;br /&gt;
			invisibleLabel: true,&lt;br /&gt;
			title: &amp;#039;Refresh abuse log entries&amp;#039;,&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-manual-refresh&amp;#039;]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// hide when autoRefresh is on, show when it&amp;#039;s off&lt;br /&gt;
		refreshButton.toggle(!getConfig(&amp;#039;autoRefresh&amp;#039;));&lt;br /&gt;
		refreshButton.on(&amp;#039;click&amp;#039;, function (e) {&lt;br /&gt;
			refreshButton.setDisabled(true); // disabled state cleared by hook below&lt;br /&gt;
			refreshData();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// use RecentChanges&amp;#039; &amp;quot;View new changes&amp;quot; button as another way to refresh&lt;br /&gt;
		$(&amp;#039;.mw-rcfilters-ui-filterWrapperWidget-showNewChanges a&amp;#039;).on(&amp;#039;click&amp;#039;, function (e) {&lt;br /&gt;
			refreshData();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// POPUP TOP HALF: number of log entries to show&lt;br /&gt;
		let entriesSelectWidget = new OO.ui.ButtonSelectWidget({&lt;br /&gt;
			items: [&lt;br /&gt;
				new OO.ui.ButtonOptionWidget({ data: &amp;#039;3&amp;#039;, label: &amp;#039;3&amp;#039; }),&lt;br /&gt;
				new OO.ui.ButtonOptionWidget({ data: &amp;#039;5&amp;#039;, label: &amp;#039;5&amp;#039; }),&lt;br /&gt;
				new OO.ui.ButtonOptionWidget({ data: &amp;#039;10&amp;#039;, label: &amp;#039;10&amp;#039; }),&lt;br /&gt;
				new OO.ui.ButtonOptionWidget({ data: &amp;#039;20&amp;#039;, label: &amp;#039;20&amp;#039; }),&lt;br /&gt;
				new OO.ui.ButtonOptionWidget({ data: &amp;#039;50&amp;#039;, label: &amp;#039;50&amp;#039; })&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
		let entriesFieldset = new OO.ui.FieldsetLayout({&lt;br /&gt;
			label: &amp;#039;Entries to show&amp;#039;,&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-settings-entries&amp;#039;],&lt;br /&gt;
			items: [entriesSelectWidget]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		entriesSelectWidget.selectItemByData(getConfig(&amp;#039;entries&amp;#039;).toString())&lt;br /&gt;
		entriesSelectWidget.on(&amp;#039;choose&amp;#039;, function (button, selected) {&lt;br /&gt;
			setConfig(&amp;#039;entries&amp;#039;, button.data);&lt;br /&gt;
			refreshData();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// if user changes # entries to a custom value in localStorage, insert new button at the start&lt;br /&gt;
		if (entriesSelectWidget.findSelectedItem() === null) {&lt;br /&gt;
			let value = getConfig(&amp;#039;entries&amp;#039;).toString();&lt;br /&gt;
			let customButton = new OO.ui.ButtonOptionWidget({ data: value, label: value });&lt;br /&gt;
&lt;br /&gt;
			entriesSelectWidget.addItems(customButton, 0);&lt;br /&gt;
			entriesSelectWidget.selectItem(customButton);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// POPUP BOTTOM HALF: refresh settings&lt;br /&gt;
		let lastUpdatedLabel = new OO.ui.LabelWidget({&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-settings-last-updated&amp;#039;]&lt;br /&gt;
		});&lt;br /&gt;
		let autoRefreshCheckbox = new OO.ui.CheckboxInputWidget({&lt;br /&gt;
			selected: getConfig(&amp;#039;autoRefresh&amp;#039;)&lt;br /&gt;
		});&lt;br /&gt;
		let refreshFieldset = new OO.ui.FieldsetLayout({&lt;br /&gt;
			label: &amp;#039;Refresh&amp;#039;,&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-settings-refresh&amp;#039;],&lt;br /&gt;
			items: [&lt;br /&gt;
				lastUpdatedLabel,&lt;br /&gt;
				new OO.ui.FieldLayout(autoRefreshCheckbox, {&lt;br /&gt;
					classes: [&amp;#039;gadget-abuselog-settings-auto-refresh&amp;#039;],&lt;br /&gt;
					label: &amp;#039;Auto-refresh log entries every &amp;#039; + getConfig(&amp;#039;interval&amp;#039;) + &amp;#039; seconds&amp;#039;&lt;br /&gt;
				})&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// initial load&lt;br /&gt;
		toggleAutoRefresh(getConfig(&amp;#039;autoRefresh&amp;#039;), refreshButton);&lt;br /&gt;
&lt;br /&gt;
		// when clicked&lt;br /&gt;
		autoRefreshCheckbox.on(&amp;#039;change&amp;#039;, function (isSelected, indeterminate) {&lt;br /&gt;
			toggleAutoRefresh(isSelected, refreshButton);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// POPUP MENU&lt;br /&gt;
		let menuButton = new OO.ui.PopupButtonWidget({&lt;br /&gt;
			icon: &amp;#039;menu&amp;#039;,&lt;br /&gt;
			framed: false,&lt;br /&gt;
			label: &amp;#039;Abuse log settings&amp;#039;,&lt;br /&gt;
			invisibleLabel: true,&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-settings&amp;#039;],&lt;br /&gt;
			popup: {&lt;br /&gt;
				head: false, anchor: false, padded: true, autoFlip: false, align: &amp;#039;backwards&amp;#039;,&lt;br /&gt;
				$content: $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;).append(&lt;br /&gt;
					entriesFieldset.$element,&lt;br /&gt;
					refreshFieldset.$element&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// to do when settings popup is opened&lt;br /&gt;
		menuButton.on(&amp;#039;click&amp;#039;, function () {&lt;br /&gt;
			let time = new Intl.DateTimeFormat(&amp;#039;en-GB&amp;#039;, {hour: &amp;#039;numeric&amp;#039;, minute: &amp;#039;numeric&amp;#039;, timeZone: &amp;#039;UTC&amp;#039;}).format(lastUpdate);&lt;br /&gt;
			let day = new Intl.DateTimeFormat(&amp;#039;en-GB&amp;#039;, {day: &amp;#039;numeric&amp;#039;, month: &amp;#039;long&amp;#039;, year: &amp;#039;numeric&amp;#039;, timeZone: &amp;#039;UTC&amp;#039;}).format(lastUpdate);&lt;br /&gt;
&lt;br /&gt;
			let diff = new Date() - lastUpdate;&lt;br /&gt;
			let h = Math.floor(diff / 1000 / 60 / 60);&lt;br /&gt;
			let m = Math.floor(diff / 1000 / 60) % 60;&lt;br /&gt;
			let s = Math.floor(diff / 1000) % 60;&lt;br /&gt;
&lt;br /&gt;
			// if over one minute since last update, hide seconds unit;&lt;br /&gt;
			// if under one hour since last update, hide hour unit&lt;br /&gt;
			let hh = (h &amp;gt; 0) ? h + &amp;#039;h &amp;#039; : &amp;#039;&amp;#039;;&lt;br /&gt;
			let mm = m + &amp;#039;m&amp;#039;;&lt;br /&gt;
			let ss = s + &amp;#039;s&amp;#039;;&lt;br /&gt;
			let ago = (h &amp;gt; 0 || m &amp;gt; 0) ? hh + mm : ss;&lt;br /&gt;
&lt;br /&gt;
			lastUpdatedLabel.setLabel(&lt;br /&gt;
				new OO.ui.HtmlSnippet(`Last update: &amp;lt;strong class=&amp;quot;last-update&amp;quot; title=&amp;quot;${time}, ${day}&amp;quot;&amp;gt;${ago} ago&amp;lt;/strong&amp;gt;.`)&lt;br /&gt;
			);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// to do on each gadget refresh&lt;br /&gt;
		mw.hook(&amp;#039;ext.gadget.abuseLogRC&amp;#039;).add(function () {&lt;br /&gt;
			refreshButton.setDisabled(false);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		$settings.append(&lt;br /&gt;
			refreshButton.$element,&lt;br /&gt;
			menuButton.$element&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		return $settings;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildList(entries, users, pages) {&lt;br /&gt;
		let $list = $(&amp;#039;&amp;lt;div class=&amp;quot;gadget-abuselog-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
		let pageArr = Object.values(pages);&lt;br /&gt;
&lt;br /&gt;
		for (let entry of entries) {&lt;br /&gt;
			let user = users.find(user =&amp;gt; user.name === entry.user);&lt;br /&gt;
			let page = pageArr.find(page =&amp;gt; page.title === entry.title);&lt;br /&gt;
			let userPage = pageArr.find(page =&amp;gt; page.title === `User:${user.name}`);&lt;br /&gt;
			let talkPage = pageArr.find(page =&amp;gt; page.title === `User talk:${user.name}`);&lt;br /&gt;
&lt;br /&gt;
			// prevent error; User:FeedbackBot redirects to RuneScape:Article feedback&lt;br /&gt;
			if (user.name === &amp;#039;FeedbackBot&amp;#039;) {&lt;br /&gt;
				userPage = pageArr.find(page =&amp;gt; page.title === &amp;#039;RuneScape:Article feedback&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			let opts = {&lt;br /&gt;
				isRegistered: Object.hasOwn(user, &amp;#039;userid&amp;#039;),&lt;br /&gt;
				isRedirect: page === undefined, // API response separates redirects from pages object&lt;br /&gt;
				pageExists: page === undefined || Object.hasOwn(page, &amp;#039;pageid&amp;#039;),&lt;br /&gt;
				userPageExists: Object.hasOwn(userPage, &amp;#039;pageid&amp;#039;),&lt;br /&gt;
				talkPageExists: Object.hasOwn(talkPage, &amp;#039;pageid&amp;#039;)&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			$list.append(buildRow(entry, opts));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return $list;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildRow(entry, opts) {&lt;br /&gt;
		// FIRST COLUMN: date and time&lt;br /&gt;
		let entryDate = new Date(entry.timestamp);&lt;br /&gt;
		let entryDay = new Intl.DateTimeFormat(&amp;#039;en-GB&amp;#039;, {day: &amp;#039;2-digit&amp;#039;, month: &amp;#039;short&amp;#039;, timeZone: &amp;#039;UTC&amp;#039;}).format(entryDate);&lt;br /&gt;
		let entryTime = new Intl.DateTimeFormat(&amp;#039;en-GB&amp;#039;, {hour: &amp;#039;numeric&amp;#039;, minute: &amp;#039;numeric&amp;#039;, timeZone: &amp;#039;UTC&amp;#039;}).format(entryDate);&lt;br /&gt;
		let showHideDay = (entryDays.has(entryDay)) ? &amp;#039;hide&amp;#039; : &amp;#039;&amp;#039;;&lt;br /&gt;
		let firstColumn =&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-col gadget-abuselog-col-1&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
				`&amp;lt;span class=&amp;quot;${showHideDay}&amp;quot;&amp;gt;${entryDay}&amp;lt;/span&amp;gt; &amp;lt;span&amp;gt;${entryTime}&amp;lt;/span&amp;gt;` +&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		entryDays.add(entryDay);&lt;br /&gt;
&lt;br /&gt;
		// SECOND COLUMN: page edited&lt;br /&gt;
		let secondColumn =&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-col gadget-abuselog-col-2&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
				buildLink(entry.title, {exists: opts.pageExists, text: entry.title, isRedirect: opts.isRedirect}) +&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// THIRD COLUMN: diff, details, and action taken&lt;br /&gt;
		let diffLink = (entry.revid) ? buildLink(`Special:Diff/${entry.revid}`, {exists: true, text: &amp;#039;diff&amp;#039;}) : &amp;#039;diff&amp;#039;;&lt;br /&gt;
		let logLink = buildLink(`Special:AbuseLog/${entry.id}`, {exists: true, text: &amp;#039;log&amp;#039;});&lt;br /&gt;
		let results = [];&lt;br /&gt;
&lt;br /&gt;
		// some filters perform multiple actions on a single edit, eg. &amp;lt;https://oldschool.runescape.wiki/w/Special:AbuseLog/22296&amp;gt;&lt;br /&gt;
		entry.result.split(&amp;#039;,&amp;#039;).forEach(result =&amp;gt; {&lt;br /&gt;
			results.push(&lt;br /&gt;
				`&amp;lt;span class=&amp;quot;gadget-abuselog-result gadget-abuselog-result-${result}&amp;quot;&amp;gt;` +&lt;br /&gt;
				`${mw.msg(&amp;#039;abusefilter-action-&amp;#039; + result)}&amp;lt;/span&amp;gt;`&lt;br /&gt;
			);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		let thirdColumn =&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-col gadget-abuselog-col-3&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
				`(${diffLink} | ${logLink}) &amp;lt;span class=&amp;quot;gadget-abuselog-action&amp;quot;&amp;gt;(${results.join(&amp;#039;, &amp;#039;)})&amp;lt;/span&amp;gt;` +&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// FOURTH COLUMN: user details and filter triggered&lt;br /&gt;
		let filterURL = `Special:AbuseFilter/${entry.filter_id}`;&lt;br /&gt;
&lt;br /&gt;
		if (entry.filter_id.includes(&amp;#039;global&amp;#039;)) {&lt;br /&gt;
			filterURL = `meta:Special:AbuseFilter/${entry.filter_id.replace(&amp;#039;global-&amp;#039;, &amp;#039;&amp;#039;)}`;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		let filterLink = buildLink(filterURL, {exists: true, text: `Filter ${entry.filter_id}`});&lt;br /&gt;
&lt;br /&gt;
		let fourthColumn =&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;gadget-abuselog-col gadget-abuselog-col-4&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
				buildUserLinks(entry.user, opts) +&lt;br /&gt;
				`&amp;lt;span class=&amp;quot;gadget-abuselog-filter gadget-abuselog-filter-${entry.filter_id}&amp;quot;&amp;gt;` +&lt;br /&gt;
					`(${filterLink}: ${entry.filter})` +&lt;br /&gt;
				&amp;#039;&amp;lt;/span&amp;gt; &amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;gadget-abuselog-row&amp;quot;&amp;gt;&amp;#039; + firstColumn + secondColumn + thirdColumn + fourthColumn + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildUserLinks(username, opts) {&lt;br /&gt;
		let userLink;&lt;br /&gt;
		let toolLinks;&lt;br /&gt;
&lt;br /&gt;
		// link text is added with CSS so it can be replaced when readableRC is loaded&lt;br /&gt;
		let talkLink = `&amp;lt;span&amp;gt;${buildLink(`User talk:${username}`, {&lt;br /&gt;
			exists: opts.talkPageExists,&lt;br /&gt;
			text: &amp;#039;&amp;#039;,&lt;br /&gt;
			classes: &amp;#039;mw-usertoollinks-talk&amp;#039;&lt;br /&gt;
		})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
		let contribsLink = `&amp;lt;span&amp;gt;${buildLink(`Special:Contributions/${username}`, {&lt;br /&gt;
			exists: true,&lt;br /&gt;
			text: &amp;#039;&amp;#039;,&lt;br /&gt;
			classes: &amp;#039;mw-usertoollinks-contribs&amp;#039;&lt;br /&gt;
		})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
		let logLink = `&amp;lt;span&amp;gt;${buildLink(`Special:AbuseLog`, {&lt;br /&gt;
			exists: true,&lt;br /&gt;
			text: &amp;#039;&amp;#039;,&lt;br /&gt;
			classes: &amp;#039;mw-usertoollinks-abuselog&amp;#039;,&lt;br /&gt;
			param: &amp;#039;wpSearchUser&amp;#039;,&lt;br /&gt;
			value: username&lt;br /&gt;
		})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
		let blockLink = `&amp;lt;span&amp;gt;${buildLink(`Special:Block/${username}`, {&lt;br /&gt;
			exists: true,&lt;br /&gt;
			text: &amp;#039;&amp;#039;,&lt;br /&gt;
			classes: &amp;#039;mw-usertoollinks-block&amp;#039;&lt;br /&gt;
		})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
&lt;br /&gt;
		// user links vs. anon links&lt;br /&gt;
		if (opts.isRegistered) {&lt;br /&gt;
			userLink = `&amp;lt;span&amp;gt;${buildLink(`User:${username}`, {&lt;br /&gt;
				exists: opts.userPageExists,&lt;br /&gt;
				text: username,&lt;br /&gt;
				classes: &amp;#039;mw-userlink&amp;#039;&lt;br /&gt;
			})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
			toolLinks = &amp;#039;&amp;lt;span class=&amp;quot;mw-usertoollinks&amp;quot;&amp;gt;(&amp;#039; + talkLink + contribsLink + logLink + blockLink + &amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			userLink = `&amp;lt;span&amp;gt;${buildLink(`Special:Contributions/${username}`, {&lt;br /&gt;
				exists: true,&lt;br /&gt;
				text: username,&lt;br /&gt;
				classes: &amp;#039;mw-userlink mw-anonuserlink&amp;#039;&lt;br /&gt;
			})}&amp;lt;/span&amp;gt;`;&lt;br /&gt;
			toolLinks = &amp;#039;&amp;lt;span class=&amp;quot;mw-usertoollinks&amp;quot;&amp;gt;(&amp;#039; + talkLink + logLink + blockLink + &amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return userLink + &amp;#039; &amp;#039; + toolLinks + &amp;#039; &amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildLink(pagename, opts) {&lt;br /&gt;
		let url = mw.util.getUrl(pagename);&lt;br /&gt;
&lt;br /&gt;
		if (opts.param) url = mw.util.getUrl(pagename, {[opts.param]: opts.value});&lt;br /&gt;
		if (!opts.exists) url = mw.util.getUrl(pagename, {action: &amp;#039;edit&amp;#039;});&lt;br /&gt;
		if (opts.isRedirect) url = mw.util.getUrl(pagename, {redirect: &amp;#039;no&amp;#039;});&lt;br /&gt;
&lt;br /&gt;
		let title = (opts.exists) ? pagename : pagename + &amp;#039; (page does not exist)&amp;#039;;&lt;br /&gt;
		let redlink = (opts.exists) ? &amp;#039;&amp;#039; : &amp;#039;new&amp;#039;;&lt;br /&gt;
		let classes = opts.classes || &amp;#039;&amp;#039;;&lt;br /&gt;
		let link = `&amp;lt;a href=&amp;quot;${url}&amp;quot; title=&amp;quot;${title}&amp;quot; class=&amp;quot;${redlink} ${classes}&amp;quot;&amp;gt;${opts.text}&amp;lt;/a&amp;gt;`;&lt;br /&gt;
&lt;br /&gt;
		return link;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getUsernames(abuselog) {&lt;br /&gt;
		let usernames = new Set();&lt;br /&gt;
&lt;br /&gt;
		for (let entry of abuselog) {&lt;br /&gt;
			usernames.add(entry.user);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return [...usernames];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPageTitles(abuselog) {&lt;br /&gt;
		let pages = new Set();&lt;br /&gt;
		let usernames = getUsernames(abuselog);&lt;br /&gt;
&lt;br /&gt;
		for (let entry of abuselog) {&lt;br /&gt;
			pages.add(entry.title);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (let username of usernames) {&lt;br /&gt;
			pages.add(&amp;#039;User:&amp;#039; + username);&lt;br /&gt;
			pages.add(&amp;#039;User talk:&amp;#039; + username);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return [...pages];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setMessages(messages) {&lt;br /&gt;
		for (let message of messages) {&lt;br /&gt;
			mw.messages.set(message[&amp;#039;name&amp;#039;], message[&amp;#039;*&amp;#039;]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildError(result) {&lt;br /&gt;
		let warning = new OO.ui.MessageWidget({&lt;br /&gt;
			type: &amp;#039;notice&amp;#039;,&lt;br /&gt;
			classes: [&amp;#039;gadget-abuselog-error&amp;#039;],&lt;br /&gt;
			label: new OO.ui.HtmlSnippet(&amp;#039;&amp;lt;strong&amp;gt;AbuseLogRC encountered an API error:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&amp;#039; + result.error.info)&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		$(&amp;#039;.mw-changeslist&amp;#039;).before(warning.$element);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getData() {&lt;br /&gt;
		let api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
		// this api call gets:&lt;br /&gt;
		// - abuselog entries for commonly triggered vandalism filters&lt;br /&gt;
		// - mw messages for abusefilter results (tag, warn, disallow, etc.)&lt;br /&gt;
		api.get({&lt;br /&gt;
			list: &amp;#039;abuselog&amp;#039;,&lt;br /&gt;
			afllimit: getConfig(&amp;#039;entries&amp;#039;),&lt;br /&gt;
			aflprop: &amp;#039;ids|user|title|action|result|timestamp|revid|filter&amp;#039;,&lt;br /&gt;
			aflfilter: filters,&lt;br /&gt;
			meta: &amp;#039;allmessages&amp;#039;,&lt;br /&gt;
			amprefix: &amp;#039;abusefilter-action-&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		.then(function (results) {&lt;br /&gt;
			let abuselogResult = results.query.abuselog;&lt;br /&gt;
			let messagesResult = results.query.allmessages;&lt;br /&gt;
&lt;br /&gt;
			if (!gadgetLoaded) setMessages(messagesResult);&lt;br /&gt;
&lt;br /&gt;
			// this api call gets:&lt;br /&gt;
			// - page info for target pages in abuselog&lt;br /&gt;
			// - user info for users listed in abuselog&lt;br /&gt;
			// - page info for those users&amp;#039; userpages and talk pages&lt;br /&gt;
			return api.get({&lt;br /&gt;
				list: &amp;#039;users&amp;#039;,&lt;br /&gt;
				ususers: getUsernames(abuselogResult),&lt;br /&gt;
				titles: getPageTitles(abuselogResult),&lt;br /&gt;
				redirects: true&lt;br /&gt;
			})&lt;br /&gt;
			.then(&lt;br /&gt;
				// success&lt;br /&gt;
				function (results) {&lt;br /&gt;
					let usersResult = results.query.users;&lt;br /&gt;
					let pagesResult = results.query.pages;&lt;br /&gt;
&lt;br /&gt;
					return [abuselogResult, usersResult, pagesResult];&lt;br /&gt;
				},&lt;br /&gt;
				// fail&lt;br /&gt;
				function (code, result) {&lt;br /&gt;
					buildError(result);&lt;br /&gt;
				}&lt;br /&gt;
			);&lt;br /&gt;
		})&lt;br /&gt;
		.then(&lt;br /&gt;
			// success&lt;br /&gt;
			function (results) {&lt;br /&gt;
				buildGadget(results);&lt;br /&gt;
			},&lt;br /&gt;
			// fail&lt;br /&gt;
			function (code, result) {&lt;br /&gt;
				buildError(result);&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	getData();&lt;br /&gt;
}(jQuery, mediaWiki));&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>