Category Archives: Troubleshooting

SetupDiag.exe Unveils Upgrade Gotchas

If you read this blog, you already know I finally got my Lenovo X380 Yoga upgraded to 21313 earlier this week. I’d been fighting a bugcheck error for the two prior Dev Channel upgrades before that. Along the way, I found myself  looking for diagnositic info about the failed upgrade.  A Microsoft tool SetupDiag.exe unveils upgrade gotchas, so I started using it. With this post, I want to shed more light on this nice little tool, based on recent experience.

How SetupDiag.exe Unveils Upgrade Gotchas

The program is a log analysis tool that focuses on Windows Setup log files. As the MS Docs page for SetupDiag says:

It attempts to parse these log files to determine the root cause of a failure to update or upgrade the computer to Windows 10. SetupDiag can be run on the computer that failed to update, or you can export logs from the computer to another location and run SetupDiag in offline mode.

That latter offline capability is nice, because it means you can boot an otherwise unbootable machine using rescue media. Once booted, you can then suck the files you need from the problem PC and analyze them on a working machine instead.

Note 1: consider bookmarking the already-quoted MS Docs page. It includes an always-current download link to the latest SetupDiag.exe version. (V160 is current as of Feb 17, 2021 only.)

Note 2: SetupDiag.exe requires .NET Framework 4.6 (or newer). See this WindowsCentral story for multiple .NETversion check methods  in PowerShell (3) or Cmd.exe (1).

Working with SetupDiag.exe

Starting with Windows 10 2004, SetupDiag.exe is included with Windows Setup on Windows 10 ISOs and other install images. Paraphrasing the MS Docs item, it says:

During the upgrade process, Windows Setup extracts its sources files to a directory named %SystemDrive%$Windows.~bt\Sources . With Windows 10, version 2004 and later, setupdiag.exe is also installed to this directory. If there is an issue with the upgrade, SetupDiag will automatically run to determine the cause of the failure.

Thus, so long as you don’t clean up after an attempted upgrade, you’ll find SetupDiag.exe in the afore-cited directory. Grab a copy and put it somewhere else, if you’d like.

Simply search your PC for SetupDiag.exe. Once found, you can run the program from Explorer, in PowerShell, at the Command Prompt, or via the run command.

Reading the Results

SetupDiag.exe writes its results in a file named SetupDiagResults.log. By default, it appeared in my download folder
(C:\Users\<uname>\Downloads).
I found it easily, because I use Voidtools Everything to locate files on my behalf. It’s how I got the details on my bugcheck error code. It reads 0X0000000A therein, but may appear as 0XA in discussions online. When I got the GSOD the error identified itself in the report window as IRQ_NOT_LESS_OR_EQUAL…

The lead-in graphic for this story shows the log file. The area of interest starts mid-way down in a line that reads: “Found crash information in rollback log.” That’s where the bugcheck code appears. Also, “nt” appears as the responsible driver. This, alas, is a built-in OS driver. Mere users cannot uninstall or update it. (That’s a Microsoft internal thing dontcha know?) It’s what convinced me that waiting for an upgrade from MS was the ultimate (and only) fix avaialble.

 

Facebooklinkedin
Facebooklinkedin

DISM Trumps SFC To Fix Hung Execution

Here’s an interesting observation straight from TenForums. Occasionally, the System File Checker (SFC) will hang when run. That is, it will grind forward to some percentage of completion, and then sit there indefinitely, making no further progress. If that happens to you on a Windows 10 PC, it’s OK to terminate the process (enter Ctrl-C at the command line or in PowerShell). In such cases, DISM trumps SFC to fix hung execution. Let me explain…

How DISM Trumps SFC to Fix Hung Execution

To unpack my assertion, please understand that when SFC finds an error it cannot fix, it more or less stops where it is. The Deployment Image Servicing and Management tool, aka DISM, can replace the files in Winodws 10’s cross-linked code repository WinSxS. By doing so, it will often fix the errors that SFC cannot surmount successfully.

The syntax for the specific DISM incantation is most often:

DISM /online /cleanup-image /restorehealth

Other variations for offline images, or that use something other than local files already known to Windows 10 are documented at MS Docs. There you’ll find a helpful article entitled “Repair a Windows Image” that take you through various elaborations that may sometimes prove necessary. Using the Source: attribute can get particularly interesting, especially if you’re working from a WIM or ESD file that is home to two or more Windows images.

