1.04
  * validWindow() will now accept a nil value but always return false in this case.
  * getFilePath() will no longer return "./" if in the CWD; it will instead return an empty string.
  * Fixed a bug with createThread() that caused passed variables to not be properly forwarded to the thread's function.
  * Fixed a minor bug that kept the keyboard module on the stack after loading.
  * Improved the speed of memoryReadString*() functions by using cached reading.
  * Changed how settings from the config.lua file are handled internally.
  * pixelSearch() now accepts (x2,y2) to be less than (x1,y1) to search from right-to-left and bottom-to-top.
  * pixelSearch() is also much faster.
  * Fixed a bug with setConsoleAttributes() that would cause it to fail in certain instances when switching to a larger buffer.
  * Improved the speed of getHwnd() by combining the "old" and "new" method.
  * Added optional config variable scriptsDirectory to set the default directory to run scripts from.
  * New application icon.
  * Changed the display format of beta revisions to a more standardized system (ie. 1.03.02).
  * Merged sw and priority libs into lib.lua.
  * Moved printf() and sprintf() into cli module.
  * table.contains() will now also return the index of the first match it finds.
  * showWindow() now uses async calls to prevent blocking when used on a crashed window.
  * When passing sw.restore to showWindow(), it will no longer force windowing of maximized background windows.
  * Added functions getOpenFileName() and getSaveFileName() to display the standard GUI file selection dialogs.
  * When no script is entered (press ENTER at script prompt), the open file dialog is shown to select a script to run.
  * Fixed a (very) minor bug with the close button (X) callback.
  * Providing full paths to scripts should now work properly.
  * More buffer overflow and memory leak fixes.
  * include() can now return multiple variables.

1.03
  * Added memoryWriteString() and memoryWriteStringPtr() functions (should work with Unicode strings).
  * Fixed a bug in memoryReadBytePtr() that caused it to read 4 bytes instead of 1 when using a table of offsets.
  * Fixed a bug with include() that would cause it to use the wrong directory when directory names contained only two characters.
  * Fixed a minor bug in attached key input that would send a virtual key 0 message when no modifier was given.
  * Fixed a buffer overflow in getDirectory() that would cause crashes when files had really long extensions.
  * findPatternInProcess() now executes about 100 times faster.
  * Fixed a minor memory leak in LuaEngine::init().
  * Fixed a memory leak in findWindowListProc().
  * Fixed class.is_a(). It should be working again.
  * Made fixSlashes() globally available and added parameter for changing expected slash type.
  * Added keyboardState() function to return a table of true/false for whether each key is pressed or not.
  * Added a close event callback handler to force graceful exiting when the close button is used.
  * Added buildinfo command to display information about the specific build.
  * Added memoryReadBatch() for reading chunks of memory and splitting into variables in one efficient function.
  * Updated to Lua 5.2 - LuaCoco no longer needed/recommended.
  * Removed dependency for LuaExpat / Expat; A plugin is used instead.
  * bitAnd(), bitOr(), and other bitwise functions deprecated; use official Lua 5.2 bit32 library instead.
  * Better error checking for memory allocation errors has been included with most uses of the new operator.
  * Fixed a bug with findPatternInProcess() that could cause the buffer to not update properly under certain conditions.
  * Fixed a bug with keyboardState(); Actually a workaround for a bug in the Windows API.
  * Fixed casting in memory functions to allow accessing of upper addresses.
  * Fixed a bug with memory read/write pointer functions when using an offset list with only one element.
  * Added function getConsoleAttributes() that returns 6 numbers describing MicroMacro's console window: window width/height, buffer width/height, and cursor X/Y.
  * Added function setConsoleAttributes() that sets the console width and height (in characters), and (optional) sets console buffer width and height.
  * Fixed up keyboardType(). The SHIFT modifier should now properly be passed while attached and a few more characters should be working.
  * Added function setWindowPos() to change the position, width/height, and always-on-top of a specified window.
  * Added function sha1_hash() to return the SHA1 hash of the given string. The 2nd (optional) parameter should be true if you want the 20-char raw output, or false for the 40-char hex (default).

1.02
  * Added allowSystemCommands option to config.lua; allows the user to enable or disable the calling of potentially dangerous functions.
  * Reordered initialization sequence so that config.lua is run before installing libraries. This prevents unwanted code from executing inside the config file.
  * Moved /lib/autoload.lua information to /config.lua
  * include() will now return the chunk exactly like dofile() does.
  * Added WINE input compatibility with --wine switch.
  * Fixed some bugs with keyboard pressing/releasing functions causing problems with modifiers.
  * Added getClipboard() and setClipboard() functions.
  * Added windowWidth and windowHeight variables to config.lua.
  * Added function table.copy to table_addon module.
  * Log now displays user privilege group (Administrator, User, or Guest).
  * Log now displays estimated processor speed.
  * Updated some old code to protect against buffer overflows.
  * Fixed a minor bug that caused 64-bit processors to be seen as 32-bit.
  * Improved type checking and error reporting.
  * Added string_addon module
  * On Lua error, the time is now displayed in the console with the error message.
  * Added sound support using OpenAL (Only WAV format currently supported).
  * Added table.print(), table.contains(), table.save(), and table.load() to table_addon module.
  * Added string.randomhash() to string_addon module.
  * Fixed a bug that allowed netSendMessage() and netCloseCon() to crash MicroMacro if it received an invalid handle.
  * Added createThread(), killThread(), and getThreadStatus().
  * Added atError() to set a callback function in case of a critical error. The function will receive script name, line number, and message detailing the error.
  * Added flashWindow() function to aid in guiding notices to the proper window(s).
  * Fixed a write permission bug in memoryWrite* functions.
  * Added getWindowParent() function.
  * Fixed a few bugs in the class() function and added some new features.

