Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ionescu007/SimpleVisor.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ionescu <ionescu007@users.noreply.github.com>2016-03-17 17:44:17 +0300
committerAlex Ionescu <ionescu007@users.noreply.github.com>2016-03-17 17:44:17 +0300
commitac613aafe98781d6d0d594ababd885ea83bbfb7a (patch)
tree5f92f38c3c848d64357b5d0383831b17562d2cc2
parentaed3502f8d27d0eacd3ce232ecc1bde75b83f6b4 (diff)
Create gh-pages branch via GitHub
-rw-r--r--index.html34
-rw-r--r--params.json4
2 files changed, 30 insertions, 8 deletions
diff --git a/index.html b/index.html
index 9b1cb30..72eade8 100644
--- a/index.html
+++ b/index.html
@@ -4,7 +4,7 @@
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="chrome=1">
- <meta name="description" content="Simplevisor : A simple, Intel x64 Windows-specific Hypervisor with two specific goals: the least amount of assembly code (10 lines), and the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking. ">
+ <meta name="description" content="Simplevisor : SimpleVisor is a simple, Intel x64 Windows-specific hypervisor with two specific goals: using the least amount of assembly code (10 lines), and having the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking (that is, virtualizing the host state from within the host).">
<link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
@@ -19,7 +19,7 @@
<a id="forkme_banner" href="https://github.com/ionescu007/SimpleVisor">View on GitHub</a>
<h1 id="project_title">Simplevisor</h1>
- <h2 id="project_tagline">A simple, Intel x64 Windows-specific Hypervisor with two specific goals: the least amount of assembly code (10 lines), and the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking. </h2>
+ <h2 id="project_tagline"> SimpleVisor is a simple, Intel x64 Windows-specific hypervisor with two specific goals: using the least amount of assembly code (10 lines), and having the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking (that is, virtualizing the host state from within the host).</h2>
<section id="downloads">
<a class="zip_download_link" href="https://github.com/ionescu007/SimpleVisor/zipball/master">Download this project as a .zip file</a>
@@ -34,8 +34,13 @@
<h2>
<a id="introduction" class="anchor" href="#introduction" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Introduction</h2>
-<p>SimpleVisor can be built with any recent copy of Visual Studio 2015. Other compilers have not been tested and are not supported.
-It has currently been tested on the following platforms succesfully:</p>
+<p>Have you always been curious on how to build a hypervisor? Has Intel's documentation (the many hundreds of pages) gotten you down? Have the samples you've found online just made things more confusing, or required weeks of reading through dozens of thousands of lines and code? If so, SimpleVisor might be the project for you.</p>
+
+<p>Not counting the exhaustive comments which explain every single line of code, and specific Windows-related or Intel-related idiosyncracies, SimpleVisor clocks in at about 500 lines of C code, and 10 lines of x64 assembly code, all while containing the ability to run on every recent version of 64-bit Windows, and supporting dynamic load/unload at runtime.</p>
+
+<p>SimpleVisor can be built with any recent copy of Visual Studio 2015, and while older compilers have not been tested and are not supported, it's likely that they can build the project as well. It's important, however, to keep the various compiler and linker settings as you see them, however.</p>
+
+<p>SimpleVisor has currently been tested on the following platforms succesfully:</p>
<ul>
<li>Windows 8.1 on a Haswell Processor</li>
@@ -43,7 +48,9 @@ It has currently been tested on the following platforms succesfully:</p>
<li>Windows 10 Threshold 2 on a Skylake Processor</li>
</ul>
-<p>Note that x86 versions of Windows are expressly not supported, nor are processors earlier than the Nehalem microarchitecture.</p>
+<p>At this time, it has not been tested on any Virtual Machine, but barring any bugs in the implementations of either Bochs or VMWare, there's no reason why SimpleVisor could not run in those environments as well. However, if your machine is already running under a hypervisor such as Hyper-V or Xen, SimpleVisor will not load.</p>
+
+<p>Keep in mind that x86 versions of Windows are expressly not supported, nor are processors earlier than the Nehalem microarchitecture.</p>
<h2>
<a id="motivation" class="anchor" href="#motivation" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Motivation</h2>
@@ -67,10 +74,20 @@ It has currently been tested on the following platforms succesfully:</p>
<p>Another implied goal was to support the very latest in hardware features, as even <a href="https://github.com/svn2github/bochs">Bochs</a> doesn't always have the very-latest Intel VMX instructions and/or definitions. These are often found in header files such as "vmcs.h" and "vmx.h" that various projects have at various levels of definition. For example, Xen master has some unreleased VM Exit reasons, but not certain released ones, which Bochs does have, albeit it doesn't have the unreleased ones!</p>
+<p>Finally, SimpleVisor is meant to be an educational tool -- it has exhaustive comments explaining all logic behind each line of code, and specific Windows or Intel VMX tips and tricks that allow it to achieve its desired outcome. Various bugs or poorly documented behaviors are called out explicitly.</p>
+
<h2>
<a id="installation" class="anchor" href="#installation" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Installation</h2>
-<p>You can setup the required entries for SimpleVisor in the registry with the following command:</p>
+<p>Because x64 Windows requires all drivers to be signed, you must testsign the SimpleVisor binary. The Visual Studio project file can be setup to do so by using the "Driver Signing" options and enabling "Test Sign" with your own certificate. From the UI, you can also generate your own.</p>
+
+<p>Secondly, you must enable Test Signing Mode on your machine. To do so, first boot into UEFI to turn off "Secure Boot", otherwise Test Signing mode cannot be enabled. Alternatively, if you possess a valid KMCS certificate, you may "Production Sign" the driver to avoid this requirement.</p>
+
+<p>To setup Test Signing Mode, you can use the folowing command:</p>
+
+<p><code>bcdedit /set testsigning on</code></p>
+
+<p>After a reboot, you can then setup the required Service Control Manager entries for SimpleVisor in the registry with the following command:</p>
<p><code>sc create simplevisor type= kernel binPath= "&lt;PATH_TO_SIMPLEVISOR.SYS&gt;"</code></p>
@@ -100,6 +117,11 @@ It has currently been tested on the following platforms succesfully:</p>
<p><a href="https://github.com/tandasat/HyperPlatform">https://github.com/tandasat/HyperPlatform</a></p>
<h2>
+<a id="caveats" class="anchor" href="#caveats" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Caveats</h2>
+
+<p>SimpleVisor is designed to minimize code size and complexity -- this does come at a cost of robustness. For example, even though many VMX operations performed by SimpleVisor "should" never fail, there are always unknown reasons, such as memory corruption, CPU errata, invalid host OS state, and potential bugs, which can cause certain operations to fail. For truly robust, commercial-grade software, these possibilities must be taken into account, and error handling, exception handling, and checks must be added to support them. Additionally, the vast array of BIOSes out there, and different CPU and chipset iterations, can each have specific incompatibilities or work-arounds that must be checked for. <strong><em>SimpleVisor does not do any such error checking, validation, and exception handling. It is not robust software designed for production use, but rather a reference code base</em></strong>.</p>
+
+<h2>
<a id="license" class="anchor" href="#license" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>License</h2>
<pre><code>Copyright 2016 Alex Ionescu. All rights reserved.
diff --git a/params.json b/params.json
index 37bec59..d8171df 100644
--- a/params.json
+++ b/params.json
@@ -1,7 +1,7 @@
{
"name": "Simplevisor",
- "tagline": "A simple, Intel x64 Windows-specific Hypervisor with two specific goals: the least amount of assembly code (10 lines), and the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking. ",
- "body": "## Introduction\r\n\r\nSimpleVisor can be built with any recent copy of Visual Studio 2015. Other compilers have not been tested and are not supported.\r\nIt has currently been tested on the following platforms succesfully:\r\n\r\n* Windows 8.1 on a Haswell Processor\r\n* Windows 10 Redstone 1 on a Sandy Bridge Processor\r\n* Windows 10 Threshold 2 on a Skylake Processor\r\n\r\nNote that x86 versions of Windows are expressly not supported, nor are processors earlier than the Nehalem microarchitecture.\r\n\r\n## Motivation\r\n\r\nToo many hypervisor projects out there are either extremely complicated ([Xen][1], KVM, VirtualBox) and/or closed-source (VMware, Hyper-V), as well as heavily focused toward Linux-based development or system. Additionally, most (other than Hyper-V) of them are expressly built for the purpose of enabling the execution of virtual machines, and not the virtualization of a live, running system, in order to perform introspection or other security-related tasks on it.\r\n\r\nA few projects do stand out from the fold however, such as the original [Blue Pill][2] from Johanna, or projects such as [VirtDbg][3] and [HyperDbg][4]. Unfortunately, most of these have become quite old by now, and some only function on x86 processors, and don't support newer operating systems such as Windows 10.\r\n\r\nThe closest project that actually delivers a Windows-centric, modern, and supported hypervisor is [HyperPlatform][5], and the author strongly recommends its use as a starting place for commercial and/or production-worthy hypervisor development. However, in attempting to create a generic \"platform\" that can be productized, HyperPlatform also suffers from a bit of bloat, making it harder to understand what truly are the basic needs of a hypervisor, and how to initialize one.\r\n\r\nThe express goal of this project, as stated above, was to minimize code in any way possible, without causing negative side-effects, and focusing on the 'bare-metal' needs. This includes:\r\n\r\n* Minimizing use of assembly code. If it weren't for the lack of an __lgdt intrinsic, and a workaround for the behavior of a Windows API, only the first 4 instructions of the hypervisor's entry point would require assembly. As it stands, the project has a total of 10 instructions, spread throughout 3 functions. This is a maassive departure from other hypervisor projects, which often have multiple hundreds of line of assembly code. A variety of Windows-specific and compiler-specific tricks are used to achieve this, which will be described in the source code.\r\n* Reducing checks for errors which are unlikely to happen. Given a properly configured, and trusted, set of input data, instructions such as vmx_vmwrite and vmx_vmread should never fail, for example.\r\n* Removing support for x86, which complicates matters and causes special handling around 64-bit fields.\r\n* Expressely reducing all possible VM-Exits to only the Intel architecturally defined minimum (CPUID, INVD, VMX Instructions, and XSETBV). This is purposefully done to keep the hypervisor as small as possible, as well as the initialization code.\r\n* No support for VMCALL. Many hypervisors use VMCALL as a way to exit the hypervisor, which requires assembly programming (there is no intrinsic) and additional exit handling. SimpleVisor uses a CPUID trap instead.\r\n* Relying on little-known Windows functions to simplify development of the hypervisor, such as Generic DPCs and hibernation contexts.\r\n\r\nAnother implied goal was to support the very latest in hardware features, as even [Bochs][6] doesn't always have the very-latest Intel VMX instructions and/or definitions. These are often found in header files such as \"vmcs.h\" and \"vmx.h\" that various projects have at various levels of definition. For example, Xen master has some unreleased VM Exit reasons, but not certain released ones, which Bochs does have, albeit it doesn't have the unreleased ones!\r\n\r\n## Installation\r\n\r\nYou can setup the required entries for SimpleVisor in the registry with the following command:\r\n\r\n```sc create simplevisor type= kernel binPath= \"<PATH_TO_SIMPLEVISOR.SYS>\"```\r\n\r\nYou can then launch SimpleVisor with\r\n\r\n```net start simplevisor```\r\n\r\nAnd stop it with\r\n\r\n```net stop simplevisor```\r\n\r\nYou must have administrative rights for usage of any of these commands.\r\n\r\n## References\r\n\r\nhttps://github.com/upring/virtdbg\r\n\r\nhttp://xenbits.xen.org/gitweb/?p=xen.git;a=summary\r\n\r\nhttps://github.com/svn2github/bochs\r\n\r\nhttps://github.com/rmusser01/hyperdbg\r\n\r\nhttp://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip\r\n\r\nhttps://github.com/tandasat/HyperPlatform\r\n\r\n[3]:https://github.com/upring/virtdbg\r\n[1]:http://xenbits.xen.org/gitweb/?p=xen.git;a=summary \"Xen\"\r\n[6]:https://github.com/svn2github/bochs\r\n[4]:https://github.com/rmusser01/hyperdbg\r\n[2]:http://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip\r\n[5]:https://github.com/tandasat/HyperPlatform\r\n\r\n## License\r\n\r\n```\r\nCopyright 2016 Alex Ionescu. All rights reserved. \r\n\r\nRedistribution and use in source and binary forms, with or without modification, are permitted provided\r\nthat the following conditions are met: \r\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and\r\n the following disclaimer. \r\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions\r\n and the following disclaimer in the documentation and/or other materials provided with the \r\n distribution. \r\n\r\nTHIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU\r\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\nThe views and conclusions contained in the software and documentation are those of the authors and\r\nshould not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.\r\n```\r\n",
+ "tagline": " SimpleVisor is a simple, Intel x64 Windows-specific hypervisor with two specific goals: using the least amount of assembly code (10 lines), and having the smallest amount of VMX-related code to support dynamic hyperjacking and unhyperjacking (that is, virtualizing the host state from within the host).",
+ "body": "## Introduction\r\n\r\nHave you always been curious on how to build a hypervisor? Has Intel's documentation (the many hundreds of pages) gotten you down? Have the samples you've found online just made things more confusing, or required weeks of reading through dozens of thousands of lines and code? If so, SimpleVisor might be the project for you.\r\n\r\nNot counting the exhaustive comments which explain every single line of code, and specific Windows-related or Intel-related idiosyncracies, SimpleVisor clocks in at about 500 lines of C code, and 10 lines of x64 assembly code, all while containing the ability to run on every recent version of 64-bit Windows, and supporting dynamic load/unload at runtime.\r\n\r\nSimpleVisor can be built with any recent copy of Visual Studio 2015, and while older compilers have not been tested and are not supported, it's likely that they can build the project as well. It's important, however, to keep the various compiler and linker settings as you see them, however.\r\n\r\nSimpleVisor has currently been tested on the following platforms succesfully:\r\n\r\n* Windows 8.1 on a Haswell Processor\r\n* Windows 10 Redstone 1 on a Sandy Bridge Processor\r\n* Windows 10 Threshold 2 on a Skylake Processor\r\n\r\nAt this time, it has not been tested on any Virtual Machine, but barring any bugs in the implementations of either Bochs or VMWare, there's no reason why SimpleVisor could not run in those environments as well. However, if your machine is already running under a hypervisor such as Hyper-V or Xen, SimpleVisor will not load.\r\n\r\nKeep in mind that x86 versions of Windows are expressly not supported, nor are processors earlier than the Nehalem microarchitecture.\r\n\r\n## Motivation\r\n\r\nToo many hypervisor projects out there are either extremely complicated ([Xen][1], KVM, VirtualBox) and/or closed-source (VMware, Hyper-V), as well as heavily focused toward Linux-based development or system. Additionally, most (other than Hyper-V) of them are expressly built for the purpose of enabling the execution of virtual machines, and not the virtualization of a live, running system, in order to perform introspection or other security-related tasks on it.\r\n\r\nA few projects do stand out from the fold however, such as the original [Blue Pill][2] from Johanna, or projects such as [VirtDbg][3] and [HyperDbg][4]. Unfortunately, most of these have become quite old by now, and some only function on x86 processors, and don't support newer operating systems such as Windows 10.\r\n\r\nThe closest project that actually delivers a Windows-centric, modern, and supported hypervisor is [HyperPlatform][5], and the author strongly recommends its use as a starting place for commercial and/or production-worthy hypervisor development. However, in attempting to create a generic \"platform\" that can be productized, HyperPlatform also suffers from a bit of bloat, making it harder to understand what truly are the basic needs of a hypervisor, and how to initialize one.\r\n\r\nThe express goal of this project, as stated above, was to minimize code in any way possible, without causing negative side-effects, and focusing on the 'bare-metal' needs. This includes:\r\n\r\n* Minimizing use of assembly code. If it weren't for the lack of an __lgdt intrinsic, and a workaround for the behavior of a Windows API, only the first 4 instructions of the hypervisor's entry point would require assembly. As it stands, the project has a total of 10 instructions, spread throughout 3 functions. This is a maassive departure from other hypervisor projects, which often have multiple hundreds of line of assembly code. A variety of Windows-specific and compiler-specific tricks are used to achieve this, which will be described in the source code.\r\n* Reducing checks for errors which are unlikely to happen. Given a properly configured, and trusted, set of input data, instructions such as vmx_vmwrite and vmx_vmread should never fail, for example.\r\n* Removing support for x86, which complicates matters and causes special handling around 64-bit fields.\r\n* Expressely reducing all possible VM-Exits to only the Intel architecturally defined minimum (CPUID, INVD, VMX Instructions, and XSETBV). This is purposefully done to keep the hypervisor as small as possible, as well as the initialization code.\r\n* No support for VMCALL. Many hypervisors use VMCALL as a way to exit the hypervisor, which requires assembly programming (there is no intrinsic) and additional exit handling. SimpleVisor uses a CPUID trap instead.\r\n* Relying on little-known Windows functions to simplify development of the hypervisor, such as Generic DPCs and hibernation contexts.\r\n\r\nAnother implied goal was to support the very latest in hardware features, as even [Bochs][6] doesn't always have the very-latest Intel VMX instructions and/or definitions. These are often found in header files such as \"vmcs.h\" and \"vmx.h\" that various projects have at various levels of definition. For example, Xen master has some unreleased VM Exit reasons, but not certain released ones, which Bochs does have, albeit it doesn't have the unreleased ones!\r\n\r\nFinally, SimpleVisor is meant to be an educational tool -- it has exhaustive comments explaining all logic behind each line of code, and specific Windows or Intel VMX tips and tricks that allow it to achieve its desired outcome. Various bugs or poorly documented behaviors are called out explicitly.\r\n\r\n## Installation\r\n\r\nBecause x64 Windows requires all drivers to be signed, you must testsign the SimpleVisor binary. The Visual Studio project file can be setup to do so by using the \"Driver Signing\" options and enabling \"Test Sign\" with your own certificate. From the UI, you can also generate your own.\r\n\r\nSecondly, you must enable Test Signing Mode on your machine. To do so, first boot into UEFI to turn off \"Secure Boot\", otherwise Test Signing mode cannot be enabled. Alternatively, if you possess a valid KMCS certificate, you may \"Production Sign\" the driver to avoid this requirement.\r\n\r\nTo setup Test Signing Mode, you can use the folowing command:\r\n\r\n```bcdedit /set testsigning on```\r\n\r\nAfter a reboot, you can then setup the required Service Control Manager entries for SimpleVisor in the registry with the following command:\r\n\r\n```sc create simplevisor type= kernel binPath= \"<PATH_TO_SIMPLEVISOR.SYS>\"```\r\n\r\nYou can then launch SimpleVisor with\r\n\r\n```net start simplevisor```\r\n\r\nAnd stop it with\r\n\r\n```net stop simplevisor```\r\n\r\nYou must have administrative rights for usage of any of these commands.\r\n\r\n## References\r\n\r\nhttps://github.com/upring/virtdbg\r\n\r\nhttp://xenbits.xen.org/gitweb/?p=xen.git;a=summary\r\n\r\nhttps://github.com/svn2github/bochs\r\n\r\nhttps://github.com/rmusser01/hyperdbg\r\n\r\nhttp://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip\r\n\r\nhttps://github.com/tandasat/HyperPlatform\r\n\r\n[3]:https://github.com/upring/virtdbg\r\n[1]:http://xenbits.xen.org/gitweb/?p=xen.git;a=summary \"Xen\"\r\n[6]:https://github.com/svn2github/bochs\r\n[4]:https://github.com/rmusser01/hyperdbg\r\n[2]:http://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip\r\n[5]:https://github.com/tandasat/HyperPlatform\r\n\r\n## Caveats\r\n\r\nSimpleVisor is designed to minimize code size and complexity -- this does come at a cost of robustness. For example, even though many VMX operations performed by SimpleVisor \"should\" never fail, there are always unknown reasons, such as memory corruption, CPU errata, invalid host OS state, and potential bugs, which can cause certain operations to fail. For truly robust, commercial-grade software, these possibilities must be taken into account, and error handling, exception handling, and checks must be added to support them. Additionally, the vast array of BIOSes out there, and different CPU and chipset iterations, can each have specific incompatibilities or work-arounds that must be checked for. ***SimpleVisor does not do any such error checking, validation, and exception handling. It is not robust software designed for production use, but rather a reference code base***.\r\n\r\n## License\r\n\r\n```\r\nCopyright 2016 Alex Ionescu. All rights reserved. \r\n\r\nRedistribution and use in source and binary forms, with or without modification, are permitted provided\r\nthat the following conditions are met: \r\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and\r\n the following disclaimer. \r\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions\r\n and the following disclaimer in the documentation and/or other materials provided with the \r\n distribution. \r\n\r\nTHIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU\r\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\nThe views and conclusions contained in the software and documentation are those of the authors and\r\nshould not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.\r\n```\r\n",
"google": "",
"note": "Don't delete this file! It's used internally to help with page regeneration."
} \ No newline at end of file