If SFC Hangs, DISM /RestoreHealth Often Sets Things Right

As it did for the person who posted about SFC difficulties at TenForums, this approach will often (but not always) make things right. You can’t know until you try. But the thing to remember is that if SFC hangs or fails, your next step should be to try this specific DISM command.

In my personal experience, this has fixed half or more of such issues when they’ve come up. If the odds come up as they should, this approach will also work for you. Try it, and see!

[Note Added Feb 16 afternoon]:
Go Ahead: Skip SFC, Run DISM First

Members of the Insider Team responding to this post informed me that “On Win10 it’s recommended to run DISM first.” This is explained in an MS Support Note entitled “Use the System File Checker tool to repair missing or corrupted system files.” And sure enough, in reading over that article it informs readers “If you are running Windows 10 … first run the inbox Deployment Image Servicing and Management (DISM) tool prior to running the System File Checker.” I’m not sure what “inbox” means in this context, but the order is clear and unmistakable: DISM first, SFC second.

I’ve been following typical advice from TenForums and conventional wisdom for so long, I neglected to read up on SFC in putting this story together. Live and learn: now I know to reverse the order and run DISM first. Hope this helps others, too!

Facebooklinkedin
Facebooklinkedin

Untangling Cascading Troubles Gets Frustrating

I’ve been trying to untangle a weird mix of networking and telephony issues going on three days now. As I write this item, in fact, I’m texting with a Verizon tech support person. He’s trying to unsnarl a mix-up around a new 5G MiFi hotspot  I purchased recently. When the device was set up, it was mistakenly tied to my son’s cellphone number. Then, the tech support people tried to switch things around. Alas, they exceeded the allowable number of reset attempts. This requires a 24 hour wait before a retry is allowed. The 24 hours are up, and I’m trying again. Does this explain why untangling cascading troubles gets frustrating?

How Untangling Cascading Troubles Gets Frustrating

Let me count the ways.

  1. Verizon Tech Coaches can’t call my cellphone. It doesn’t ring because of a setting that’s available only in iOS 13 or higher. My iPhone is running 12.5. So I had to work through amazing contortions to get them to call my landline.
  2. The MiFi device hadn’t been working properly. Thus, I wasn’t able to activate it myself. First I learned how to pop the back off the device. Then, I did the old “paper clip in the recessed reset switch” routine to return it to factory settings. After that the UI worked just fine.
  3. As an iOS guy I found myself messing with Gregory’s Android OnePlus 7 Pro. This had me remembering and relearning all kinds of interesting stuff. I’m now more familiar with its UI, device settings and config data . I also now remember what’s up with ICCID and IMEI identifiers.
  4. When my tech support person tried to reset the accounts properly, the provisioning software let him make the changes, then came back and told him “transaction disallowed.” He’s now roping higher level support team members in to reset database rules to make this happen.
  5. The way I got into this snafu to begin with is that my Spectrum Internet connection won’t pass Remote Desktop Protocol through its firewall. When I attempted the necessary port forwarding operations, the device proved unable or unwilling to read the external (WAN or rather cable side) IP address, even though I can see it just fine (and Ping it) from my LAN PC. That led me to say “I can use my MiFi 5G hotspot instead” and started me down the rabbit hole.

So here we are solving problems we didn’t know we had, and dealing with mixups based on pure human frailty.

Tech Support Needs Unified Communications, Badly!

The most amazing thing I’ve learned is that at least two separate tech support operations at Verizon are inappropriately silo’ed. Their Tech Coach operation cannot place voice calls. They are restricted to online chat only. I made the mistake of initiating contact with them on my cellphone, and they couldn’t easily switch over to a PC session, either. I did figure out how to make that happen later on, though so online via cell and via PC do have some integration.

But their app is limited to calling only registered Verizon devices. So when I tried to have them call my cell early on for a voice session, I found myself in a Catch-22. I wanted them to call me, they called me, but my only acceptable target device wouldn’t allow that call to ring in (that’s the iOS setting for version 13 and up, which is turned on and immutable for 12 and under versions and so can’t be accessed or changed on my aging iPhone 6).

At this point it’s taken me over 7 hours to solve a set of problems that are only tangential to the real problem I want to solve with accessing a public IP using Remote Desktop. I’ll get to that and another series of tech support calls with Spectrum next week.

