• 0

Need help with regex


Question

I got the following code I need to modify:


function htmlize($var){
$var = htmlspecialchars($var);
while(ereg('\^([0-9])', $var)) {
foreach(array('black', 'red', 'darkgreen', 'yellow', 'blue', 'cyan', 'deeppink', 'white', 'blue-night', 'red-night') as $num_color => $name_color) {
if (ereg('\^([0-9])(.*)\^([0-9])', $var)){
$var = preg_replace("#\^".$num_color."(.*)\^([0-9])#Usi", "<font color=\"".$name_color."\">$1</font>^$2", $var);
} else {
$var = preg_replace("#\^".$num_color."(.*)$#Usi", "<font color=\"".$name_color."\">$1</font>", $var);
}
}
}
$end = removefunchars($var);
return $end;
}[/CODE]

It is used with quake 3 which uses ^ and a number to change the colour of characters. The code above works, but I need to add funny characters such as *{}

Right now those characters are not colour coded and it skips over other characters that follow.

EDIT: It actually seems to be a bug and now I'm not sure what to do...

2Tt24.png

It seems the one guy is using letters instead of numbers to change the colours.

Here is the array:

[CODE]
[6] => Array
(
[frags] => 0
[ping] => 61
[nick] => ^p*^a{^pC^aH^pS^a}^p*^aU^pnb^aR
[gq_name] => ^p*^a{^pC^aH^pS^a}^p*^aU^pnb^aR
[gq_score] => 0
[gq_ping] => 61
)
[13] => Array
(
[frags] => 117
[ping] => 51
[nick] => ^2*{^8CHS^2}*^8^2!^8<^2!^8N^2
[gq_name] => ^2*{^8CHS^2}*^8^2!^8<^2!^8N^2
[gq_score] => 117
[gq_ping] => 51
)
[/CODE]

Link to comment
https://www.neowin.net/forum/topic/1106349-need-help-with-regex/
Share on other sites

6 answers to this question

Recommended Posts

  • 0

I found another code that does the same thing but is a bit more thorough and need to add $ to it.