1.01
  * memoryRead* functions only return 1 value again. If an error occures, they return nil.
  * registerKey() renamed to netPushKey().
  * bit.* functions remapped to bitAnd(), bitOr(), bitLShift(), bitRShift().
  * Added custom 'commands' directory for command scripts.
  * Added function saveScreenshot() to save screenshots of the specified window (or 0 for desktop).
  * Added function findPatternInProcess() to aid in finding addresses that may move when the game client updates.
  * Added functions for getting/setting startKey and stopKey.
  * Added function getAttachedHwnd() to return the handle of the attached window, or 0 if not attached.
  * When attached, start and stop hotkeys only take affect when the target or MicroMacro window have focus.
  * Corrected minor bugs in XML parsing.
  * findWindow() and findWindowList() now can accept a second parameter; a specific control within a window.
  * Made a minor improvement to keyboardType().
  * Fixed a bug with function stopPE() that would cause it to not pause execution.
  * Added getTime() and deltaTime() functions to get the current time, and difference between times with higher precision.
  * Improved precision of yrest().
  * Updated to Lua 5.1.4
  * memoryReadString* functions that specify a length will read and return a string of that length, even if a NULL terminator is reached first.
  * unregisterTimer() no longer generates an error when trying to unregister a non-existing timer.
  * Added isDirectory() function to check if the given fully qualified path is a directory or not.
  * Improved operating system detection.
  * Added attachKeyboard() and attachMouse() to attach specifically one device; attach() still attaches both devices.
  * Fixed window title not changing properly under Vista.
  * Added memory access protection to host process; helps protect the user against malicious scripts.
  * Window previews (thumbnails) will no longer be returned by findWindow() or findWindowList() unless specifically asked for (by class name).
  * Removed memoryWriteU* functions. You can now use the standard memoryWrite* functions to write signed or unsigned. (only affects write functions, not read!)
  * Automatic timers now run in a separate coroutine. You may now place while loops and yrests inside of timed functions without disrupting the flow of the script.
  * Added getWindowClassName() function.
  * Fixed network object finalizer functions causing MicroMacro to freeze.
  * Improved speed of endian swapping when sending/receiving information.
  * Added netGetAddress() to return the address of a remote connection.
  * Fixed traceback output.
  * Plugin system completely removed; Use Lua modules instead (work almost exactly the same way)
  * Added cprintf_ex() function; cprintf() is now deprecated.
  * Beta version number is now displayed in the log and window title.
  * Window title resets back to default when re-initializing.
  * Fixed a bug in the XML parser that caused negitive numbers to be returned as strings.
  * Fixed an XML parser bug that caused empty strings to be returned as empty strings; they will now be returned as nil.
  * Added function warning() which works almost exactly like error(), except it does not end script execution.
  * Threads will no longer get out of control and block the user from stopping or killing (CTRL+L) the script.
  * All memoryRead*Ptr() and memoryWrite*Ptr() functions can now accept a table of offsets for pointer chains.
  * Added memory read/write functions for double type.
  * Added lib/autoload.lua - place Lua and DLL files to autoload here.
  * Automatically create a randomly generated network encryption key if net.lua does not exist.
  * Added a proxy Lua DLL for better module compatibility.
  * Fixed a bug in module loading (not running a returned function).
  * Script input now assumes .lua extension if none is given (and file does not exist in current state).
  * Added getModuleAddress() to return the address of a specific module inside of the given process.
  * Added getTimerFrequency() to return CPU frequency and full operator support for time types.
  * XML module functions getAttribute(), getValue(), and getElement() now accept a second optional value; a string of which type to explicitly cast the return value to.
  * Added function xml.parse() which will parse the given input stream; currently accepts already-opened files or strings.
  * Including a file (using include()) multiple times will now ony result in the file being run once; Pass 'true' as a second parameter to force the include.
  * Added system() function to execute system commands and return output as a string.

1.0
  * Added function getDirectory() to get the contents (contained files/subdirectories) of a directory.
  * Fixed a minor bug in yrest().
  * Added atPause() and atResume() functions to set pause and resume callbacks.
  * safeYield() properly checks if the current thread is a coroutine before yielding now.
  * Corrected some minor path issues.
  * Added getExeuctionPath()/setExecutionPath() to get and set the "working directory" of the executed script(s).
  * The behaviour of include() has changed. It now includes from the main script's working directory, but also accepts full paths.
  * Added getFilePath() to return just the path section of a fully qualified path, less trailing slash.
  * Added getFileName() to return just the file name section of a fully qualified path.
  * Added AND(), OR(), LSHIFT(), and RSHIFT() functions to table bit as stand-ins for missing binary operators.
  * Mouse input is now attached when using the attach() function.
  * Keyboard input will no longer send two different sets of information to the attached window. Use attach() only if it is supported!
  * Added XML support.
  * Improved printf/sprintf functions; They now accept all data types except nil as strings (use %s).
  * registerTimer() now allows you to pass in extra arguments to be passed to the timed function.