Take a Deep Breath, and Keep Waiting

But I’m learning how to keep calm and carry on in the face of massive frustration. I suppose I should be glad that I’m not the human responsible for the error that triggered this cascade. Lord knows I have been the guilty party often enough myself to write about it regularly in this very blog!

But Wait: There’s More

Yesterday when I wanted to blog about this situation, my ISP’s behind-the-scenes MySQL WordPress server went down. Thus, I was unable to access or post anything until that got fixed. The error cascade is apparently catching, so perhaps you shouldn’t have read this far. Brace yourself!

Facebooklinkedin
Facebooklinkedin

Remembering Santayana’s Dictum Win10-Wise

I learned this one as “Those who fail to learn from history are doomed to repeat it.” Turns out that upon checking Santayana’s aphorism, it’s actually “Those who don’t know history are destined to repeat it.”  But when it comes to remembering Santayana’s dictum Win10-wise, I was forced to re-learn an important lesson today. Let me explain…

What Remembering Santayana’s Dictum Win10-Wise Means

A funny thing happened to me today: I installed KB4598291 but it didn’t show up in Update History nor in its Control Panel counterpart under Programs and Feaures. Why was this? Because I’d wandered off the update track to force my test PC ahead to 19043.XXX builds using a series of linked DISM statements. Sigh.

Today, I learned why that’s a BAD IDEA. When I realized that something was amiss, I learned that things were further out of whack than I’d dreamed possible. The hack meant that I could no longer use the tried-and-true “in-place upgrade repair install” technique to return my test PC to some semblance of normality.

That Key Doesn’t Work. Try Another…

I used UUPdump.ml to build a customized install ISO for 19042.789. But when I tried to run same on my “unofficial” 19043.782 machine, the installer asked for a Windows 10 key before it would proceed. None of the following worked:

  1. The generic Windows 10 Pro key
  2. The actual key for the current install, as elicited by Showkey Plus
  3. A still active MAK key for Windows 10 Pro I purchased from Crayon, Inc. in 2018

Ouch! I was in trouble. Fortunately, i was able to restore a backup from a time when this test PC was still on the regular Beta/Release Preview build track. Once I’d done that, I was able to catch up and bring the PC up to build 19042.789, as shown in the lead-in graphic for this story.

The Moral of the Story

I’d been warned by friends and colleagues that wandering off the usual Insider Preview track is OK for experiments, but not for ongoing use. Now I know why: once you hit the next Cumulative Update (as I did today) the off-track releases will get weird in a hurry. My advice: learn from my mistake, and don’t go there, unless it’s on a throwaway VM. I now understand that’s how I should have played that, too. Live and learn!

 

Facebooklinkedin
Facebooklinkedin

X380 Yoga 21301 Installation Issues

I’ve been struggling since last Thursday to get the latest Fast Ring version — namely, 21301.1000 — installed.  That’s right, I’ve got “interesting” X380 Yoga 21301 installation issues running hot and cold right now. So far I’ve seen at least 4 different error codes, all of which hit at about the 48% mark after the first reboot. I call this the “post-GUI” phase of Windows 10 installation, because it occurs after the WinPE environment takes over the install process following that first reboot.

Diagnosing X380 Yoga 21301 Installation Issues

I’ve just confirmed that these issues persist in the latest CU 21301.1010,  as well as in 21301.1000. I’ve been using the MS tool setupdiag.exe to get to the bottom of things. But because it finds the NT driver as the culprit for the IRQL_NOT_LESS_OR_
EQUAL and the bugcheck 0X0A error, that puts the onus on MS to fix something beyond my control. You can see this in the setupdiag output in the lead-in graphic for this story.

I can tackle and fix lots of Windows 10 drivers. But as I understand it when the NT driver (shows up as lowercase nt in the screencap) is mentioned, it’s general indicator. According to dbgtech.net, “the error might be caused by a device driver, a system service, a virus scanner, or a backup tool that is incompatible with the new version.”

Coming Up Dry Is No Fun at All

I’m running Defender on this PC so I’m pretty sure it’s not involved. I’ve stripped my services down to the bare minimum. Macrium Reflect is my backup too (and still working on the X220 Tablet that has managed both of these recent updates/upgrades). The same device drivers work on 19042.746 on my other nearly-identical X380 Yoga PC (only difference: Toshiba SSD vs. Samsung).