function check_color($text, $switch)
{
$clr = array ( // colors
"\"#000000\"", "\"#FF0000\"", "\"#008800\"", "\"#E6FF00\"", // 1
"\"#0B00DB\"", "\"#2EFCFF\"", "\"#FF00F7\"", "\"#FFFFFF\"", // 2
"\"#000000\"", "\"#757575\"", "\"#FF0000\"", "\"#006E55\"", // 3
"\"#970080\"", "\"#005AFF\"", "\"#00FFFF\"", "\"#63C6FF\"", // 4
"\"#00DA2F\"", "\"#003820\"", "\"#7C0015\"", "\"#940123\"", // 5
"\"#752700\"", "\"#A7905E\"", "\"#555C26\"", "\"#B0B0B0\"", // 6
"\"#FFFFFF\"", "\"#000000\"", "\"#FF0000\"", "\"#00B906\"", // 7
"\"#FFFF00\"", "\"#0B00DF\"", "\"#00FCFF\"", "\"#FF00F7\"", // 8
"\"#FFFFFF\"", "\"#00FFFF\"", "\"#757575\"", "\"#FF8000\"", // 9
"\"#F7FF00\"", "\"#BBBBBB\"", "\"#747228\"", "\"#FF5500\"", // 10
"\"#670504\"", "\"#0000FF\"" // 11
);
if ($switch == 1)
{ // colored string
$search = array (
"/\^0/", "/\^1/", "/\^2/", "/\^3/", // 1
"/\^4/", "/\^5/", "/\^6/", "/\^7/", // 2
"/\^8/", "/\^9/", "/\^a/", "/\^b/", // 3
"/\^c/", "/\^d/", "/\^e/", "/\^f/", // 4
"/\^g/", "/\^h/", "/\^i/", "/\^j/", // 5
"/\^k/", "/\^l/", "/\^m/", "/\^n/", // 6
"/\^o/", "/\^p/", "/\^q/", "/\^r/", // 7
"/\^s/", "/\^t/", "/\^u/", "/\^v/", // 8
"/\^w/", "/\^x/", "/\^y/", "/\^z/", // 9
"/\^\//", "/\^\*/", "/\^\-/", "/\^\+/", // 10
"/\^\?/", "/\^\@/", "/\^</", "/\^>/", // 11
"/\^\&/", "/\^\)/", "/\^\(/", "/\^[A-Z]/", // 12
"/\^\_/", // 14
"/&</", "/^(.*?)<\/font>/" // 15
);
$replace = array (
"&<font color=$clr[0]>", "&<font color=$clr[1]>", // 1
"&<font color=$clr[2]>", "&<font color=$clr[3]>", // 2
"&<font color=$clr[4]>", "&<font color=$clr[5]>", // 3
"&<font color=$clr[6]>", "&<font color=$clr[7]>", // 4
"&<font color=$clr[8]>", "&<font color=$clr[9]>", // 5
"&<font color=$clr[10]>", "&<font color=$clr[11]>", // 6
"&<font color=$clr[12]>", "&<font color=$clr[13]>", // 7
"&<font color=$clr[14]>", "&<font color=$clr[15]>", // 8
"&<font color=$clr[16]>", "&<font color=$clr[17]>", // 9
"&<font color=$clr[18]>", "&<font color=$clr[19]>", // 10
"&<font color=$clr[20]>", "&<font color=$clr[21]>", // 11
"&<font color=$clr[22]>", "&<font color=$clr[23]>", // 12
"&<font color=$clr[24]>", "&<font color=$clr[25]>", // 13
"&<font color=$clr[26]>", "&<font color=$clr[27]>", // 14
"&<font color=$clr[28]>", "&<font color=$clr[29]>", // 15
"&<font color=$clr[30]>", "&<font color=$clr[31]>", // 16
"&<font color=$clr[32]>", "&<font color=$clr[33]>", // 17
"&<font color=$clr[34]>", "&<font color=$clr[35]>", // 18
"&<font color=$clr[36]>", "&<font color=$clr[37]>", // 19
"&<font color=$clr[38]>", "&<font color=$clr[39]>", // 20
"&<font color=$clr[40]>", "&<font color=$clr[41]>", // 21
"", "", "", "", "", "", // 22
"", "</font><", "\$1" // 23
);
$ctext = preg_replace($search, $replace, $text);
if ($ctext != $text)
{
$ctext = preg_replace("/$/", "</font>", $ctext);
}
return $ctext;
}
elseif ($switch == 2)
{ // colored numbers
if ($text <= 39)
{
$ctext = "<font color=$clr[7]>$text</font>";
}
elseif ($text <= 69)
{
$ctext = "<font color=$clr[5]>$text</font>";
}
elseif ($text <= 129)
{
$ctext = "<font color=$clr[8]>$text</font>";
}
elseif ($text <= 399)
{
$ctext = "<font color=$clr[9]>$text</font>";
}
else
{
$ctext = "<font color=$clr[1]>$text</font>";
}
return $ctext;
}
}
[/CODE]

EDIT: It's actually only one person I'm having trouble with now

^@^@^$iq>^@50gr

  • 0

So... I have read over both of your posts several times and I am having a little trouble figuring out exactly what you are trying to accomplish. I will explain the situation as best I can understand it, and you can correct me where I'm wrong.

You are creating a leader board, or possibly post-game score board, in PHP to display stats from your Quake 3 server. You are accepting an array of data directly from Quake 3 and trying to parse it in PHP. The problem is, some of your players have figured out exactly what you're doing and are trying to color their in-game player names, which you don't want to happen. They are doing this by logging into your Quake 3 server with user names that include HTML tags, such as <font color> (the HTML font color tag is depreciated in favor of the functionally identical CSS color property according to MDN, which is why I linked to the CSS color article), which your PHP code sending directly to the web browser to be interpreted and displayed on screen.

If my interpretation of the problem is correct, it sounds like you are failing to sanitize your input correctly. The two functions you posted above are your attempts at mitigating the issue, but each one fails to take into account some specific cases, despite the verbosity of the second function (which is not necessarily indicative of better coverage or quality). Based on this interpretation, you probably have even bigger security holes lurking in your code. This bug is annoying but fairly harmless, however, others could be worse. I recommend that you check out this article on sanitizing your inputs in PHP.

