<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Stats on MNR Revival</title>
    <link>https://mnrrevival.derole.net/stats/</link>
    <description>Recent content in Stats on MNR Revival</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://mnrrevival.derole.net/stats/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Creation</title>
      <link>https://mnrrevival.derole.net/stats/creation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/creation/</guid>
      <description>&lt;div id=&#34;plg-creation&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;style&gt;&#xA;        .creation-panel {&#xA;            display: grid;&#xA;            grid-template-columns: repeat(2, 1fr);&#xA;            grid-template-rows: repeat(4, 1fr);&#xA;            grid-column-gap: 0px;&#xA;            grid-row-gap: 0px;&#xA;        }&#xA;&#xA;        .creation-panel #creation-image { grid-area: 1 / 1 / 5 / 2; }&#xA;        .creation-panel #creation-name { grid-area: 1 / 2 / 2 / 3; }&#xA;        .creation-panel #creation-description { grid-area: 2 / 2 / 3 / 3; }&#xA;        .creation-panel #creation-author { grid-area: 3 / 2 / 4 / 3; } &#xA;        .creation-panel #creation-rating { grid-area: 4 / 2 / 5 / 3; } &#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div class=&#34;creation-panel&#34;&gt;&#xA;            &lt;div id=&#34;creation-image&#34;&gt;&lt;img id=&#34;user-creation-image&#34; width=&#34;256&#34; height=&#34;256&#34;&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;creation-name&#34; class=&#34;text-large&#34;&gt;&lt;span id=&#34;user-creation-name&#34;&gt;Creation Name&lt;/span&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;creation-description&#34;&gt;&lt;span id=&#34;user-creation-description&#34;&gt;Creation Description&lt;/span&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;creation-author&#34; class=&#34;text-medium&#34;&gt;By &lt;a id=&#34;user-creation-creator&#34;&gt;User&lt;/a&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;creation-rating&#34;&gt;&#xA;                &lt;span id=&#34;user-creation-rating&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                &lt;/span&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;stats&#34;&gt;&#xA;            &lt;h2&gt;Online Stats&lt;/h2&gt;&#xA;            &lt;table&gt;&#xA;                &lt;tbody&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Create XP&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-create-xp&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Create XP This Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-create-xp-this-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Create XP Last Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-create-xp-last-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Views&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-views&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Views This Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-views-this-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Views Last Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-views-last-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Downloads&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-downloads&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Downloads This Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-downloads-this-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Downloads Last Week&lt;/td&gt;&#xA;                        &lt;td id=&#34;creation-downloads-last-week&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;scores&#34; hidden&gt;&#xA;            &lt;h2&gt;Leaderboard&lt;/h2&gt;&#xA;            &lt;button id=&#34;btn-scores-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;scores-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;scores-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;scores-total&#34;&gt;0&lt;/span&gt; scores&lt;/span&gt;&#xA;            &lt;select id=&#34;cmb-subid&#34;&gt;&#xA;                &lt;option value=&#34;703&#34;&gt;Time Trial&lt;/option&gt;&#xA;                &lt;option value=&#34;702&#34;&gt;Action Race&lt;/option&gt;&#xA;                &lt;option value=&#34;705&#34;&gt;Pure Race&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;button id=&#34;btn-scores-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;#&lt;/th&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Username&lt;/th&gt;&#xA;                        &lt;th id=&#34;col-total-time&#34;&gt;Total Time&lt;/th&gt;&#xA;                        &lt;th&gt;Lap Time&lt;/th&gt;&#xA;                        &lt;th&gt;Set At&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;comments&#34;&gt;&#xA;            &lt;h2&gt;Comments&lt;/h2&gt;&#xA;            &lt;button id=&#34;btn-comments-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;comments-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;comments-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;comments-total&#34;&gt;0&lt;/span&gt; comments&lt;/span&gt;&#xA;            &lt;button id=&#34;btn-comments-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;Username&lt;/th&gt;&#xA;                        &lt;th&gt;Comment&lt;/th&gt;&#xA;                        &lt;th&gt;Sent&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const PER_PAGE = 10;&#xA;&#xA;        var commentsPage = 1;&#xA;        var scoresPage = 1;&#xA;        var commentsTotal = 0;&#xA;        var scoresTotal = 0;&#xA;&#xA;        var creationId = &#34;0&#34;;&#xA;        &#xA;        function updateScores() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            var subId = $(&#34;#cmb-subid&#34;).val();&#xA;            &#xA;            getScores(creationId,subId,scoresPage,PER_PAGE,function (res) {&#xA;                var startIdx = (scoresPage - 1) * PER_PAGE;&#xA;&#xA;                scoresTotal = res.total;&#xA;&#xA;                $(&#34;#scores-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#scores-page-end&#34;).text(startIdx + Object.keys(res.scores).length);&#xA;                $(&#34;#scores-total&#34;).text(scoresTotal);&#xA;&#xA;                $(&#34;#scores tbody&#34;).empty();&#xA;                if (subId != &#34;703&#34;) {&#xA;                    $(&#34;#col-total-time&#34;).show();&#xA;                }&#xA;                else {&#xA;                    $(&#34;#col-total-time&#34;).hide();&#xA;                }&#xA;                res.scores.forEach((time) =&gt; {&#xA;                    var totalTime = new Date(time.finishTime * 1000);&#xA;                    var bestLapTime = new Date(time.bestLapTime * 1000);&#xA;                    var updatedAt = new Date(`${time.updatedAt}Z`);&#xA;&#xA;                    var row = $(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).addClass(&#34;text-orange&#34;).text(time.rank))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getPlayerPrimary128ImageUrl(time.playerId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${time.playerId}`).text(time.playerUsername)));&#xA;&#xA;                    if (subId != &#34;703&#34;) {&#xA;                        row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`${totalTime.getMinutes().toString()}:${totalTime.getSeconds().toString().padStart(2, &#34;0&#34;)}.${totalTime.getMilliseconds().toString().padStart(3, &#34;0&#34;)}`))&#xA;                    }&#xA;                        &#xA;                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`${bestLapTime.getMinutes().toString()}:${bestLapTime.getSeconds().toString().padStart(2, &#34;0&#34;)}.${bestLapTime.getMilliseconds().toString().padStart(3, &#34;0&#34;)}`))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(updatedAt.toLocaleString()));&#xA;                        &#xA;                    $(&#34;#scores tbody&#34;).append(row);&#xA;                });&#xA;                &#xA;                $(&#34;#scores&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;                $(&#34;#content&#34;).show();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); });&#xA;        }&#xA;&#xA;        function updateCreationComments(showContent) {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getCreationComments(creationId,commentsPage,PER_PAGE,function (res) {&#xA;                var startIdx = (commentsPage - 1) * PER_PAGE;&#xA;&#xA;                commentsTotal = res.total;&#xA;&#xA;                $(&#34;#comments-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#comments-page-end&#34;).text(startIdx + Object.keys(res.comments).length);&#xA;                $(&#34;#comments-total&#34;).text(commentsTotal);&#xA;&#xA;                $(&#34;#comments tbody&#34;).empty();&#xA;                res.comments.forEach((comment) =&gt; {&#xA;                    var createdAt = new Date(`${comment.createdAt}Z`);&#xA;                    &#xA;                    $(&#34;#comments tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?username=${comment.username}`).text(comment.username)))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(comment.comment))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(createdAt.toLocaleString())));&#xA;                });&#xA;                &#xA;                if (showContent) {&#xA;                    $(&#34;#wait&#34;).hide();&#xA;                    $(&#34;#content&#34;).show();&#xA;                }&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); });&#xA;        }&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            creationId = new URLSearchParams(window.location.search).get(&#34;id&#34;);&#xA;&#xA;            getCreation(creationId,function (res) {&#xA;                $(&#34;#user-creation-image&#34;).attr(&#34;src&#34;, getCreationPreviewImageUrl(res.playerCreationId));&#xA;                $(&#34;#user-creation-name&#34;).text(res.name);&#xA;                $(&#34;#user-creation-description&#34;).text(res.description);&#xA;                $(&#34;#user-creation-creator&#34;).attr(&#34;href&#34;, `/stats/player?username=${res.creatorUsername}`).text(res.creatorUsername);&#xA;                &#xA;                var starElements = $(&#34;#user-creation-rating&#34;).attr(&#34;title&#34;, `${res.rating} stars`).children();&#xA;                for (let i = 0; i &lt; Math.ceil(res.rating); i++) {&#xA;                    if (res.rating - i &lt;= 0.5) {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_half.png&#34;);&#xA;                    }&#xA;                    else {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_full.png&#34;);&#xA;                    }&#xA;                }&#xA;&#xA;                $(&#34;#creation-create-xp&#34;).text(res.points.all_time);&#xA;                $(&#34;#creation-create-xp-this-week&#34;).text(res.points.this_week);&#xA;                $(&#34;#creation-create-xp-last-week&#34;).text(res.points.last_week);&#xA;                $(&#34;#creation-views&#34;).text(res.views.all_time);&#xA;                $(&#34;#creation-views-this-week&#34;).text(res.views.this_week);&#xA;                $(&#34;#creation-views-last-week&#34;).text(res.views.last_week);&#xA;                $(&#34;#creation-downloads&#34;).text(res.downloads.all_time);&#xA;                $(&#34;#creation-downloads-this-week&#34;).text(res.downloads.this_week);&#xA;                $(&#34;#creation-downloads-last-week&#34;).text(res.downloads.last_week);&#xA;&#xA;                document.title = document.title.replace(&#34;Creation&#34;, res.name);&#xA;&#xA;                var isTrack = res.type == &#34;TRACK&#34;;&#xA;                updateCreationComments(!isTrack);&#xA;                if (isTrack) {&#xA;                    updateScores();&#xA;                }&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;        }&#xA;&#xA;        checkServer();&#xA;&#xA;        $(&#34;#cmb-subid&#34;).change(function() {&#xA;            scoresPage = 1;&#xA;            updateScores();&#xA;        });&#xA;        $(&#34;#btn-scores-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (scoresPage &gt; 1) {&#xA;                scoresPage--;&#xA;                updateScores();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-scores-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (scoresPage &lt; (scoresTotal / PER_PAGE)) {&#xA;                scoresPage++;&#xA;                updateScores();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-comments-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (commentsPage &gt; 1) {&#xA;                commentsPage--;&#xA;                updateCreationComments();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-comments-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (commentsPage &lt; (commentsTotal / PER_PAGE)) {&#xA;                commentsPage++;&#xA;                updateCreationComments();&#xA;            }&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Creation Search</title>
      <link>https://mnrrevival.derole.net/stats/creationsearch/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/creationsearch/</guid>
      <description>&lt;div id=&#34;plg-creationsearch&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div id=&#34;creations&#34;&gt;&#xA;            &lt;h2&gt;Results&lt;/h2&gt;&#xA;            &lt;button id=&#34;btn-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;creations-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;creations-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;creations-total&#34;&gt;0&lt;/span&gt; creations&lt;/span&gt;&#xA;            &lt;button id=&#34;btn-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Name&lt;/th&gt;&#xA;                        &lt;th&gt;Created By&lt;/th&gt;&#xA;                        &lt;th&gt;Rating&lt;/th&gt;&#xA;                        &lt;th&gt;Created&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const PER_PAGE = 10;&#xA;&#xA;        var page = 1;&#xA;        var total = 0;&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            var params = new URLSearchParams(window.location.search);&#xA;&#xA;            searchCreations(params.get(&#34;query&#34;), params.get(&#34;type&#34;), params.get(&#34;sortOrder&#34;), page, PER_PAGE,  function (res) {&#xA;                var startIdx = (page - 1) * PER_PAGE;&#xA;&#xA;                total = res.total;&#xA;&#xA;                $(&#34;#creations-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#creations-page-end&#34;).text(startIdx + Object.keys(res.creations).length);&#xA;                $(&#34;#creations-total&#34;).text(total);&#xA;&#xA;                $(&#34;#creations tbody&#34;).empty();&#xA;                res.creations.forEach((creation) =&gt; {&#xA;                    var createdAt = new Date(`${creation.createdAt}Z`);&#xA;                    &#xA;                    $(&#34;#creations tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getCreationPreview64ImageUrl(creation.playerCreationId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${creation.playerCreationId}`).addClass(&#34;text-orange&#34;).text(creation.name)))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(creation.creatorUsername))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(creation.rating))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(createdAt.toLocaleString())));&#xA;                });&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function(err) { &#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                if (err.responseJSON != undefined &amp;&amp; err.responseJSON.error == &#34;error_creation_not_found&#34;) {&#xA;                    alert(&#34;No creations were found that match this search query!&#34;);&#xA;                    window.location = &#34;/stats/creations&#34;;&#xA;                }&#xA;                else {&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;            }); &#xA;        }&#xA;&#xA;        checkServer();&#xA;&#xA;        $(&#34;#btn-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &gt; 1) {&#xA;                page--;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &lt; (total / PER_PAGE)) {&#xA;                page++;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Creations</title>
      <link>https://mnrrevival.derole.net/stats/creations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/creations/</guid>
      <description>&lt;div id=&#34;plg-creations&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div id=&#34;creation-search&#34;&gt;&#xA;            &lt;h2&gt;Creation lookup&lt;/h2&gt;&#xA;            &lt;label&gt;Query&lt;/label&gt;&#xA;            &lt;input id=&#34;txt-query&#34; type=&#34;text&#34;&gt;&#xA;            &lt;select id=&#34;cmb-type&#34;&gt;&#xA;                &lt;option value=&#34;ANY&#34;&gt;Any&lt;/option&gt;&#xA;                &lt;option value=&#34;CHARACTER&#34;&gt;Mod&lt;/option&gt;&#xA;                &lt;option value=&#34;KART&#34;&gt;Kart&lt;/option&gt;&#xA;                &lt;option value=&#34;TRACK&#34;&gt;Track&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;select id=&#34;cmb-sort&#34;&gt;&#xA;                &lt;option value=&#34;desc&#34;&gt;Newest&lt;/option&gt;&#xA;                &lt;option value=&#34;asc&#34;&gt;Oldest&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;button id=&#34;btn-search&#34;&gt;Search&lt;/button&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;top-mods&#34;&gt;&#xA;            &lt;h2&gt;Top Mods&lt;/h2&gt;&#xA;            &lt;table&gt;&#xA;                &lt;tr class=&#34;text-orange&#34;&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;2&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-large&#34;&gt;1&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;3&lt;/td&gt;&#xA;                &lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-mods-images&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-mods-names&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-mods-authors&#34;&gt;&lt;/tr&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;top-karts&#34;&gt;&#xA;            &lt;h2&gt;Top Karts&lt;/h2&gt;&#xA;            &lt;table&gt;&#xA;                &lt;tr class=&#34;text-orange&#34;&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;2&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-large&#34;&gt;1&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;3&lt;/td&gt;&#xA;                &lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-karts-images&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-karts-names&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-karts-authors&#34;&gt;&lt;/tr&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;top-tracks&#34;&gt;&#xA;            &lt;h2&gt;Top Tracks&lt;/h2&gt;&#xA;            &lt;table&gt;&#xA;                &lt;tr class=&#34;text-orange&#34;&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;2&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-large&#34;&gt;1&lt;/td&gt;&#xA;                    &lt;td class=&#34;text-medium&#34;&gt;3&lt;/td&gt;&#xA;                &lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-tracks-images&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-tracks-names&#34;&gt;&lt;/tr&gt;&#xA;                &lt;tr id=&#34;top-tracks-authors&#34;&gt;&lt;/tr&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        function isEmptyOrSpaces(str){&#xA;            return str === null || str.match(/^ *$/) !== null;&#xA;        }&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getTopMods(function (res) {&#xA;                $(&#34;#top-mods-list&#34;).empty();&#xA;                &#xA;                if (Object.keys(res).length &gt; 1) {&#xA;                    var first = res.shift();&#xA;                    res.splice(1, 0, first);&#xA;                }&#xA;                res.slice(0, 3).forEach((creation) =&gt; {&#xA;                    $(&#34;#top-mods-images&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).attr(&#34;src&#34;, getCreationPreviewImageUrl(creation.id))));&#xA;                    $(&#34;#top-mods-names&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${creation.id}`).text(creation.name)));&#xA;                    $(&#34;#top-mods-authors&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`By `).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?username=${creation.creatorUsername}`).text(creation.creatorUsername)));&#xA;                });&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;            &#xA;            getTopKarts(function (res) {&#xA;                $(&#34;#top-karts-list&#34;).empty();&#xA;                &#xA;                if (Object.keys(res).length &gt; 1) {&#xA;                    var first = res.shift();&#xA;                    res.splice(1, 0, first);&#xA;                }&#xA;                res.slice(0, 3).forEach((creation) =&gt; {&#xA;                    $(&#34;#top-karts-images&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).attr(&#34;src&#34;, getCreationPreviewImageUrl(creation.id))));&#xA;                    $(&#34;#top-karts-names&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${creation.id}`).text(creation.name)));&#xA;                    $(&#34;#top-karts-authors&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`By `).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?username=${creation.creatorUsername}`).text(creation.creatorUsername)));&#xA;                });&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;            &#xA;            getTopTracks(function (res) {&#xA;                $(&#34;#top-tracks-list&#34;).empty();&#xA;                &#xA;                if (Object.keys(res).length &gt; 1) {&#xA;                    var first = res.shift();&#xA;                    res.splice(1, 0, first);&#xA;                }&#xA;                res.slice(0, 3).forEach((creation) =&gt; {&#xA;                    $(&#34;#top-tracks-images&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).attr(&#34;src&#34;, getCreationPreviewImageUrl(creation.id))));&#xA;                    $(&#34;#top-tracks-names&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${creation.id}`).text(creation.name)));&#xA;                    $(&#34;#top-tracks-authors&#34;).append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`By `).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?username=${creation.creatorUsername}`).text(creation.creatorUsername)));&#xA;                });&#xA;&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;        }&#xA;&#xA;        checkServer();&#xA;&#xA;        $(&#34;#txt-query&#34;).keypress(function (key) {&#xA;            if(key.which == 13) {&#xA;                $(&#34;#btn-search&#34;).click();&#xA;            }&#xA;        });   &#xA;        $(&#34;#btn-search&#34;).on(&#34;click&#34;, function () {&#xA;            if (isEmptyOrSpaces($(&#34;#txt-query&#34;).val())) {&#xA;                alert(&#34;Please enter a search query&#34;);&#xA;                return;&#xA;            }&#xA;&#xA;            window.location = `/stats/creationsearch?query=${$(&#34;#txt-query&#34;).val()}&amp;type=${$(&#34;#cmb-type&#34;).val()}&amp;sortOrder=${$(&#34;#cmb-sort&#34;).val()}`;&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Hotlap</title>
      <link>https://mnrrevival.derole.net/stats/hotlap/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/hotlap/</guid>
      <description>&lt;div id=&#34;plg-hotlap&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;style&gt;&#xA;        .creation-panel {&#xA;            display: grid;&#xA;            grid-template-columns: repeat(2, 1fr);&#xA;            grid-template-rows: repeat(3, 1fr);&#xA;            grid-column-gap: 0px;&#xA;            grid-row-gap: 0px;&#xA;        }&#xA;&#xA;        .creation-panel #creation-image { grid-area: 1 / 1 / 4 / 2; }&#xA;        .creation-panel #creation-name { grid-area: 1 / 2 / 2 / 3; }&#xA;        .creation-panel #creation-author { grid-area: 2 / 2 / 3 / 3; }&#xA;        .creation-panel #creation-rating { grid-area: 3 / 2 / 4 / 3; } &#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div id=&#34;last-updated&#34;&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;Last updated at &lt;span id=&#34;updated&#34;&gt;00:00&lt;/span&gt;&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;hotlap-track&#34;&gt;&#xA;            &lt;div class=&#34;creation-panel&#34;&gt;&#xA;                &lt;div id=&#34;creation-image&#34;&gt;&lt;img id=&#34;hotlap-track-image&#34; width=&#34;256&#34; height=&#34;256&#34;&gt;&lt;/div&gt;&#xA;                &lt;div id=&#34;creation-name&#34; class=&#34;text-large&#34;&gt;&lt;a id=&#34;hotlap-track-name&#34;&gt;Hotlap Track&lt;/a&gt;&lt;/div&gt;&#xA;                &lt;div id=&#34;creation-author&#34; class=&#34;text-medium&#34;&gt;By &lt;a id=&#34;hotlap-track-creator&#34; class=&#34;text-orange&#34;&gt;User&lt;/a&gt;&lt;/div&gt;&#xA;                &lt;div id=&#34;creation-rating&#34;&gt;&#xA;                    &lt;span id=&#34;hotlap-track-rating&#34;&gt;&#xA;                        &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                        &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                        &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                        &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                        &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;/span&gt;&#xA;                &lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;hotlap-timer&#34; class=&#34;text-gray&#34;&gt;&#xA;            Next Hotlap in &lt;span id=&#34;hotlap-reset-hours&#34; class=&#34;text-orange&#34;&gt;0&lt;/span&gt; hours &lt;span id=&#34;hotlap-reset-minutes&#34; class=&#34;text-orange&#34;&gt;0&lt;/span&gt; minutes (&lt;span id=&#34;hotlap-reset-time&#34;&gt;00:00&lt;/span&gt;)&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;hotlap-records&#34;&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;#&lt;/th&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Username&lt;/th&gt;&#xA;                        &lt;th&gt;Lap Time&lt;/th&gt;&#xA;                        &lt;th&gt;Set At&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const CHECK_INTERVAL = 60000;&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getHotlap(function (res) {&#xA;                var date = new Date();&#xA;                var hotlapResetDate = new Date();&#xA;&#xA;                hotlapResetDate.setSeconds(hotlapResetDate.getSeconds() + res.resetInSeconds);&#xA;&#xA;                $(&#34;#hotlap-reset-hours&#34;).text(Math.floor(res.resetInSeconds / 3600));&#xA;                $(&#34;#hotlap-reset-minutes&#34;).text(Math.floor(res.resetInSeconds % 3600 / 60));&#xA;                $(&#34;#hotlap-reset-time&#34;).text(`${hotlapResetDate.getHours().toString().padStart(2, &#34;0&#34;)}:${hotlapResetDate.getMinutes().toString().padStart(2, &#34;0&#34;)}`);&#xA;&#xA;                $(&#34;#hotlap-track-image&#34;).attr(&#34;src&#34;, getCreationPreviewImageUrl(res.track.id));&#xA;                $(&#34;#hotlap-track-name&#34;).attr(&#34;href&#34;, `/stats/creation?id=${res.track.id}`).text(res.track.name);&#xA;                $(&#34;#hotlap-track-creator&#34;).attr(&#34;href&#34;, `/stats/player?id=${res.track.creatorId}`).text(res.track.creatorUsername);&#xA;                &#xA;                var starElements = $(&#34;#hotlap-track-rating&#34;).attr(&#34;title&#34;, `${res.track.rating} stars`).children();&#xA;                for (let i = 0; i &lt; Math.ceil(res.track.rating); i++) {&#xA;                    if (res.track.rating - i &lt;= 0.5) {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_half.png&#34;);&#xA;                    }&#xA;                    else {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_full.png&#34;);&#xA;                    }&#xA;                }&#xA;&#xA;                $(&#34;#hotlap-records tbody&#34;).empty();&#xA;                res.topTimes.forEach((time) =&gt; {&#xA;                    var bestLapTime = new Date(time.bestLapTime * 1000);&#xA;                    var updatedAt = new Date(`${time.updatedAt}Z`);&#xA;&#xA;                    $(&#34;#hotlap-records tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).addClass(&#34;text-orange&#34;).text(time.rank))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getPlayerPrimary128ImageUrl(time.playerId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${time.playerId}`).text(time.playerUsername)))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`${bestLapTime.getMinutes().toString()}:${bestLapTime.getSeconds().toString().padStart(2, &#34;0&#34;)}.${bestLapTime.getMilliseconds().toString().padStart(3, &#34;0&#34;)}`))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`${updatedAt.getHours().toString().padStart(2, &#34;0&#34;)}:${updatedAt.getMinutes().toString().padStart(2, &#34;0&#34;)}`)));&#xA;                });&#xA;&#xA;                $(&#34;#updated&#34;).text(`${date.getHours().toString().padStart(2, &#34;0&#34;)}:${date.getMinutes().toString().padStart(2, &#34;0&#34;)}`);&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;        }&#xA;&#xA;        checkServer();&#xA;        setInterval(checkServer, CHECK_INTERVAL);&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Leaderboard</title>
      <link>https://mnrrevival.derole.net/stats/leaderboard/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/leaderboard/</guid>
      <description>&lt;div id=&#34;plg-hotlap&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div id=&#34;leaderboard&#34;&gt;&#xA;            &lt;button id=&#34;btn-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;leaderboard-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;leaderboard-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;leaderboard-total&#34;&gt;0&lt;/span&gt; records&lt;/span&gt;&#xA;            &lt;select id=&#34;cmb-leaderboard&#34;&gt;&#xA;                &lt;option value=&#34;creations&#34;&gt;Creations&lt;/option&gt;&#xA;                &lt;option value=&#34;players&#34;&gt;Players&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;span id=&#34;creations-filters&#34;&gt;&#xA;                &lt;select id=&#34;cmb-creations-type&#34;&gt;&#xA;                    &lt;option value=&#34;ANY&#34;&gt;Any&lt;/option&gt;&#xA;                    &lt;option value=&#34;CHARACTER&#34;&gt;Mod&lt;/option&gt;&#xA;                    &lt;option value=&#34;KART&#34;&gt;Kart&lt;/option&gt;&#xA;                    &lt;option value=&#34;TRACK&#34;&gt;Track&lt;/option&gt;&#xA;                &lt;/select&gt;&#xA;                &lt;select id=&#34;cmb-creations-sortby&#34;&gt;&#xA;                    &lt;option value=&#34;xp&#34;&gt;XP Points&lt;/option&gt;&#xA;                    &lt;option value=&#34;views&#34;&gt;Views&lt;/option&gt;&#xA;                    &lt;option value=&#34;downloads&#34;&gt;Downloads&lt;/option&gt;&#xA;                &lt;/select&gt;&#xA;            &lt;/span&gt;&#xA;            &lt;span id=&#34;players-filters&#34;&gt;&#xA;                &lt;select id=&#34;cmb-players-sortby&#34;&gt;&#xA;                    &lt;option value=&#34;onlineraces&#34;&gt;Races Started&lt;/option&gt;&#xA;                    &lt;option value=&#34;onlinewins&#34;&gt;Races Won&lt;/option&gt;&#xA;                    &lt;option value=&#34;longestwinstreak&#34;&gt;Longest Win Streak&lt;/option&gt;&#xA;                    &lt;option value=&#34;currentstreak&#34;&gt;Current Win Streak&lt;/option&gt;&#xA;                    &lt;option value=&#34;longesthangtime&#34;&gt;Biggest Airtime&lt;/option&gt;&#xA;                    &lt;option value=&#34;longestdrift&#34;&gt;Biggest Drift&lt;/option&gt;&#xA;                    &lt;option value=&#34;skillrating&#34;&gt;Skill Rating&lt;/option&gt;&#xA;                &lt;/select&gt;&#xA;            &lt;/span&gt;&#xA;            &lt;button id=&#34;btn-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;#&lt;/th&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th id=&#34;col-name&#34;&gt;Name&lt;/th&gt;&#xA;                        &lt;th id=&#34;col-createdby&#34; hidden&gt;Created By&lt;/th&gt;&#xA;                        &lt;th id=&#34;col-score&#34;&gt;Score&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const PER_PAGE = 10;&#xA;&#xA;        var page = 1;&#xA;        var total = 0;&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            switch ($(&#34;#cmb-leaderboard&#34;).val()) {&#xA;                case &#34;creations&#34;:&#xA;                    getCreationLeaderboard($(&#34;#cmb-creations-type&#34;).val(),$(&#34;#cmb-creations-sortby&#34;).val(),page,PER_PAGE,function (res) {&#xA;                        var startIdx = (page - 1) * PER_PAGE;&#xA;&#xA;                        total = res.total;&#xA;&#xA;                        $(&#34;#leaderboard-page-start&#34;).text(startIdx + 1);&#xA;                        $(&#34;#leaderboard-page-end&#34;).text(startIdx + Object.keys(res.results).length);&#xA;                        $(&#34;#leaderboard-total&#34;).text(total);&#xA;&#xA;                        $(&#34;#leaderboard tbody&#34;).empty();&#xA;                        $(&#34;#col-name&#34;).text(&#34;Name&#34;);&#xA;                        $(&#34;#col-createdby&#34;).show();&#xA;                        $(&#34;#col-score&#34;).text($(&#34;#cmb-creations-sortby option:selected&#34;).text());&#xA;                        res.results.forEach((record) =&gt; {&#xA;                            var row = $(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).addClass(&#34;text-orange&#34;).text(record.rank))&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getCreationPreview64ImageUrl(record.creationId))))&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${record.creationId}`).text(record.name)))&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${record.creatorId}`).text(record.creatorUsername)));&#xA;                            &#xA;                            switch (res.sortBy) {&#xA;                                case &#34;xp&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(`${record.xp} xp`));&#xA;                                    break;&#xA;                                case &#34;views&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.views));&#xA;                                    break;&#xA;                                case &#34;downloads&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.downloads));&#xA;                                    break;&#xA;                            }&#xA;&#xA;                            $(&#34;#leaderboard tbody&#34;).append(row);&#xA;                        });&#xA;&#xA;                        $(&#34;#content&#34;).show();&#xA;                        $(&#34;#wait&#34;).hide();&#xA;                    }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;                    break;&#xA;                case &#34;players&#34;:&#xA;                    getPlayerLeaderboard($(&#34;#cmb-players-sortby&#34;).val(),page,PER_PAGE,function (res) {&#xA;                        var startIdx = (page - 1) * PER_PAGE;&#xA;&#xA;                        total = res.total;&#xA;&#xA;                        $(&#34;#leaderboard-page-start&#34;).text(startIdx + 1);&#xA;                        $(&#34;#leaderboard-page-end&#34;).text(startIdx + Object.keys(res.results).length);&#xA;                        $(&#34;#leaderboard-total&#34;).text(total);&#xA;&#xA;                        $(&#34;#leaderboard tbody&#34;).empty();&#xA;                        $(&#34;#col-name&#34;).text(&#34;Username&#34;);&#xA;                        $(&#34;#col-createdby&#34;).hide();&#xA;                        $(&#34;#col-score&#34;).text($(&#34;#cmb-players-sortby option:selected&#34;).text());&#xA;                        res.results.forEach((record) =&gt; {&#xA;                            var row = $(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).addClass(&#34;text-orange&#34;).text(record.rank))&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getPlayerPrimary128ImageUrl(record.playerId))))&#xA;                                .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${record.playerId}`).text(record.username)));&#xA;                            &#xA;                            switch (res.sortBy) {&#xA;                                case &#34;onlineraces&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.onlineRaces));&#xA;                                    break;&#xA;                                case &#34;onlinewins&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.onlineWins));&#xA;                                    break;&#xA;                                case &#34;longestwinstreak&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.longestWinStreak));&#xA;                                    break;&#xA;                                case &#34;currentstreak&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.currentStreak));&#xA;                                    break;&#xA;                                case &#34;longesthangtime&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.longestHangTime));&#xA;                                    break;&#xA;                                case &#34;longestdrift&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.longestDrift));&#xA;                                    break;&#xA;                                case &#34;modmiles&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.modMiles));&#xA;                                    break;&#xA;                                case &#34;skillrating&#34;:&#xA;                                    row.append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(record.skillRating));&#xA;                                    break;&#xA;                            }&#xA;&#xA;                            $(&#34;#leaderboard tbody&#34;).append(row);&#xA;                        });&#xA;&#xA;                        $(&#34;#content&#34;).show();&#xA;                        $(&#34;#wait&#34;).hide();&#xA;                    }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;                    break;&#xA;            }&#xA;        }&#xA;&#xA;        function checkLeaderboardType() {&#xA;            if ($(&#34;#cmb-leaderboard&#34;).val() == &#34;creations&#34;) {&#xA;                $(&#34;#players-filters&#34;).hide();&#xA;                $(&#34;#creations-filters&#34;).show();&#xA;            }&#xA;            else {&#xA;                $(&#34;#creations-filters&#34;).hide();&#xA;                $(&#34;#players-filters&#34;).show();&#xA;            }&#xA;        }&#xA;&#xA;        $(&#34;#cmb-leaderboard&#34;).change(function() {&#xA;            page = 1;&#xA;            checkLeaderboardType();&#xA;            checkServer();&#xA;        });&#xA;        $(&#34;#cmb-creations-type&#34;).change(function() {&#xA;            page = 1;&#xA;            checkServer();&#xA;        });&#xA;        $(&#34;#cmb-creations-sortby&#34;).change(function() {&#xA;            page = 1;&#xA;            checkServer();&#xA;        });&#xA;        $(&#34;#cmb-players-sortby&#34;).change(function() {&#xA;            page = 1;&#xA;            checkServer();&#xA;        });&#xA;        $(&#34;#btn-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &gt; 1) {&#xA;                page--;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &lt; (total / PER_PAGE)) {&#xA;                page++;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;&#xA;        checkLeaderboardType();&#xA;        checkServer();&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Player</title>
      <link>https://mnrrevival.derole.net/stats/player/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/player/</guid>
      <description>&lt;div id=&#34;plg-player&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;style&gt;&#xA;        .player-panel {&#xA;            display: grid;&#xA;            grid-template-columns: repeat(2, 1fr);&#xA;            grid-template-rows: repeat(4, 1fr);&#xA;            grid-column-gap: 0px;&#xA;            grid-row-gap: 0px; &#xA;        }&#xA;&#xA;        .player-panel #player-panel-image { grid-area: 1 / 1 / 5 / 2; }&#xA;        .player-panel #player-panel-name { grid-area: 1 / 2 / 2 / 3; }&#xA;        .player-panel #player-panel-quote { grid-area: 2 / 2 / 3 / 3; }&#xA;        .player-panel #player-panel-rating { grid-area: 3 / 2 / 4 / 3; } &#xA;        .player-panel #player-panel-joined { grid-area: 4 / 2 / 5 / 3; } &#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div class=&#34;player-panel&#34;&gt;&#xA;            &lt;div id=&#34;player-panel-image&#34;&gt;&lt;img id=&#34;player-image&#34; width=&#34;256&#34; height=&#34;256&#34;&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;player-panel-name&#34; class=&#34;text-large&#34;&gt;&lt;span id=&#34;player-username&#34; class=&#34;text-orange&#34;&gt;User&lt;/span&gt;&lt;img id=&#34;player-rank-img&#34; width=&#34;32&#34;&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;player-panel-quote&#34;&gt;&lt;span id=&#34;player-quote&#34;&gt;User&lt;/span&gt;&lt;/div&gt;&#xA;            &lt;div id=&#34;player-panel-rating&#34;&gt;&#xA;                &lt;span id=&#34;player-rating&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                    &lt;img src=&#34;https://mnrrevival.derole.net/img/star_none.png&#34;&gt;&#xA;                &lt;/span&gt;&#xA;            &lt;/div&gt;&#xA;            &lt;div id=&#34;player-panel-joined&#34; class=&#34;text-gray&#34;&gt;Joined on &lt;span id=&#34;player-joined-date&#34;&gt;Mon Jan 01 2026&lt;/span&gt; at &lt;span id=&#34;player-joined-time&#34;&gt;&lt;/span&gt;&lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;stats&#34;&gt;&#xA;            &lt;h2&gt;Online Stats&lt;/h2&gt;&#xA;            &lt;table&gt;&#xA;                &lt;tbody&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Total XP&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-total-xp&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Race XP&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-race-xp&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Create XP&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-create-xp&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Skill Rating&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-skill-rating&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Wins&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-wins&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;DNFs&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-forfeits&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Finishes&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-finishes&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Win Streak&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-win-streak&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Longest Win Streak&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-longest-win-streak&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Best Drift&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-longest-drift&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;td&gt;Biggest Airtime&lt;/td&gt;&#xA;                        &lt;td id=&#34;player-longest-hang-time&#34;&gt;0&lt;/td&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;creations&#34;&gt;&#xA;            &lt;h2&gt;Creations&lt;/h2&gt;&#xA;            &lt;button id=&#34;btn-creations-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;creations-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;creations-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;creations-total&#34;&gt;0&lt;/span&gt; creations&lt;/span&gt;&#xA;            &lt;select id=&#34;cmb-type&#34;&gt;&#xA;                &lt;option value=&#34;ANY&#34;&gt;Any&lt;/option&gt;&#xA;                &lt;option value=&#34;CHARACTER&#34;&gt;Mod&lt;/option&gt;&#xA;                &lt;option value=&#34;KART&#34;&gt;Kart&lt;/option&gt;&#xA;                &lt;option value=&#34;TRACK&#34;&gt;Track&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;select id=&#34;cmb-sort&#34;&gt;&#xA;                &lt;option value=&#34;desc&#34;&gt;Newest&lt;/option&gt;&#xA;                &lt;option value=&#34;asc&#34;&gt;Oldest&lt;/option&gt;&#xA;            &lt;/select&gt;&#xA;            &lt;button id=&#34;btn-creations-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Name&lt;/th&gt;&#xA;                        &lt;th&gt;Rating&lt;/th&gt;&#xA;                        &lt;th&gt;Created&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;hearted&#34;&gt;&#xA;            &lt;h2&gt;Favourite Creators&lt;/h2&gt;&#xA;            &lt;button id=&#34;btn-hearted-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;hearted-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;hearted-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;hearted-total&#34;&gt;0&lt;/span&gt; favourite creators&lt;/span&gt;&#xA;            &lt;button id=&#34;btn-hearted-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Username&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const PER_PAGE = 10;&#xA;&#xA;        var creationsPage = 1;&#xA;        var heartedPage = 1;&#xA;        var creationsTotal = 0;&#xA;        var heartedTotal = 0;&#xA;&#xA;        var username = &#34;&#34;;&#xA;&#xA;        function updateCreations(username) {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getCreationsByUsername(username, $(&#34;#cmb-type&#34;).val(), $(&#34;#cmb-sort&#34;).val(), creationsPage, PER_PAGE,  function (res) {&#xA;                var startIdx = (creationsPage - 1) * PER_PAGE;&#xA;&#xA;                creationsTotal = res.total;&#xA;&#xA;                $(&#34;#creations-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#creations-page-end&#34;).text(startIdx + Object.keys(res.creations).length);&#xA;                $(&#34;#creations-total&#34;).text(creationsTotal);&#xA;&#xA;                $(&#34;#creations tbody&#34;).empty();&#xA;                res.creations.forEach((creation) =&gt; {&#xA;                    var createdAt = new Date(`${creation.createdAt}Z`);&#xA;                    &#xA;                    $(&#34;#creations tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getCreationPreview64ImageUrl(creation.playerCreationId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/creation?id=${creation.playerCreationId}`).addClass(&#34;text-orange&#34;).text(creation.name)))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(creation.rating))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(createdAt.toLocaleString())));&#xA;                });&#xA;                &#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function(err) { &#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                if (err.responseJSON.error != &#34;error_player_not_found&#34;) {&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;            }); &#xA;        }&#xA;        &#xA;        function updateHearted(username) {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getPlayerHearted(username, heartedPage, PER_PAGE,  function (res) {&#xA;                var startIdx = (heartedPage - 1) * PER_PAGE;&#xA;&#xA;                heartedTotal = res.total;&#xA;&#xA;                $(&#34;#hearted-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#hearted-page-end&#34;).text(startIdx + Object.keys(res.hearted).length);&#xA;                $(&#34;#hearted-total&#34;).text(heartedTotal);&#xA;&#xA;                $(&#34;#hearted tbody&#34;).empty();&#xA;                res.hearted.forEach((heartedPlayer) =&gt; {&#xA;                    $(&#34;#hearted tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getPlayerPrimary128ImageUrl(heartedPlayer.heartedUserId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${heartedPlayer.heartedUserId}`).addClass(&#34;text-orange&#34;).text(heartedPlayer.username))));&#xA;                });&#xA;            &#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function(err) { &#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                if (err.responseJSON.error != &#34;error_player_not_found&#34;) {&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;                else {&#xA;                    $(&#34;#content&#34;).show();&#xA;                }&#xA;            }); &#xA;        }&#xA;&#xA;        function checkQueryType() {&#xA;            var params = new URLSearchParams(window.location.search);&#xA;            if (params.has(&#34;username&#34;)) {&#xA;                $(&#34;#wait&#34;).show();&#xA;&#xA;                getPlayerId(params.get(&#34;username&#34;), function (res) {&#xA;                    checkServer(res);&#xA;                }, function(err) { &#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                if (err.responseText != &#34;error_player_not_found&#34;) {&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;                else {&#xA;                    $(&#34;#fail span&#34;).text(&#34;Could not find user with given username&#34;);&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;            });&#xA;            }&#xA;            else {&#xA;                checkServer(params.get(&#34;id&#34;));&#xA;            }&#xA;        }&#xA;&#xA;        function checkServer(playerId) {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getPlayer(playerId,function (res) {&#xA;                var playerJoined = new Date(`${res.createdAt}Z`);&#xA;                &#xA;                if (res.isBanned) {&#xA;                    $(&#34;#wait&#34;).hide();&#xA;                    $(&#34;#fail span&#34;).text(&#34;This user is banned and cannot be viewed&#34;);&#xA;                    $(&#34;#fail&#34;).show();&#xA;                    return;&#xA;                }&#xA;&#xA;                username = res.username;&#xA;&#xA;                $(&#34;#player-image&#34;).attr(&#34;src&#34;, getPlayerSecondaryImageUrl(res.userId));&#xA;                $(&#34;#player-username&#34;).text(res.username);&#xA;                $(&#34;#player-rank-img&#34;).attr(&#34;src&#34;, `/img/ranks/${res.skillLevels[&#34;PS3&#34;].id}.png`).attr(&#34;title&#34;, res.skillLevels[&#34;PS3&#34;].name);&#xA;                $(&#34;#player-quote&#34;).text(res.quote);&#xA;&#xA;                var starElements = $(&#34;#player-rating&#34;).attr(&#34;title&#34;, `${res.starRating} stars`).children();&#xA;                for (let i = 0; i &lt; Math.ceil(res.starRating); i++) {&#xA;                    if (res.starRating - i &lt;= 0.5) {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_half.png&#34;);&#xA;                    }&#xA;                    else {&#xA;                        starElements.eq(i).attr(&#34;src&#34;, &#34;/img/star_full.png&#34;);&#xA;                    }&#xA;                }&#xA;&#xA;                $(&#34;#player-joined-date&#34;).text(playerJoined.toDateString());&#xA;                $(&#34;#player-joined-time&#34;).text(playerJoined.toLocaleTimeString());&#xA;&#xA;                $(&#34;#player-total-xp&#34;).text(res.skillLevels[&#34;PS3&#34;].xp);&#xA;                $(&#34;#player-race-xp&#34;).text(res.skillLevels[&#34;PS3&#34;].raceXp);&#xA;                $(&#34;#player-create-xp&#34;).text(res.skillLevels[&#34;PS3&#34;].creationPoints);&#xA;                $(&#34;#player-skill-rating&#34;).text(res.skillRating);&#xA;                $(&#34;#player-wins&#34;).text(res.onlineWins);&#xA;                $(&#34;#player-forfeits&#34;).text(res.onlineForfeits);&#xA;                $(&#34;#player-finishes&#34;).text(res.onlineFinished);&#xA;                $(&#34;#player-win-streak&#34;).text(res.winStreak);&#xA;                $(&#34;#player-longest-win-streak&#34;).text(res.longestWinStreak);&#xA;                $(&#34;#player-longest-drift&#34;).text(res.longestDrift);&#xA;                $(&#34;#player-longest-hang-time&#34;).text(res.longestHangTime);&#xA;                &#xA;                document.title = document.title.replace(&#34;Player&#34;, res.username);&#xA;&#xA;                updateCreations(res.username);&#xA;                updateHearted(res.username);&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;        }&#xA;&#xA;        checkQueryType();&#xA;        &#xA;        $(&#34;#cmb-type&#34;).change(function() {&#xA;            creationsPage = 1;&#xA;            updateCreations(username);&#xA;        });&#xA;        $(&#34;#cmb-sort&#34;).change(function() {&#xA;            creationsPage = 1;&#xA;            updateCreations(username);&#xA;        });&#xA;        $(&#34;#btn-creations-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (creationsPage &gt; 1) {&#xA;                creationsPage--;&#xA;                updateCreations(username);&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-creations-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (creationsPage &lt; (creationsTotal / PER_PAGE)) {&#xA;                creationsPage++;&#xA;                updateCreations(username);&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-hearted-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (heartedPage &gt; 1) {&#xA;                heartedPage--;&#xA;                updateHearted(username);&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-hearted-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (heartedPage &lt; (heartedTotal / PER_PAGE)) {&#xA;                heartedPage++;&#xA;                updateHearted(username);&#xA;            }&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Players</title>
      <link>https://mnrrevival.derole.net/stats/players/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mnrrevival.derole.net/stats/players/</guid>
      <description>&lt;div id=&#34;plg-players&#34;&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/lib/jquery-3.7.1.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;https://mnrrevival.derole.net/js/plgapi.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;style&gt;&#xA;        .loading-bg {&#xA;            position: absolute;&#xA;        }&#xA;&#xA;        .loading-wheel {&#xA;            animation: 2s infinite normal linear loading-wheel-anim;&#xA;        }&#xA;&#xA;        @keyframes loading-wheel-anim {&#xA;            100% {&#xA;                transform: rotate(360deg);&#xA;            }&#xA;        }&#xA;    &lt;/style&gt;&#xA;    &lt;style&gt;&#xA;        .creation-panel {&#xA;            display: grid;&#xA;            grid-template-columns: repeat(2, 1fr);&#xA;            grid-template-rows: repeat(3, 1fr);&#xA;            grid-column-gap: 0px;&#xA;            grid-row-gap: 0px;&#xA;        }&#xA;&#xA;        .creation-panel #creation-image { grid-area: 1 / 1 / 4 / 2; }&#xA;        .creation-panel #creation-name { grid-area: 1 / 2 / 2 / 3; }&#xA;        .creation-panel #creation-author { grid-area: 2 / 2 / 3 / 3; }&#xA;        .creation-panel #creation-rating { grid-area: 3 / 2 / 4 / 3; } &#xA;    &lt;/style&gt;&#xA;    &lt;div id=&#34;wait&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_bg.png&#34; class=&#34;loading-bg&#34;&gt;&#xA;        &lt;img src=&#34;https://mnrrevival.derole.net/img/loading_wheel.png&#34; class=&#34;loading-wheel&#34;&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;fail&#34; hidden&gt;&#xA;        &lt;span class=&#34;text-red&#34;&gt;Server is currently unreachable&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;content&#34; hidden&gt;&#xA;        &lt;div id=&#34;player-search&#34;&gt;&#xA;            &lt;h2&gt;Player lookup&lt;/h2&gt;&#xA;            &lt;label&gt;Username&lt;/label&gt;&#xA;            &lt;input id=&#34;txt-username&#34; type=&#34;text&#34;&gt;&#xA;            &lt;button id=&#34;btn-search&#34;&gt;Search&lt;/button&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div id=&#34;sessions&#34;&gt;&#xA;            &lt;h2&gt;Sessions&lt;/h2&gt;&#xA;            &lt;div id=&#34;last-updated&#34;&gt;&#xA;                &lt;span class=&#34;text-gray&#34;&gt;Last updated at &lt;span id=&#34;updated&#34;&gt;00:00&lt;/span&gt;&lt;/span&gt;&#xA;            &lt;/div&gt;&#xA;            &lt;button id=&#34;btn-previous&#34;&gt;&amp;lt;&lt;/button&gt;&#xA;            &lt;span class=&#34;text-gray&#34;&gt;&lt;span id=&#34;session-page-start&#34;&gt;0&lt;/span&gt;-&lt;span id=&#34;session-page-end&#34;&gt;0&lt;/span&gt; of &lt;span id=&#34;session-total&#34;&gt;0&lt;/span&gt; sessions&lt;/span&gt;&#xA;            &lt;button id=&#34;btn-next&#34;&gt;&gt;&lt;/button&gt;&#xA;            &lt;table&gt;&#xA;                &lt;thead&gt;&#xA;                    &lt;tr&gt;&#xA;                        &lt;th&gt;&lt;/th&gt;&#xA;                        &lt;th&gt;Username&lt;/th&gt;&#xA;                        &lt;th&gt;Status&lt;/th&gt;&#xA;                        &lt;th&gt;Platform&lt;/th&gt;&#xA;                        &lt;th&gt;Network&lt;/th&gt;&#xA;                    &lt;/tr&gt;&#xA;                &lt;/thead&gt;&#xA;                &lt;tbody&gt;&#xA;                &lt;/tbody&gt;&#xA;            &lt;/table&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script&gt;&#xA;        const CHECK_INTERVAL = 30000;&#xA;&#xA;        const PER_PAGE = 10;&#xA;        const SESSION_STATUSES = {&#xA;            &#34;OFFLINE&#34;: &#34;Offline&#34;,&#xA;            &#34;ONLINE&#34;: &#34;Online&#34;,&#xA;            &#34;INGAME&#34;: &#34;In Single Player Event&#34;,&#xA;            &#34;LOBBY&#34;: &#34;In Lobby&#34;,&#xA;            &#34;WEB&#34;: &#34;On Website&#34;,&#xA;            &#34;CAREER_CHALLENGE&#34;: &#34;In Career&#34;,&#xA;            &#34;CASUAL_RACE&#34;: &#34;In Online Race (Casual)&#34;,&#xA;            &#34;IDLING&#34;: &#34;Idle&#34;,&#xA;            &#34;IN_POD&#34;: &#34;In Pod&#34;,&#xA;            &#34;IN_STUDIO&#34;: &#34;In Creation Station&#34;,&#xA;            &#34;KART_PARK_CHALLENGE&#34;: &#34;In Online Race (PvP)&#34;,&#xA;            &#34;RANKED_RACE&#34;: &#34;In Online Race (Ranked)&#34;,&#xA;            &#34;ROAMING&#34;: &#34;In ModSpot&#34;&#xA;        };&#xA;&#xA;        var page = 1;&#xA;        var total = 0;&#xA;&#xA;        function isEmptyOrSpaces(str){&#xA;            return str === null || str.match(/^ *$/) !== null;&#xA;        }&#xA;&#xA;        function checkServer() {&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getPlayerPresences(page,PER_PAGE,function (res) {&#xA;                var date = new Date();&#xA;                var startIdx = (page - 1) * PER_PAGE;&#xA;&#xA;                total = res.total;&#xA;&#xA;                $(&#34;#session-page-start&#34;).text(startIdx + 1);&#xA;                $(&#34;#session-page-end&#34;).text(startIdx + Object.keys(res.presence).length);&#xA;                $(&#34;#session-total&#34;).text(total);&#xA;&#xA;                $(&#34;#sessions tbody&#34;).empty();&#xA;                res.presence.forEach((session) =&gt; {&#xA;                    $(&#34;#sessions tbody&#34;).append($(&#34;&lt;tr&gt;&lt;/tr&gt;&#34;)&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;img&gt;&lt;/img&gt;&#34;).addClass(&#34;player-avatar-preview&#34;).attr(&#34;src&#34;, getPlayerPrimary128ImageUrl(session.userId))))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).append($(&#34;&lt;a&gt;&lt;/a&gt;&#34;).attr(&#34;href&#34;, `/stats/player?id=${session.userId}`).addClass(&#34;text-orange&#34;).text(session.username)))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(SESSION_STATUSES[session.presence]))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(session.platform))&#xA;                        .append($(&#34;&lt;td&gt;&lt;/td&gt;&#34;).text(session.isRpcn ? &#34;RPCN&#34; : &#34;PSN&#34;)));&#xA;                });&#xA;&#xA;                $(&#34;#updated&#34;).text(`${date.getHours().toString().padStart(2, &#34;0&#34;)}:${date.getMinutes().toString().padStart(2, &#34;0&#34;)}`);&#xA;&#xA;                $(&#34;#content&#34;).show();&#xA;                $(&#34;#wait&#34;).hide();&#xA;            }, function() { $(&#34;#wait&#34;).hide(); $(&#34;#fail&#34;).show(); }); &#xA;        }&#xA;&#xA;        checkServer();&#xA;        setInterval(checkServer, CHECK_INTERVAL);&#xA;&#xA;        $(&#34;#txt-username&#34;).keypress(function (key) {&#xA;            if(key.which == 13) {&#xA;                $(&#34;#btn-search&#34;).click();&#xA;            }&#xA;        });   &#xA;        $(&#34;#btn-search&#34;).on(&#34;click&#34;, function () {&#xA;            if (isEmptyOrSpaces($(&#34;#txt-username&#34;).val())) {&#xA;                alert(&#34;Please enter a username&#34;);&#xA;                return;&#xA;            }&#xA;&#xA;            $(&#34;#wait&#34;).show();&#xA;&#xA;            getPlayerId($(&#34;#txt-username&#34;).val(), function (res) {&#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                window.location = `/stats/player?id=${res}`;&#xA;            }, function(err) { &#xA;                $(&#34;#wait&#34;).hide();&#xA;&#xA;                if (err.responseText == &#34;error_player_not_found&#34;) {&#xA;                    alert(&#34;The player you searched for does not exist!&#34;);&#xA;                }&#xA;                else {&#xA;                    $(&#34;#fail&#34;).show();&#xA;                }&#xA;            });&#xA;        });&#xA;        $(&#34;#btn-previous&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &gt; 1) {&#xA;                page--;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;        $(&#34;#btn-next&#34;).on(&#34;click&#34;, function () {&#xA;            if (page &lt; (total / PER_PAGE)) {&#xA;                page++;&#xA;                checkServer();&#xA;            }&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