I’m still looking for enlightenment, but not finding any. Last time something like this happened, I just had to wait for a new Fast Ring/Dev Channel release, and it installed just fine. Here’s hoping!

[Note Added Feb 12] 21313 Brings Success!

I’d been contacted by a member of the Windows Insiders team as a result of sharing a link to this post on the Windows Insider MVP Yammer community. I was informed that a future Dev Channel release would fix my problem. As I learned earlier this afternoon, 21313 installed without difficulties. Seems that this PC got bit by a known bugcheck error.  It’s the first item on the Fixes list in the 21313 release notes. This has been a known issue for some time, and is apparently now fixed. Woo hoo!

Facebooklinkedin
Facebooklinkedin

UFD Failure Presents Strange Symptoms

I had one of my 16 GB Mushkin Atom USB Flash Drives (UFDs) fail on me this weekend. Alas, it happened in the middle of a boot-into-restore operation on my Lenovo X220 Tablet.  Because I didn’t think I’d built Rescue Media, I stuck the UFD into the machine while that process was underway. After the restore ended,  because that very same UFD failure presents strange symptoms I blamed Reflect. Wrong!

When UFD Failure Presents Strange Symptoms, Then What?

As is my usual practice when a device presents odd behaviors or symptoms, I go into diagnostics mode. When I dug into the drive using MiniTool Partition Magic (MTPW), I could see 5 NTFS partitions on that device. Each was a miniscule 3.8 MB in size. But no set of contortions would return that device to operation. Diskpart didn’t do it at the command line, nor was MTPW able to return it to working order. When I inserted it into Disk Management, I got the ultimate judgement on its condition shown in this story’s lead-in graphic: “Bad Disk.” That seemed to sum things up pretty nicely.

This is the second UFD I’ve had fail on me in the past 5 years or so. I just counted 28 of them here in my office, in sizes ranging from 8 GB to 128 GB. I use them all the time. The smaller ones are usually bootable with OS images, rescue media, or repair tools. The larger ones act primarily as portable storage for project work when I go on the road. And apparently, they do fail from time to time.

Macrium Reflect Forum Sets Things Straight

I hope I can be forgiven for initially wanting to blame Reflect for trashing the UFD. It did go south on me in the middle of a Macrium operation, after all. Then, I learned more about how Rescue Media works, courtesy of MR forum regulars “Froggie” and “jphughan.” Now, I am inclined to agree with their analysis that the UFD’s failure was coincidental.

Let me explain: it seems that when invoked using the “boot to restore” operation, jphughan told me “the WIM file inside the Rescue Media cached build folder — but that is a folder on (by default) your C partition.”  Given that member jphughan has 8.5K posts on the forums and has reached “Macrium Evangelist” level, I’m inclined to believe he knows what he’s talking about.

And in fact, I saw my system go into Recovery from the usual boot drive (a Plextor SSD) on that PC. Turns out that there’s a sub-older inside C:\Boot that’s named Macrium. It in turn has folders for the drivers it needs, various Windows 10 Assessment and Deployment Kit elements (aka WA10Files) folder, where the all-important boot.wim file for the WinRE version that Macrium uses to boot its Rescue Media resides.

Given that the UFD doesn’t function properly, but the system not only booted and ran its restore, this is the only way to explain how that process occurred. Thus, I concur with my informants from the Macrium Forums that (a) restore ran from the C: drive and (b) the UFD was either dead or died somewhere during the reboot process that proceeded just fine without its help or involvement.

Just goes to show that coincidence is a powerful force, but one that can be reasoned past when needs must.

Facebooklinkedin
Facebooklinkedin

Relearning X220 Tablet Macrium Restore Takes Time

I spent most of yesterday afternoon, and  a fair chunk of the evening, working on an article about repairing damaged, unresponsive or misbehaving MS Office installs. Naturally, I used a test machine for this project. Thus, I could do potentially horrible things to one machine, while writing about them on another. I backed up the old (2012) Lenovo X220 Tablet using Macrium Reflect before starting. That meant I could later restore my pristine OS and Office environment once playtime ended. This morning, I realized relearning X220 Tablet Macrium Restore takes time. Over an hour, in fact, when all was said and done.