Additionally, make sure that you know what all of your code is doing! Don't just copy/paste code from the Internet without fully understanding it. That is not to say that you shouldn't use external libraries; that would be foolish. However, make sure that you understand what your library does before you use it. For example, I don't know all of the implementation details of SQLite, and I probably couldn't have written a library that high-quality or complex by myself, but I have read its documentation and understand the interface, best practices, relevant performance characteristics, and caveats. It is not just a black box that performs magic someone told me would solve my problem.

Finally, in addition to a better title and more thorough description in your initial post, please follow the forum guidelines about tagging your post.

Please use the following format when starting a new topic that relates to a single programming language

[Programming Language] Name of your topic

While it wasn't too difficult to figure out which language you are using based on the code you posted, it would have saved me a little trouble. (I looked in the tags too, which also don't exist.) Especially when you are asking for free help, it is best to make it as easy for others to help you as possible; you will probably get more responses that way. When I see poorly formatted posts with missing details, I am far less likely to take the time to respond (and I'm probably not the only one).

EDIT: This post is mostly the same as the one above it. My last post was fine immediately after I posted it. When I checked again just a couple of minutes ago, most of the post was missing. Will a mod please remove my post above this one?

  • 0

Regex isn't parsing html, the code I posted adds <font color> to the page translating the various q3 font modifiers. For instance ^1 = <font color="#FF0000">

I added htmlspecialchars to fix some issues with the php. Basically, the code is not able to parse ^$ and translate that to <font color=...>

Edited by DPyro
  • 0

Regex isn't parsing html, the code I posted adds <font color> to the page translating the various q3 font modifiers. For instance ^1 = <font color="#FF0000">

I added htmlspecialchars to fix some issues with the php. Basically, the code is not able to parse ^$ and translate that to <font color=...>

In that case, can you post a table of the codes you need to translate? The HTML color codes are standard, but I can't help you very much if I don't know the codes you are translating from.

  • 0

In that case, can you post a table of the codes you need to translate? The HTML color codes are standard, but I can't help you very much if I don't know the codes you are translating from.

See the regex in the previous post


if ($switch == 1)
{ // colored string
$search = array (
"/\^0/", "/\^1/", "/\^2/", "/\^3/", // 1
"/\^4/", "/\^5/", "/\^6/", "/\^7/", // 2
"/\^8/", "/\^9/", "/\^a/", "/\^b/", // 3
"/\^c/", "/\^d/", "/\^e/", "/\^f/", // 4
"/\^g/", "/\^h/", "/\^i/", "/\^j/", // 5
"/\^k/", "/\^l/", "/\^m/", "/\^n/", // 6
"/\^o/", "/\^p/", "/\^q/", "/\^r/", // 7
"/\^s/", "/\^t/", "/\^u/", "/\^v/", // 8
"/\^w/", "/\^x/", "/\^y/", "/\^z/", // 9
"/\^\//", "/\^\*/", "/\^\-/", "/\^\+/", // 10
"/\^\?/", "/\^\@/", "/\^</", "/\^>/", // 11
"/\^\&/", "/\^\)/", "/\^\(/", "/\^[A-Z]/", // 12
"/\^\_/", // 14
"/&</", "/^(.*?)<\/font>/"
[/CODE]

So if the name of someone in q3 was ^1D^2P^3y^4r^5o it would look like [b][color=#ff0000]D[/color][color=#00ff00]P[/color][color=#ffff00]y[/color][color=#0000ff]r[/color][color=#00ffff]o[/color][/b]

The problem shows up with a name like ^@^@^$iq>^@50gr where he is using special characters to modify the colour.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • 7 Days: SPECS for $2,195, Firefox Nova 2026, first AI arts museum, and iPhone price hike by Aditya Tiwari 7 Days is a weekly roundup of picks of what's been happening in the world of technology - written with a dash of humor, a hint of exasperation, and an endless supply of (black) coffee. This week's highlights include Linux 7.1 stable release, Samsung pulling the plug on its VPN, and Microsoft Edge bringing the sign-in with Google experience. Let's get started. You can check out the recent issues of the 7 Days weekly roundup. Mozilla highlights Firefox Nova Mozilla showed off a new Firefox roadmap highlighting the browser's upcoming features and the Nova 2026 redesign. Interested users and enthusiasts can check out what's cooking and share feedback on the upcoming additions. Besides this, Firefox 152 brought Tab Groups to Android as one of its biggest additions, along with a redesigned Settings experience. World's first AI arts museum Image: Google Google opened the world's first AI arts museum in Los Angeles on June 20, which it named Dataland. The museum, spanning 25,000 square feet, was built in collaboration with media artist Refik Anadol, who has worked with Google since 2016. It will have real-time visuals and react dynamically to visitors. Salesforce shopping bag In the latest acquisition news, Salesforce is buying the customer support software company Fin (formerly Intercom) for $3.6 billion to strengthen its AI customer service ambitions and Agentforce platform. The transaction is expected to close in the fourth quarter of its fiscal year 2027. UK follows Australia Prime Minister Keir Starmer announced that the country will ban social media for kids under 16, which is happening after a six-week trial involving 300 teenagers, stating that social media is making them unhappy and easier for bullies to harass and abuse them. Starmer continued that social media is addictive and uses an infinite scroll designed to lock users in for hours. The UK government plans to take action on gaming services and livestreaming platforms. Meanwhile, its age verification rules have also become a hot topic and a point of criticism. Our Features Our coffee-powered team publishes a platter of editorials, opinion posts, and guides. Check them out: Microsoft hides these secret Windows 11 performance boost settings available on every PC Microsoft Paint used to be my favorite Windows app as a kid, and it's still pretty good Why you need to take back control of your synced passwords and how to go about doing that The Microsoft Office feature that time forgot This week in software news Catch up on some of the latest software news updates that arrived throughout the week: Another Samsung shutdown: The South Korean giant is pulling the plug on the Samsung Max VPN app, which is used by more than 50 million users. The app has stopped working since June 15, and Samsung didn't provide a reason for the unexpected move. Photoshop power-up: The popular image editing app is getting a big 20% performance boost on x86-64 (AMD64) systems and a 13% bump-up on Arm devices. Here, the credit goes to a new performance boost added to Windows 11 following a combined effort between Microsoft and Adobe. Linux 7.1 arrives: Linus Torvalds released the stable Linux 7.1 kernel this week, which brings critical driver updates and a rewritten storage driver. You should look out for the new NTFS driver, Intel FRED for improved performance on Panther Lake and future CPUs. Ads in your games: Electronic Arts is launching a new advertising platform to serve in-game ads and enable brands to feature their products in titles like EA Sports FC, Madden, NHL, Skate, or The Sims. With EA Advertising, brands will be able to inject their products into games in real-time via dynamic placement, in places like stadium signage in sports games. Sign in with Google: Microsoft Edge browser is finally getting direct Google account sign-in support from the profile menu and the Edge sign-in screen, allowing users to sync browser data without an MSA. Rufus 4.15 beta: The latest Rufus update is out with important fixes for "silent" Windows 11 installation, patches for ARM-based PCs, and more. Rufus 4.15 beta is now available to download from its official GitHub repository. NVIDIA 610.62: GeForce hardware owners can get their hands on the new WHQL-certified 610.62 Game Ready driver, which carries a lot of bug fixes and support for the fast-paced 6v6 movement shooter Empulse. Zed 1.7.2: The latest update adds "/compact" AI chat summarization, new models, settings kill management, git graph commands, and UI improvements. This week in hardware news Image: Snap Inc. Catch up on some of the latest software news updates that arrived throughout the week: SPECS for $2,195: Snap Inc. launched its new AR-powered wearable computer. SPECS are now available for pre-order and will start shipping in the US, UK, and France later this year. No CMF phone in 2026: The global memory shortage has also knocked Nothing's door and it has decided to hold the launch of CMF Phone 2 Pro's successor this year. That said, Nothing still has planned several new products under the CMF brand. 12th Gen Surface Pro: It's been two years since the original pair of Copilot+ PCs arrived. Now, Microsoft upgraded the lineup with Snapdragon X2-based devices for the 12th-gen Surface Pro, which promises up to 53% faster graphics. New Surface Laptop: The refreshed Surface Laptop is also powered by the Snapdragon X2 Plus and X2 Elite, offering up to 58% faster graphics performance, 80 TOPS Neural Processing Units (NPUs), and up to 20 hours of battery life. HONOR Robot Phone: The Chinese smartphone maker demoed its mobile photography capabilities by capturing its first cinematic video using the Robot Phone concept, which features a 3-axis, 4DoF gimbal that extends from the phone's body for stable recording and real-time subject tracking. Snapdragon Reality Elite Platform: Qualcomm's new platform is a massive leap forward for mixed reality and spatial computing devices. It can power both all-in-one video-see-through headsets and lightweight, tethered optical-see-through glasses, offering better visuals, improved power efficiency, and deeper on-device AI integration compared to the previous generation. Galaxy XR: Samsung's extended-reality handset arrived in the UK months after its launch. It's available for pre-order now and will go on sale on July 8. The hardware remains unchanged, but Samsung has pushed several new updates in recent months. HONOR Watch 6: HONOR also launched its new smartwatch with an incredible 35-day battery life without breaking your bank. The device is made from recyclable aluminum alloy and weighs just 41 grams. Where are the foldables? If you're waiting for Samsung's fresh lineup of foldable devices, you can read Hamid's detailed post about the Galaxy Z Fold8, Flip8, and Z Fold Wide, a passport-style device expected to rival the foldable iPhone. This week in Google News Image: Google Catch up on some of the latest Google and Alphabet news updates that arrived throughout the week: Gemini co-lead departs: Noam Shazeer, who served as VP of engineering and technical co-lead for Gemini, is leaving the search giant for OpenAI. Shazeer is best known as one of the co-authors of the 2017 "Attention Is All You Need" paper, which introduced the Transformer architecture that now powers most LLMs. Waymo recall: The Alphabet-owned self-driving car maker recalled its fifth-generation Automated Driving Systems (ADS) after multiple cars drove through closed construction zones. The NHTSA website said Waymo is currently working on a fix, and freeway driving is being restricted. This week in Apple News Image: Apple Catch up on some of the latest Apple news updates that arrived throughout the week: Tim Cook confirms price hike: The departing Apple CEO confirmed the looming price hikes for Apple's future products without naming any, adding that “Unfortunately, price increases are unavoidable.” Despite having cash and silicon expertise, Apple has no plans to build its own memory and storage factories. An educated estimate suggests customers could end up paying around $1,299-1,399 for the base iPhone 18 Pro. iPhone Air isn't dead: If you were thinking the iPhone Air has lived its life, a new report claims otherwise. The next iPhone Air (codenamed V62) is expected to arrive in the spring of 2027, featuring an additional rear camera for ultrawide photography and improved battery life to address its biggest drawbacks. This week in Meta news Catch up on some of the latest Meta, WhatsApp, and Instagram updates that arrived throughout the week: A long-requested feature: Instagram has finally enabled users to write individual captions for each image or video in a carousel. Rolling out to all users, you can select "Multiple Captions" option from the dropdown while creating a carousel in the app. Threads reaches new milestone: Meta's text-first social media platform crossed 500 million monthly active users. It's now expanding the Communities feature beyond beta, adding a new set of tools to make participation easier and more engaging. This week in AI news Image via DepositPhotos.com Catch up on the latest artificial intelligence news updates that arrived throughout the week: Unreal Engine 6: Epic Games' upcoming engine brings changes to the programming model, portability improvements, and generative AI integration. It focuses on the use of generative AI models and tools like Claude and Codex to play a central role in helping developers "build content faster." Americans and AI: New research suggests that about 49% of American adults use AI chatbots such as Gemini and ChatGPT. However, many are skeptical about the impact of AI on both the personal and societal levels, believing it may be harmful in the long run. Mainframe exit vendors might exit: Gartner predicts in its new report that 75% of mainframe exit vendors, which help companies migrate their legacy mainframe systems to modern cloud environments, will either pivot or cease operations as the market realities take hold by 2030. This week in Microsoft News Microsoft announced Windows 11 version 26H2; confirmed a new bug where the Recycle Bin delete prompts display internal file names instead of actual ones; the latest Patch Tuesday updates seemingly broke some third-party Office integrations. You can check out Taras's freshly baked Microsoft Weekly roundup to catch up on all the interesting stories this week. This week in science news Image by Steve Johnson via Pexels Catch up on some of the latest science and out-of-this-world updates that arrived throughout the week: The end of the universe: A new Cornell study suggests the universe will not expand forever. Because of the negative dark energy, it could stop expanding and collapse into a "big crunch" in 20 billion years. The impact of traffic: Researchers found that urban traffic pollution, specifically nitrogen oxides and fine particles, quickly alters the atmospheric electric field measurably in urban areas. This indicates that atmospheric electricity could become a valuable tool to monitor urban air quality and activity. The light of life: A study revealed that living organisms emit a faint, invisible glow called ultraweek photon emission. This natural light significantly decreases after death and increases during stress, offering a highly promising new method for noninvasive medical health diagnosis. Mysteries of time: A new study suggests that the direction of time is not fixed in certain quantum systems. Standard equations of energy loss remain time-symmetric, which means laws can theoretically run backward or forward. This week in gaming The latest issue of Pulasthi's Weekend PC Game Deals curates several exciting games on sale this week. Epic Games Store is now hosting Robobeat and Citizen Sleeper as free-to-claim titles this week, which you can add to your library. Latest issue of Xbox Free Play Days features four new games: PGA TOUR 2K25, Two Point Museum, Assetto Corsa, and Dead by Daylight. Meanwhile, Xbox Game Pass got another Call of Duty addition, the latest soccer game from EA, an indie road trip hit from last year, and more. Summer sales have made NVIDIA's gaming service cheaper, and it has added support for seven new titles. That said, here are some more stories from the gaming world: Rockstar gives last-gen GTA V players free upgrades tomorrow Major Xbox layoffs may claim South of Midnight developer Compulsion entirely Steam Next Fest returns with thousands of new demos to try out Forza Horizon 6 gets another hotfix for one of the game's online modes Major Xbox layoffs may claim South of Midnight developer Compulsion entirely From the review corner This week, Steven got his hands on the Creative Sound Blaster AE-X internal PCIe sound card, primarily intended for headphone wearers. In the list of pros, it comes with a high-quality headphone amp, low-latency communication enhancements via ASIO v2.3, offers 256-times the audio quality of CDs via DSD256, and has great build quality. On the other hand, it's a bit on the pricier side, only offers stereo output over speakers, and has no EMI shielding. More price drops! We got you covered with some hot tech deals all week. For some reason, if you missed out on a great discount, here is a summary of some recent deals that are still alive: GEEKOM X16 Pro at GEEKOM - $1,119.67 (17% off) Acer 4K Webcam for PC/Mac with All-Metal Unibody Sculpted - $59.99 (14% off) Samsung 990 PRO SSD 2TB - $369.99 (42% off) Nothing Ear Wireless Earbuds Bluetooth - $73.15 (51% off) PowerColor Reaper AMD Radeon RX 9070 16GB - $579.99 (17% off) To view all of our recent deals, click here. So, these were some of the biggest tech news and other updates from this week. There will be more issues of our 7 Days series in the coming weeks and months, so stay tuned. You can also support Neowin by registering for a free member account or subscribing to extra member benefits, along with an ad-free tier option. Have a great weekend!
    • It certainly is a waste of time clicking it if you're not interested in Windows 11's development. If that were the case for you, you could easily ignore the headline and move on given the headline makes it clear that's what the article is about. Instead, you're contradicting yourself here calling it a waste of time yet clicking on the headline and commenting... If it were a totally different topic being presented than what's stated in the headline, then you'd certainly have a point, 'cause that's totally deceptive and unavoidable if not actually interested. However here, you can totally avoid it if you're truly not interested.
    • No, it did not work. I did not read the article. I saw the title in my Feedly feed and came to continue putting pressure about such titles on a website I used to love. In fact, based on your reply, it seems you think it's fine to visit click bait title articles to find out what it's about, to waste people's time. That's up to you, mate. I remember when news websites had pride in their content and therefore didn't need to resort to cheap tactics.
    • Nothing misleading nor deceptive about it, just sensationalized and catchy to grab reader's attention, and it's clearly working...
  • Recent Achievements

    • Dedicated
      Almohandis earned a badge
      Dedicated
    • Dedicated
      JuvenileDelinquent earned a badge
      Dedicated
    • First Post
      DrWankel earned a badge
      First Post
    • Reacting Well
      DrWankel earned a badge
      Reacting Well
    • Week One Done
      Supreme Spray LV earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      505
    2. 2
      +Edouard
      174
    3. 3
      PsYcHoKiLLa
      83
    4. 4
      Michael Scrip
      76
    5. 5
      Steven P.
      75
  • Tell a friend

    Love Neowin? Tell a friend!