Why Relearning X220 Tablet Macrium Restore Takes Time

Two reasons. First, the X220 Tablet is old enough that 300 Mbps is as fast as it can transfer data disk-to-disk. This is true, even when both disks are SSDs. One’s a Plextor mSATA 256GB PX6 SSD, the other is an ancient OCZ Vertex-3 128 GB SSD. The backup only took 8 minutes to lay down. But because a reboot required booting into WindowsPE, then into Macrium’s runtime, then restoring said backup, that part took over 30 minutes to complete.

The second reason falls rather more under the heading of “operator error,” subclass “I didn’t know Reflect could do that!” Let me explain. When I went to run the restore this time, Reflect asked me if I wanted to boot right into its bootable recovery media, ready to run the restore I’d just requested.

Silly me: I said “Yes!” That meant I needed to add the Macrium Recovery entry to my boot menu, build a Macrium Recovery partition, and wait for all that processing to finish before the machine could reboot and run the restore. That took another 15-20 minutes.

Good News, Bad News

I didn’t understand that Reflect would do this on my boot/system disk. The lead-in graphic for this story shows that my C drive layout now sports an 837MB Recovery Partition at the end of the sequence. Thus, the reboot worked after I removed the 8 GB UFD I’d inserted into the X220 Tablet, thinking I needed to build external WinRE media. The restore proceeded to a successful finish after that. That’s the good news.

The bad news is, the software ate my 8GB Mushkin UFD. It now shows up in diskmgmt.msc as “No media” with 0 Bytes capacity. When I tried to reformat it on another PC, I got an error message saying the UFD malfunctioned and could not be mounted. I’ll be sharing this experience on the Macrium forums, but I’m surprised that the program was allowed to (apparently) eat my flash drive. It won’t respond to low-level format commands at the command line, either. (Diskpart reports “an I/O device error.” I think this one is beyond repair.) Weird.

It’s no great loss (the device cost under US$10). But it still shouldn’t happen. I hope to follow up when I learn more. Stay tuned!

Facebooklinkedin
Facebooklinkedin

Using Windows 10 Generic Keys

Sometimes, a Windows 10 PC requires a clean install. It might be because of disk failure or corruption, malware infestation, or any of a host of other good reasons. As long as Microsoft’s Activation servers (or your own KMS) recognize that PC, you needn’t worry about finding or obtaining a valid OS key. Instead, if prompted to supply a key during the install process, you can furnish a published generic key for your chosen Windows version. Using Windows 10 generic keys is perfectly OK, as long as MS already knows you have a valid license.

When Using Windows 10 Generic Keys, Use These!

You can find generic Windows 10 keys in many places with a simple search. I like the list at TenForums, because it’s simple and comprehensive. It also comes in the context of a peachy list of tutorials that explain how and when to use keys correctly. The lead-in graphic for this story is a snippet from its generic key table. That tutorial is named List of Generic Product Keys to Install Windows 10 Editions. Worth bookmarking, it tells you (or points you at) nearly everything you need to know about working with generic keys.

Note: KMS stands for Key Management Server, a Windows Server role that plays out in many enterprise or campus environments. That’s because those kinds of outfits usually work from volume licenses for Windows, and manage their own Windows keys for themselves. None of the Home editions have generic KMS keys because Home is not covered under volume Windows 10 license agreements.

What if a Generic Key Has No Valid Matching License?

You can use a generic key to install Windows even if there’s no matching license in the Microsoft Validation servers. But that installation will not activate unless you provide a valid key within 30 days of the installation date. After that, the product works only with limited features and personalization. It also warns you you’re in violation of license terms, which leaves you liable for unlicensed use of software. Those can result in potential fines and penalties if you’re found guilty of license fraud or misuse. Trust me: you don’t want to go there!

 

Facebooklinkedin
Facebooklinkedin

Exorcizing Zombie Adobe Flash Player Elements

Some Windows 10 users may see a Flash Info logo show up on their desktops. Don’t worry: that’s Adobe’s way of telling you the Flash Player remains active on your PC, and needs to be removed.  I wrote about Flash end-of-life (EOL) and removal techniques on December 29. That story reported the EOL date falling at year’s end. Apparently not everybody has worked through its various uninstall possibilities yet, either.  The TenForums thread “Strange Logo on Desktop” turns out to be an admonition from Adobe to make Flash Player go away. Alas, the process doesn’t work 100%. Thus, I’ll explain how one goes about exorcizing zombie Adobe Flash Player elements.

Exorcizing Zombie Adobe Flash Player Elements.flash-info-logo

Here’s what the Flash Info log looks like: a faded Flash logo with the “i” (information) element superimposed.

Several Flash Player Uninstall Options Available

Flash shows up in lots of places, apparently. Likewise, uninstalling it requires a variety of removal techniques.  Adobe’s warning for its Flash Player Uninstaller hints at this. It reads: “These instructions are NOT applicable to Flash Player included with Microsoft Edge or Internet Explorer on Windows 8 and later or with Google Chrome…” It advises those users to check out the Flash Player Help page for disabling same.

There’s also an uninstaller available via the Microsoft Update Catalog. Counter-intuitively KB4577586 is named “Update for Removal of Adobe Flash Player.” When downloading this item, be sure to grab the one that matches your current Windows version. Note: apparently, there is no such update for Windows 10 Version 20H2.

If Adobe Flash Player shows up in Programs and Features, you can use its built-in uninstall functions to get rid of it. Or you could turn to a third-party product like Revo Uninstaller to do the job instead.

Exorcizing Zombie Adobe Flash Player Elements May Require Manual Efforts

After running the afore-linked KB4577586, the original poster for the TenForums thread that prompted this story reports that the icon remained on his desktop. On top of everything else on screen, it wouldn’t get out of his way. Should that happen, one can remove the Macromed folder and its contents from these two parent folders:

1. C:\Windows\System32
2. C:\Windows\SysWOW64

Savvy readers will recognize that these folders are where Windows keeps 32-bit elements, tools and utilities for use on 32- and 64-bit systems, respectively. You may need to run a special-purpose delete utility to remove these folders or you can boot into command line recovery mode and delete them that way. Your choice. Either way, that should result in exorcizing zombie Adobe Flash elements that may still be hanging around your system. Et voila!

Facebooklinkedin
Facebooklinkedin

Restoring Missing 21292 N&I Taskbar Item

Here’s an interesting learning adventure. Upon introducing Windows 10 Build 21286, MS also introduced a News and Interests (N&I) taskbar item. I covered this topic on January 8. But after upgrading my Lenovo X220 Tablet to a newer Dev Channel release, N&I disappeared. Remembering a related WinAero.com story, I followed its activation advice. And that, dear readers, is how I found myself restoring missing 21292 N&I taskbar item a few minutes ago. Here’s the deal…

Going About Restoring Missing 21292 N&I Taskbar Item

Restoring or activating N&I requires the third-party ViVe tool. Helpfully, it can enable or disable Windows 10 A/B and hidden features. Download ViVe from Github, where the latest release is v0.2.1. For myself, I just observed that v0.2.0 also works. That’s because  I just used it successfully on my X220T, not yet realizing a newer release is available.

After you download the ZIP file, extract it into a folder. Next, run an administrative cmd or PowerShell session from that folder. Then, execute the following sequence of commands:


vivetool addconfig 29947361 2
vivetool addconfig 27833282 2
vivetool addconfig 27368843 2
vivetool addconfig 28247353 2
vivetool addconfig 27371092 2
vivetool addconfig 27371152 2
vivetool addconfig 30803283 2
vivetool addconfig 30213886 2

Note: If using PowerShell, prepend the string “.\” before each command or it won’t work.

Cut’n’paste these commands into the window. Please execute each one individually. Next, you’ll need to restart your PC. Voila! The N&I item reappears in the Taskbar. At least, it did on my X220T PC.

8 Commands Too Much? Try Some Batch Files

OTOH, if you prefer, WinAero offers a ZIP file in its story. It  activates all necessary settings from one batch file, and deactivates them from another.

And remember, N&I only appears in Build 21286 or higher-numbered Dev Channel Insider Preview releases at the moment.

More About the ViVe Developers

Note: the authors of ViVe are Rafael Rivera and somebody named Lucas/thebookisclosed/albacore. Both are active Windows developers and toolsmiths. Rivera is also an occasional contributor to Thurrott.com (which is where I first came across him and his work). The other person is also the author of the excellent Managed Disk Cleanup utility, also available on GitHub.

Facebooklinkedin
Facebooklinkedin