Repository: twosixlabs/acsploit (language: python)

Issue:
Streamlining and updating dependencies
Introduces some minor changes for compatibility and easier usage:

* Updates acsploit.py to be able to use newer versions of the cmd2 package
* Introduces requirements.in file for pip-tool support
* Streamlines requirements

Furthermore, I'm currently working on packaging acsploit so it can be used by PyPI.
Would you be interested in adopting this?


Discussion / hints:

Fix patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a5f641d..f733eed 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -127,7 +127,7 @@ To set the value of an option call `options.set_value(option_name, value)`. If `
 Example:
 
 ```
-	from options import Options
+	from acsploit.options import Options
 	…
 	class ExampleOutputFormatter(object):
 		…
diff --git a/acsploit.py b/acsploit.py
index 6c836c1..650fea6 100755
--- a/acsploit.py
+++ b/acsploit.py
@@ -1,484 +1,5 @@
 #! /usr/bin/env python3
 
-# this is necessary so python2 doesn't throw a syntax error over the definition of eprint()
-#  and can thus pass through syntax checking to actually running this file, at which point
-#  it will properly bail out on the system version check
-from __future__ import print_function
+from acsploit.__main__ import main
 
-import sys
-if sys.hexversion < 0x03050000:
-    raise Exception('ACsploit requires Python 3.5 or higher')
-
-import exploits
-import cmd2
-import input
-import output
-import os
-import pkgutil
-import functools
-import argparse
-import importlib
-import time
-from colorama import Fore
-
-from options import Options
-
-FG_COLORS = {
-    'black': Fore.BLACK,
-    'red': Fore.RED,
-    'green': Fore.GREEN,
-    'yellow': Fore.YELLOW,
-    'blue': Fore.BLUE,
-    'magenta': Fore.MAGENTA,
-    'cyan': Fore.CYAN,
-    'white': Fore.WHITE,
-}
-
-
-def colorize(string, colorname):
-    return FG_COLORS[colorname] + string + Fore.RESET
-
-
-def eprint(*args, **kwargs):
-    """Print helper to stderr."""
-    print(*args, file=sys.stderr, **kwargs)
-
-
-def get_exploits():
-    """Find and load all exploit modules."""
-    results = {}
-    for loader, name, ispkg in pkgutil.walk_packages(exploits.__path__):
-        m = loader.find_module(name).load_module(name)
-
-        if not ispkg and hasattr(m, 'options') and hasattr(m, 'run'):
-            exploit = name.replace('.', '/')
-            results[exploit] = m
-
-    return results
-
-
-def get_inputs():
-    """Get all input modules."""
-    inputs = {}
-    for obj in vars(input).values():
-        if hasattr(obj, 'INPUT_NAME'):
-            inputs[obj.INPUT_NAME] = obj
-
-    return inputs
-
-
-def get_outputs():
-    """Get all output modules."""
-    outputs = {}
-    for obj in vars(output).values():
-        if hasattr(obj, 'OUTPUT_NAME'):
-            outputs[obj.OUTPUT_NAME] = obj
-
-    return outputs
-
-
-class ACsploit(cmd2.Cmd):
-    """An interactive command-line utility to generate worst-case inputs to commonly used algorithms."""
-
-    intro = r"""
-                             .__         .__  __
-_____    ____   ____________ |  |   ____ |__|/  |_
-\__  \ _/ ___\ /  ___/\____ \|  |  /  _ \|  \   __\
- / __ \\  \___ \___ \ |  |_> >  |_(  <_> )  ||  |
-(____  /\___  >____  >|   __/|____/\____/|__||__|
-     \/     \/     \/ |__|
-
-"""
-
-    # find all inputs, outputs, exploits
-    inputs = get_inputs()
-    outputs = get_outputs()
-    exploits = get_exploits()
-
-    def __init__(self, hist_file):
-        """Initialization and setup of ACsploit."""
-        self.setup_cmd2(hist_file)
-
-        self.prompt = self.make_prompt()
-
-        self.exploit = None
-        self.exploit_name = ''
-        self.input = None
-        self.output = None
-        self.options = Options()
-        self.defaulted_options = []
-
-        self.script_mode = False
-        self.shortcuts = cmd2.DEFAULT_SHORTCUTS
-
-    def setup_cmd2(self, hist_file):
-        """"Set up interactive command line interface."""
-        # delete unused commands that are baked-into cmd2 and set some options
-        del cmd2.Cmd.do_py
-        del cmd2.Cmd.do_edit
-        del cmd2.Cmd.do_shortcuts
-        del cmd2.Cmd.do_run_pyscript
-        del cmd2.Cmd.do_set
-        del cmd2.Cmd.do_run_script
-        cmd2.Cmd.abbrev = True
-        self.allow_cli_args = False  # disable parsing of command-line args by cmd2
-        self.allow_redirection = False  # disable redirection to enable right shift (>>) in custom_hash to work
-        self.redirector = '\xff'  # disable redirection in the parser as well
-
-        # init cmd2 and the history file
-        cmd2.Cmd.__init__(self, persistent_history_file=hist_file, persistent_history_length=200)
-
-        # disable help on builtins
-        self.hidden_commands.append('shell')
-        self.hidden_commands.append('exit')
-
-    def make_prompt(self, location=None):
-        """Create the command line prompt."""
-        prompt = '(acsploit : %s) ' % location if location is not None else '(acsploit) '
-        return colorize(prompt, "blue")
-
-    def complete_set(self, text, line, begidx, endidx):
-        """Provide tab completion for the "set" option."""
-        # text = line[begidx:endidx] is the word we want to complete
-        # split the completed words, should either be ['set'], or ['set', <option_key>]
-        split_line = line[:begidx].split()
-        if len(split_line) == 1:
-            return [option for option in self.get_option_names() if option.startswith(text) or '.' + text in option]
-
-        if len(split_line) == 2:
-            key = split_line[1]
-            options = self.get_options(key)
-            if options is not None:
-                scoped_key = key.split('.')[1] if '.' in key else key
-                values = options.get_acceptable_values(scoped_key)
-                if values is not None:
-                    return [value for value in values if value.startswith(text)]
-
-        return []
-
-    def complete_use(self, text, line, begidx, endidx):
-        """Provide tab completion for the "use" option."""
-        return self.delimiter_complete(text, line, begidx, endidx, ACsploit.exploits, '/')
-
-    def get_option_names(self):
-        """Returns the names of all options within current exploit, input , and output options."""
-        # There are no options until the current exploit is set
-        if self.exploit is None:
-            return []
-
-        option_names = self.options.get_option_names()
-
-        if self.input is not None:
-            option_names += ['input.' + option for option in self.input.options.get_option_names()]
-
-        if self.output is not None:
-            option_names += ['output.' + option for option in self.output.options.get_option_names()]
-
-        if self.exploit is not None:
-            option_names += ['exploit.' + option for option in self.exploit.options.get_option_names()]
-
-        return option_names
-
-    def get_options(self, key):
-        """Returns the options object containing the given key."""
-        if key in self.options.get_option_names():
-            return self.options
-
-        try:
-            scope, scoped_key = key.split('.')
-        except ValueError:
-            return None
-
-        if scope == 'input' and scoped_key in self.input.options.get_option_names():
-            return self.input.options
-        elif scope == 'output' and scoped_key in self.output.options.get_option_names():
-            return self.output.options
-        elif scope == 'exploit' and scoped_key in self.exploit.options.get_option_names():
-            return self.exploit.options
-        else:
-            return None
-
-    def print_options(self, options, describe=False, indent_level=0):
-        """Print available options and current values."""
-        indent = '  ' * indent_level
-        for option in options.get_option_names():
-            line = colorize(option + ': ', 'green') + str(options[option])
-            if describe:
-                line += ' (' + options.get_description(option) + ')'
-                values = options.get_acceptable_values(option)
-                if values is not None:
-                    line += ' (Acceptable Values: ' + str(values) + ')'
-            eprint(indent + line)
-
-    def fuzzy_equals(self, lhs, rhs):
-        """Type-coerce to the type of rhs and then compare, Returns True if equals."""
-        t = type(rhs)
-        if t is bool:  # special case bool because bool() treats all strings as True
-            return rhs is (lhs in Options.TRUE_VALUES)
-        try:
-            if rhs is None:
-                return lhs is None
-            return t(lhs) == rhs
-        except ValueError:
-            return False
-
-    def do_info(self, args):
-        """Displays the description of the selected exploit."""
-        if self.exploit is None:
-            eprint(colorize('No exploit set; nothing to describe. Select an exploit with the \'use\' command',
-                                 'cyan'))
-        else:
-            eprint(colorize('\n  ' + self.exploit.DESCRIPTION + '\n', 'green'))
-
-    def do_options(self, args):
-        """Displays options for the selected exploit. Use 'options describe' to see descriptions"""
-        if args not in ['', 'describe']:
-            eprint(colorize('Unsupported argument to options', 'red'))
-            self.do_help('options')
-            return
-
-        if self.exploit is None:
-            eprint(colorize('No exploit set; no options to show. Select an exploit with the \'use\' command',
-                                 'cyan'))
-            return
-
-        describe = args == 'describe'
-
-        eprint()
-        self.print_options(self.options, describe, indent_level=1)
-        if self.input is not None:
-            eprint(colorize('\n  Input options', 'green'))
-            self.print_options(self.input.options, describe, indent_level=2)
-        if self.output is not None:
-            eprint(colorize('\n  Output options', 'green'))
-            self.print_options(self.output.options, describe, indent_level=2)
-        if self.exploit is not None:
-            eprint(colorize('\n  Exploit options', 'green'))
-            self.print_options(self.exploit.options, describe, indent_level=2)
-        eprint()
-
-    def do_exit(self, args):
-        """Exit ACsploit."""
-        self._should_quit = True
-        return self._STOP_AND_EXIT
-
-    def do_set(self, args):
-        """Sets an option. Usage: set [option_name] [value]"""
-        try:
-            key, value = args.split(maxsplit=1)
-        except ValueError:
-            eprint('Usage: set [option_name] [value]')
-            return
-
-        no_option_msg = colorize('No option set', 'cyan')
-
-        if key == 'debug':
-            if value.lower() == 'true':
-                self.debug = True
-                eprint(colorize('debug => true', 'cyan'))
-            elif value.lower() == 'false':
-                self.debug = False
-                eprint(colorize('debug => false', 'cyan'))
-            else:
-                eprint(colorize('{} is not an acceptable value for option {}'.format(value, key), 'red'))
-                eprint(no_option_msg)
-            return
-
-        if key not in self.get_option_names():
-            eprint(colorize('Option {} does not exist'.format(key), 'red'))
-            eprint(no_option_msg)
-            return
-
-        options = self.get_options(key)  # this call should always succeed due to the check above
-        scoped_key = key.split('.')[1] if '.' in key else key
-        if not options.is_acceptable_value(scoped_key, value):
-            if options.supports_custom(scoped_key) and value == 'custom':
-                eprint(colorize('value must be specified after \"custom\"', 'red'))
-            else:
-                eprint(colorize('{} is not an acceptable value for option {}'.format(value, key), 'red'))
-            eprint(no_option_msg)
-            return
-
-        if self.fuzzy_equals(value, options[scoped_key]):
-            eprint(colorize('Option {} is already set to {}'.format(key, value), 'cyan'))
-            return
-
-        if key in self.defaulted_options:
-            if self.script_mode:  # in script mode, warn and continue
-                eprint(colorize('The following change may result in degraded exploit performance or failure',
-                                     'yellow'))
-                self.defaulted_options.remove(key)  # only warn the first time overwriting the defaulted option
-            else:  # in interactive mode, prompt for confirmation
-                confirm_prompt = 'Changing this option may result in degraded exploit performance or failure'
-                confirmation = __builtins__.input(colorize(confirm_prompt + '\nDo you want to continue? [y|N] ',
-                                                                'yellow'))
-                if confirmation.lower() in ['yes', 'y']:
-                    self.defaulted_options.remove(key)  # only warn the first time overwriting the defaulted option
-                else:
-                    eprint(no_option_msg)
-                    return
-
-        if key == 'input':
-            self.input = ACsploit.inputs[value]()
-        elif key == 'output':
-            self.output = ACsploit.outputs[value]()
-
-        options[scoped_key] = value
-        eprint(colorize('%s => %s' % (key, value), 'cyan'))
-
-    def do_reset(self, args):
-        """Resets the current exploit to default options"""
-        if self.exploit is None:
-            eprint(colorize('No exploit set; nothing to reset. Select an exploit with the \'use\' command',
-                                 'cyan'))
-            return
-
-        # delete the stored settings and reset the options in the current module
-        if hasattr(self.exploit, '_ACsploit_exploit_settings'):
-            del self.exploit._ACsploit_exploit_settings
-
-        importlib.reload(self.exploit)  # we need to do this to reset currexp.options back to original values
-
-        self.exploit = None
-        self.update_exploit(self.exploit_name)
-
-    def do_use(self, args):
-        """Sets the current exploit. Usage: use [exploit_name]"""
-        if len(args) > 0:
-            self.update_exploit(args.split()[0])
-        else:
-            eprint(colorize('Usage: use [exploit_name]', 'red'))
-            return
-
-    def do_show(self, args):
-        """Lists all available exploits."""
-        eprint(colorize('\nAvailable exploits:', 'green'))
-        for key in sorted(ACsploit.exploits):
-            eprint(colorize('    ' + key, 'green'))
-        eprint()
-
-    def do_clear(self, args):
-        """Clears the screen"""
-        # 'cls' on windows, otherwise 'clear'
-        os.system('cls' if os.name == 'nt' else 'clear')
-
-    def update_exploit(self, exploit_name):
-        """Sets the exploit name as the current exploit and restores saved settings or sets default values."""
-        if exploit_name not in ACsploit.exploits:
-            eprint((colorize('Exploit ' + exploit_name + ' does not exist', 'red')))
-            return
-
-        # save current input/output and  to current exploit in private variables
-        # this allows restoration of the current settings if the exploit is used again
-        if self.exploit is not None:
-            self.exploit._ACsploit_exploit_settings = {
-                'input': self.input,
-                'output': self.output,
-                'options': self.options,
-                'defaulted_options': self.defaulted_options,
-            }
-
-        # set the new exploit; restore previous input/output
-        self.exploit_name = exploit_name
-        self.exploit = ACsploit.exploits[exploit_name]
-        self.prompt = self.make_prompt(exploit_name)
-
-        eprint(colorize('exploit => %s' % exploit_name, 'cyan'))
-
-        if hasattr(self.exploit, '_ACsploit_exploit_settings'):
-            self.input = self.exploit._ACsploit_exploit_settings['input']
-            self.output = self.exploit._ACsploit_exploit_settings['output']
-            self.options = self.exploit._ACsploit_exploit_settings['options']
-            self.defaulted_options = self.exploit._ACsploit_exploit_settings['defaulted_options']
-
-        else:
-            input_desc = 'Input generator to use with exploits'
-            output_desc = 'Output generator to use with exploits'
-            self.defaulted_options = []
-            self.options = Options()
-
-            # set default input and output for new exploit, if any
-            if hasattr(self.exploit, 'NO_INPUT') and self.exploit.NO_INPUT:
-                self.input = None
-            elif hasattr(self.exploit, 'DEFAULT_INPUT'):
-                self.options.add_option('input', self.exploit.DEFAULT_INPUT, input_desc,
-                                        list(ACsploit.inputs.keys()))
-                self.defaulted_options.append('input')
-                self.input = ACsploit.inputs[self.exploit.DEFAULT_INPUT]()
-            else:
-                # We set string as the default input, but do not warn if this option is changed
-                self.options.add_option('input', 'string', input_desc, list(ACsploit.inputs.keys()))
-                self.input = ACsploit.inputs['string']()
-
-            if hasattr(self.exploit, 'NO_OUTPUT') and self.exploit.NO_OUTPUT:
-                self.output = None
-            elif hasattr(self.exploit, 'DEFAULT_OUTPUT'):
-                self.options.add_option('output', self.exploit.DEFAULT_OUTPUT, output_desc,
-                                        list(ACsploit.outputs.keys()))
-                self.defaulted_options.append('output')
-                self.output = ACsploit.outputs[self.exploit.DEFAULT_OUTPUT]()
-            else:
-                # We set stdout as the default output, but do not warn if this option is changed
-                self.options.add_option('output', 'stdout', output_desc, list(ACsploit.outputs.keys()))
-                self.output = ACsploit.outputs['stdout']()
-
-            # set defaults for input and output settings for new exploit, if any
-            if hasattr(self.exploit, 'DEFAULT_INPUT_OPTIONS'):
-                for option, value in self.exploit.DEFAULT_INPUT_OPTIONS.items():
-                    self.input.set_option(option, value)
-                    self.defaulted_options.append('input.%s' % option)
-            if hasattr(self.exploit, 'DEFAULT_OUTPUT_OPTIONS'):
-                for option, value in self.exploit.DEFAULT_OUTPUT_OPTIONS.items():
-                    self.output.options.set_value(option, value)
-                    self.defaulted_options.append('output.%s' % option)
-
-    def do_run(self, args):
-        """Runs the current exploit"""
-        if self.exploit is None:
-            eprint(colorize('No exploit set; nothing to do. Select an exploit with the \'use\' command', 'cyan'))
-        else:
-            eprint(colorize('Running %s...' % self.exploit_name, 'cyan'))
-            start = time.perf_counter()
-            if self.input is None:
-                if self.output is None:
-                    self.exploit.run()
-                else:
-                    self.exploit.run(self.output)
-            else:
-                # prepare is used to update internal state of input generators prior to running
-                if hasattr(self.input, 'prepare'):
-                    self.input.prepare()
-                if self.output is None:
-                    self.exploit.run(self.input)
-                else:
-                    self.exploit.run(self.input, self.output)
-            end = time.perf_counter()
-            eprint(colorize('Finished running %s (%.2f seconds)' % (self.exploit_name, end - start), 'cyan'))
-
-
-if __name__ == '__main__':
-
-    history_file = os.path.join(os.path.expanduser('~'), '.acsploit_history')
-    if not os.path.isfile(history_file):
-        with open(history_file, 'w') as f:
-            f.write('')
-
-    parser = argparse.ArgumentParser(description='A tool for generating worst-case inputs for algorithms')
-    parser.add_argument('--debug', action='store_true', help='show debug stack traces')
-    parser.add_argument('--load-file', metavar='FILE', default=None, help='load commands from file and then exit')
-
-    args = parser.parse_args()
-
-    cmdlineobj = ACsploit(hist_file=history_file)
-    cmdlineobj.debug = args.debug
-
-    if args.load_file is not None:
-        try:
-            with open(args.load_file) as script:
-                lines = [line.strip().split('#', 1)[0] for line in script]  # `#` is a comment in scripts
-                cmdlineobj.script_mode = True
-                cmdlineobj.runcmds_plus_hooks(lines)
-        except OSError:
-            eprint(cmdlineobj.colorize('Could not open file %s' % args.load_file, 'red'))
-    else:
-        cmdlineobj.cmdloop()
+main()
diff --git a/__init__.py b/acsploit/__init__.py
similarity index 100%
rename from __init__.py
rename to acsploit/__init__.py
diff --git a/acsploit/__main__.py b/acsploit/__main__.py
new file mode 100644
index 0000000..123b19c
--- /dev/null
+++ b/acsploit/__main__.py
@@ -0,0 +1,486 @@
+# this is necessary so python2 doesn't throw a syntax error over the definition of eprint()
+#  and can thus pass through syntax checking to actually running this file, at which point
+#  it will properly bail out on the system version check
+from __future__ import print_function
+
+import sys
+if sys.hexversion < 0x03050000:
+    raise Exception('ACsploit requires Python 3.5 or higher')
+
+import acsploit.exploits
+import acsploit.input
+import acsploit.output
+import cmd2
+import os
+import pkgutil
+import functools
+import argparse
+import importlib
+import time
+from colorama import Fore
+
+from acsploit.options import Options
+
+FG_COLORS = {
+    'black': Fore.BLACK,
+    'red': Fore.RED,
+    'green': Fore.GREEN,
+    'yellow': Fore.YELLOW,
+    'blue': Fore.BLUE,
+    'magenta': Fore.MAGENTA,
+    'cyan': Fore.CYAN,
+    'white': Fore.WHITE,
+}
+
+
+def colorize(string, colorname):
+    return FG_COLORS[colorname] + string + Fore.RESET
+
+
+def eprint(*args, **kwargs):
+    """Print helper to stderr."""
+    print(*args, file=sys.stderr, **kwargs)
+
+
+def get_exploits():
+    """Find and load all exploit modules."""
+    results = {}
+    for loader, name, ispkg in pkgutil.walk_packages(acsploit.exploits.__path__):
+        m = loader.find_module(name).load_module(name)
+
+        if not ispkg and hasattr(m, 'options') and hasattr(m, 'run'):
+            exploit = name.replace('.', '/')
+            results[exploit] = m
+
+    return results
+
+
+def get_inputs():
+    """Get all input modules."""
+    inputs = {}
+    for obj in vars(acsploit.input).values():
+        if hasattr(obj, 'INPUT_NAME'):
+            inputs[obj.INPUT_NAME] = obj
+
+    return inputs
+
+
+def get_outputs():
+    """Get all output modules."""
+    outputs = {}
+    for obj in vars(acsploit.output).values():
+        if hasattr(obj, 'OUTPUT_NAME'):
+            outputs[obj.OUTPUT_NAME] = obj
+
+    return outputs
+
+
+class ACsploit(cmd2.Cmd):
+    """An interactive command-line utility to generate worst-case inputs to commonly used algorithms."""
+
+    intro = r"""
+                             .__         .__  __
+_____    ____   ____________ |  |   ____ |__|/  |_
+\__  \ _/ ___\ /  ___/\____ \|  |  /  _ \|  \   __\
+ / __ \\  \___ \___ \ |  |_> >  |_(  <_> )  ||  |
+(____  /\___  >____  >|   __/|____/\____/|__||__|
+     \/     \/     \/ |__|
+
+"""
+
+    # find all inputs, outputs, exploits
+    inputs = get_inputs()
+    outputs = get_outputs()
+    exploits = get_exploits()
+
+    def __init__(self, hist_file):
+        """Initialization and setup of ACsploit."""
+        self.setup_cmd2(hist_file)
+
+        self.prompt = self.make_prompt()
+
+        self.exploit = None
+        self.exploit_name = ''
+        self.input = None
+        self.output = None
+        self.options = Options()
+        self.defaulted_options = []
+
+        self.script_mode = False
+        self.shortcuts = cmd2.DEFAULT_SHORTCUTS
+
+    def setup_cmd2(self, hist_file):
+        """"Set up interactive command line interface."""
+        # delete unused commands that are baked-into cmd2 and set some options
+        del cmd2.Cmd.do_py
+        del cmd2.Cmd.do_edit
+        del cmd2.Cmd.do_shortcuts
+        del cmd2.Cmd.do_run_pyscript
+        del cmd2.Cmd.do_set
+        del cmd2.Cmd.do_run_script
+        cmd2.Cmd.abbrev = True
+        self.allow_cli_args = False  # disable parsing of command-line args by cmd2
+        self.allow_redirection = False  # disable redirection to enable right shift (>>) in custom_hash to work
+        self.redirector = '\xff'  # disable redirection in the parser as well
+
+        # init cmd2 and the history file
+        cmd2.Cmd.__init__(self, persistent_history_file=hist_file, persistent_history_length=200)
+
+        # disable help on builtins
+        self.hidden_commands.append('shell')
+        self.hidden_commands.append('exit')
+
+    def make_prompt(self, location=None):
+        """Create the command line prompt."""
+        prompt = '(acsploit : %s) ' % location if location is not None else '(acsploit) '
+        return colorize(prompt, "blue")
+
+    def complete_set(self, text, line, begidx, endidx):
+        """Provide tab completion for the "set" option."""
+        # text = line[begidx:endidx] is the word we want to complete
+        # split the completed words, should either be ['set'], or ['set', <option_key>]
+        split_line = line[:begidx].split()
+        if len(split_line) == 1:
+            return [option for option in self.get_option_names() if option.startswith(text) or '.' + text in option]
+
+        if len(split_line) == 2:
+            key = split_line[1]
+            options = self.get_options(key)
+            if options is not None:
+                scoped_key = key.split('.')[1] if '.' in key else key
+                values = options.get_acceptable_values(scoped_key)
+                if values is not None:
+                    return [value for value in values if value.startswith(text)]
+
+        return []
+
+    def complete_use(self, text, line, begidx, endidx):
+        """Provide tab completion for the "use" option."""
+        return self.delimiter_complete(text, line, begidx, endidx, ACsploit.exploits, '/')
+
+    def get_option_names(self):
+        """Returns the names of all options within current exploit, input , and output options."""
+        # There are no options until the current exploit is set
+        if self.exploit is None:
+            return []
+
+        option_names = self.options.get_option_names()
+
+        if self.input is not None:
+            option_names += ['input.' + option for option in self.input.options.get_option_names()]
+
+        if self.output is not None:
+            option_names += ['output.' + option for option in self.output.options.get_option_names()]
+
+        if self.exploit is not None:
+            option_names += ['exploit.' + option for option in self.exploit.options.get_option_names()]
+
+        return option_names
+
+    def get_options(self, key):
+        """Returns the options object containing the given key."""
+        if key in self.options.get_option_names():
+            return self.options
+
+        try:
+            scope, scoped_key = key.split('.')
+        except ValueError:
+            return None
+
+        if scope == 'input' and scoped_key in self.input.options.get_option_names():
+            return self.input.options
+        elif scope == 'output' and scoped_key in self.output.options.get_option_names():
+            return self.output.options
+        elif scope == 'exploit' and scoped_key in self.exploit.options.get_option_names():
+            return self.exploit.options
+        else:
+            return None
+
+    def print_options(self, options, describe=False, indent_level=0):
+        """Print available options and current values."""
+        indent = '  ' * indent_level
+        for option in options.get_option_names():
+            line = colorize(option + ': ', 'green') + str(options[option])
+            if describe:
+                line += ' (' + options.get_description(option) + ')'
+                values = options.get_acceptable_values(option)
+                if values is not None:
+                    line += ' (Acceptable Values: ' + str(values) + ')'
+            eprint(indent + line)
+
+    def fuzzy_equals(self, lhs, rhs):
+        """Type-coerce to the type of rhs and then compare, Returns True if equals."""
+        t = type(rhs)
+        if t is bool:  # special case bool because bool() treats all strings as True
+            return rhs is (lhs in Options.TRUE_VALUES)
+        try:
+            if rhs is None:
+                return lhs is None
+            return t(lhs) == rhs
+        except ValueError:
+            return False
+
+    def do_info(self, args):
+        """Displays the description of the selected exploit."""
+        if self.exploit is None:
+            eprint(colorize('No exploit set; nothing to describe. Select an exploit with the \'use\' command',
+                                 'cyan'))
+        else:
+            eprint(colorize('\n  ' + self.exploit.DESCRIPTION + '\n', 'green'))
+
+    def do_options(self, args):
+        """Displays options for the selected exploit. Use 'options describe' to see descriptions"""
+        if args not in ['', 'describe']:
+            eprint(colorize('Unsupported argument to options', 'red'))
+            self.do_help('options')
+            return
+
+        if self.exploit is None:
+            eprint(colorize('No exploit set; no options to show. Select an exploit with the \'use\' command',
+                                 'cyan'))
+            return
+
+        describe = args == 'describe'
+
+        eprint()
+        self.print_options(self.options, describe, indent_level=1)
+        if self.input is not None:
+            eprint(colorize('\n  Input options', 'green'))
+            self.print_options(self.input.options, describe, indent_level=2)
+        if self.output is not None:
+            eprint(colorize('\n  Output options', 'green'))
+            self.print_options(self.output.options, describe, indent_level=2)
+        if self.exploit is not None:
+            eprint(colorize('\n  Exploit options', 'green'))
+            self.print_options(self.exploit.options, describe, indent_level=2)
+        eprint()
+
+    def do_exit(self, args):
+        """Exit ACsploit."""
+        self._should_quit = True
+        return self._STOP_AND_EXIT
+
+    def do_set(self, args):
+        """Sets an option. Usage: set [option_name] [value]"""
+        try:
+            key, value = args.split(maxsplit=1)
+        except ValueError:
+            eprint('Usage: set [option_name] [value]')
+            return
+
+        no_option_msg = colorize('No option set', 'cyan')
+
+        if key == 'debug':
+            if value.lower() == 'true':
+                self.debug = True
+                eprint(colorize('debug => true', 'cyan'))
+            elif value.lower() == 'false':
+                self.debug = False
+                eprint(colorize('debug => false', 'cyan'))
+            else:
+                eprint(colorize('{} is not an acceptable value for option {}'.format(value, key), 'red'))
+                eprint(no_option_msg)
+            return
+
+        if key not in self.get_option_names():
+            eprint(colorize('Option {} does not exist'.format(key), 'red'))
+            eprint(no_option_msg)
+            return
+
+        options = self.get_options(key)  # this call should always succeed due to the check above
+        scoped_key = key.split('.')[1] if '.' in key else key
+        if not options.is_acceptable_value(scoped_key, value):
+            if options.supports_custom(scoped_key) and value == 'custom':
+                eprint(colorize('value must be specified after \"custom\"', 'red'))
+            else:
+                eprint(colorize('{} is not an acceptable value for option {}'.format(value, key), 'red'))
+            eprint(no_option_msg)
+            return
+
+        if self.fuzzy_equals(value, options[scoped_key]):
+            eprint(colorize('Option {} is already set to {}'.format(key, value), 'cyan'))
+            return
+
+        if key in self.defaulted_options:
+            if self.script_mode:  # in script mode, warn and continue
+                eprint(colorize('The following change may result in degraded exploit performance or failure',
+                                     'yellow'))
+                self.defaulted_options.remove(key)  # only warn the first time overwriting the defaulted option
+            else:  # in interactive mode, prompt for confirmation
+                confirm_prompt = 'Changing this option may result in degraded exploit performance or failure'
+                confirmation = __builtins__.input(colorize(confirm_prompt + '\nDo you want to continue? [y|N] ',
+                                                                'yellow'))
+                if confirmation.lower() in ['yes', 'y']:
+                    self.defaulted_options.remove(key)  # only warn the first time overwriting the defaulted option
+                else:
+                    eprint(no_option_msg)
+                    return
+
+        if key == 'input':
+            self.input = ACsploit.inputs[value]()
+        elif key == 'output':
+            self.output = ACsploit.outputs[value]()
+
+        options[scoped_key] = value
+        eprint(colorize('%s => %s' % (key, value), 'cyan'))
+
+    def do_reset(self, args):
+        """Resets the current exploit to default options"""
+        if self.exploit is None:
+            eprint(colorize('No exploit set; nothing to reset. Select an exploit with the \'use\' command',
+                                 'cyan'))
+            return
+
+        # delete the stored settings and reset the options in the current module
+        if hasattr(self.exploit, '_ACsploit_exploit_settings'):
+            del self.exploit._ACsploit_exploit_settings
+
+        importlib.reload(self.exploit)  # we need to do this to reset currexp.options back to original values
+
+        self.exploit = None
+        self.update_exploit(self.exploit_name)
+
+    def do_use(self, args):
+        """Sets the current exploit. Usage: use [exploit_name]"""
+        if len(args) > 0:
+            self.update_exploit(args.split()[0])
+        else:
+            eprint(colorize('Usage: use [exploit_name]', 'red'))
+            return
+
+    def do_show(self, args):
+        """Lists all available exploits."""
+        eprint(colorize('\nAvailable exploits:', 'green'))
+        for key in sorted(ACsploit.exploits):
+            eprint(colorize('    ' + key, 'green'))
+        eprint()
+
+    def do_clear(self, args):
+        """Clears the screen"""
+        # 'cls' on windows, otherwise 'clear'
+        os.system('cls' if os.name == 'nt' else 'clear')
+
+    def update_exploit(self, exploit_name):
+        """Sets the exploit name as the current exploit and restores saved settings or sets default values."""
+        if exploit_name not in ACsploit.exploits:
+            eprint((colorize('Exploit ' + exploit_name + ' does not exist', 'red')))
+            return
+
+        # save current input/output and  to current exploit in private variables
+        # this allows restoration of the current settings if the exploit is used again
+        if self.exploit is not None:
+            self.exploit._ACsploit_exploit_settings = {
+                'input': self.input,
+                'output': self.output,
+                'options': self.options,
+                'defaulted_options': self.defaulted_options,
+            }
+
+        # set the new exploit; restore previous input/output
+        self.exploit_name = exploit_name
+        self.exploit = ACsploit.exploits[exploit_name]
+        self.prompt = self.make_prompt(exploit_name)
+
+        eprint(colorize('exploit => %s' % exploit_name, 'cyan'))
+
+        if hasattr(self.exploit, '_ACsploit_exploit_settings'):
+            self.input = self.exploit._ACsploit_exploit_settings['input']
+            self.output = self.exploit._ACsploit_exploit_settings['output']
+            self.options = self.exploit._ACsploit_exploit_settings['options']
+            self.defaulted_options = self.exploit._ACsploit_exploit_settings['defaulted_options']
+
+        else:
+            input_desc = 'Input generator to use with exploits'
+            output_desc = 'Output generator to use with exploits'
+            self.defaulted_options = []
+            self.options = Options()
+
+            # set default input and output for new exploit, if any
+            if hasattr(self.exploit, 'NO_INPUT') and self.exploit.NO_INPUT:
+                self.input = None
+            elif hasattr(self.exploit, 'DEFAULT_INPUT'):
+                self.options.add_option('input', self.exploit.DEFAULT_INPUT, input_desc,
+                                        list(ACsploit.inputs.keys()))
+                self.defaulted_options.append('input')
+                self.input = ACsploit.inputs[self.exploit.DEFAULT_INPUT]()
+            else:
+                # We set string as the default input, but do not warn if this option is changed
+                self.options.add_option('input', 'string', input_desc, list(ACsploit.inputs.keys()))
+                self.input = ACsploit.inputs['string']()
+
+            if hasattr(self.exploit, 'NO_OUTPUT') and self.exploit.NO_OUTPUT:
+                self.output = None
+            elif hasattr(self.exploit, 'DEFAULT_OUTPUT'):
+                self.options.add_option('output', self.exploit.DEFAULT_OUTPUT, output_desc,
+                                        list(ACsploit.outputs.keys()))
+                self.defaulted_options.append('output')
+                self.output = ACsploit.outputs[self.exploit.DEFAULT_OUTPUT]()
+            else:
+                # We set stdout as the default output, but do not warn if this option is changed
+                self.options.add_option('output', 'stdout', output_desc, list(ACsploit.outputs.keys()))
+                self.output = ACsploit.outputs['stdout']()
+
+            # set defaults for input and output settings for new exploit, if any
+            if hasattr(self.exploit, 'DEFAULT_INPUT_OPTIONS'):
+                for option, value in self.exploit.DEFAULT_INPUT_OPTIONS.items():
+                    self.input.set_option(option, value)
+                    self.defaulted_options.append('input.%s' % option)
+            if hasattr(self.exploit, 'DEFAULT_OUTPUT_OPTIONS'):
+                for option, value in self.exploit.DEFAULT_OUTPUT_OPTIONS.items():
+                    self.output.options.set_value(option, value)
+                    self.defaulted_options.append('output.%s' % option)
+
+    def do_run(self, args):
+        """Runs the current exploit"""
+        if self.exploit is None:
+            eprint(colorize('No exploit set; nothing to do. Select an exploit with the \'use\' command', 'cyan'))
+        else:
+            eprint(colorize('Running %s...' % self.exploit_name, 'cyan'))
+            start = time.perf_counter()
+            if self.input is None:
+                if self.output is None:
+                    self.exploit.run()
+                else:
+                    self.exploit.run(self.output)
+            else:
+                # prepare is used to update internal state of input generators prior to running
+                if hasattr(self.input, 'prepare'):
+                    self.input.prepare()
+                if self.output is None:
+                    self.exploit.run(self.input)
+                else:
+                    self.exploit.run(self.input, self.output)
+            end = time.perf_counter()
+            eprint(colorize('Finished running %s (%.2f seconds)' % (self.exploit_name, end - start), 'cyan'))
+
+
+def main() -> None:
+    history_file = os.path.join(os.path.expanduser('~'), '.acsploit_history')
+    if not os.path.isfile(history_file):
+        with open(history_file, 'w') as f:
+            f.write('')
+
+    parser = argparse.ArgumentParser(description='A tool for generating worst-case inputs for algorithms')
+    parser.add_argument('--debug', action='store_true', help='show debug stack traces')
+    parser.add_argument('--load-file', metavar='FILE', default=None, help='load commands from file and then exit')
+
+    args = parser.parse_args()
+
+    cmdlineobj = ACsploit(hist_file=history_file)
+    cmdlineobj.debug = args.debug
+
+    if args.load_file is not None:
+        try:
+            with open(args.load_file) as script:
+                lines = [line.strip().split('#', 1)[0] for line in script]  # `#` is a comment in scripts
+                cmdlineobj.script_mode = True
+                cmdlineobj.runcmds_plus_hooks(lines)
+        except OSError:
+            eprint(cmdlineobj.colorize('Could not open file %s' % args.load_file, 'red'))
+    else:
+        cmdlineobj.cmdloop()
+
+
+if __name__ == '__main__':
+    main()
+    
diff --git a/exploits/__init__.py b/acsploit/exploits/__init__.py
similarity index 100%
rename from exploits/__init__.py
rename to acsploit/exploits/__init__.py
diff --git a/exploits/bombs/__init__.py b/acsploit/exploits/bombs/__init__.py
similarity index 100%
rename from exploits/bombs/__init__.py
rename to acsploit/exploits/bombs/__init__.py
diff --git a/exploits/bombs/compression/__init__.py b/acsploit/exploits/bombs/compression/__init__.py
similarity index 100%
rename from exploits/bombs/compression/__init__.py
rename to acsploit/exploits/bombs/compression/__init__.py
diff --git a/exploits/bombs/compression/bombs-DONOTOPEN/gz_recursive.gz b/acsploit/exploits/bombs/compression/bombs-DONOTOPEN/gz_recursive.gz
similarity index 100%
rename from exploits/bombs/compression/bombs-DONOTOPEN/gz_recursive.gz
rename to acsploit/exploits/bombs/compression/bombs-DONOTOPEN/gz_recursive.gz
diff --git a/exploits/bombs/compression/bombs-DONOTOPEN/tar_gz_recursive.tar.gz b/acsploit/exploits/bombs/compression/bombs-DONOTOPEN/tar_gz_recursive.tar.gz
similarity index 100%
rename from exploits/bombs/compression/bombs-DONOTOPEN/tar_gz_recursive.tar.gz
rename to acsploit/exploits/bombs/compression/bombs-DONOTOPEN/tar_gz_recursive.tar.gz
diff --git a/exploits/bombs/compression/bombs-DONOTOPEN/zip_recursive.zip b/acsploit/exploits/bombs/compression/bombs-DONOTOPEN/zip_recursive.zip
similarity index 100%
rename from exploits/bombs/compression/bombs-DONOTOPEN/zip_recursive.zip
rename to acsploit/exploits/bombs/compression/bombs-DONOTOPEN/zip_recursive.zip
diff --git a/exploits/bombs/compression/gz.py b/acsploit/exploits/bombs/compression/gz.py
similarity index 98%
rename from exploits/bombs/compression/gz.py
rename to acsploit/exploits/bombs/compression/gz.py
index 3601393..22f3863 100644
--- a/exploits/bombs/compression/gz.py
+++ b/acsploit/exploits/bombs/compression/gz.py
@@ -1,7 +1,7 @@
 import gzip
 import os
 import io
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('type', 'recursive', 'Type of bomb', ['single_file', 'recursive'])
diff --git a/exploits/bombs/compression/pdf.py b/acsploit/exploits/bombs/compression/pdf.py
similarity index 99%
rename from exploits/bombs/compression/pdf.py
rename to acsploit/exploits/bombs/compression/pdf.py
index df912d1..0811a5b 100644
--- a/exploits/bombs/compression/pdf.py
+++ b/acsploit/exploits/bombs/compression/pdf.py
@@ -1,6 +1,6 @@
 import zlib
 
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('target_payload_memory', 134217728,
diff --git a/exploits/bombs/compression/tar_gz.py b/acsploit/exploits/bombs/compression/tar_gz.py
similarity index 98%
rename from exploits/bombs/compression/tar_gz.py
rename to acsploit/exploits/bombs/compression/tar_gz.py
index 5f2d5b7..d785971 100644
--- a/exploits/bombs/compression/tar_gz.py
+++ b/acsploit/exploits/bombs/compression/tar_gz.py
@@ -3,7 +3,7 @@
 import tarfile
 import math
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/bombs/compression/zip.py b/acsploit/exploits/bombs/compression/zip.py
similarity index 98%
rename from exploits/bombs/compression/zip.py
rename to acsploit/exploits/bombs/compression/zip.py
index 7830e0a..bb7b0d9 100644
--- a/exploits/bombs/compression/zip.py
+++ b/acsploit/exploits/bombs/compression/zip.py
@@ -3,7 +3,7 @@
 import math
 import zipfile
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/bombs/fork/__init__.py b/acsploit/exploits/bombs/fork/__init__.py
similarity index 100%
rename from exploits/bombs/fork/__init__.py
rename to acsploit/exploits/bombs/fork/__init__.py
diff --git a/exploits/bombs/fork/fork_bombs.py b/acsploit/exploits/bombs/fork/fork_bombs.py
similarity index 97%
rename from exploits/bombs/fork/fork_bombs.py
rename to acsploit/exploits/bombs/fork/fork_bombs.py
index 81fd3b1..0ca45f8 100644
--- a/exploits/bombs/fork/fork_bombs.py
+++ b/acsploit/exploits/bombs/fork/fork_bombs.py
@@ -1,6 +1,6 @@
 import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.bash b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.bash
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.bash
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.bash
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.bat b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.bat
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.bat
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.bat
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.c b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.c
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.c
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.c
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.cc b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.cc
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.cc
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.cc
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.cs b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.cs
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.cs
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.cs
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.erl b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.erl
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.erl
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.erl
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.fasm b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.fasm
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.fasm
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.fasm
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.go b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.go
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.go
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.go
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.hs b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.hs
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.hs
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.hs
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.html b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.html
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.html
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.html
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.java b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.java
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.java
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.java
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.js b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.js
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.js
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.js
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.lsp b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.lsp
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.lsp
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.lsp
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.lua b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.lua
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.lua
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.lua
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.mdb b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.mdb
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.mdb
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.mdb
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.php b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.php
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.php
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.php
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.pl b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.pl
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.pl
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.pl
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.py b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.py
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.py
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.py
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.r b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.r
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.r
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.r
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.rb b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.rb
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.rb
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.rb
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.rs b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.rs
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.rs
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.rs
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.s b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.s
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.s
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.s
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.scm b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.scm
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.scm
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.scm
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.sh b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.sh
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.sh
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.sh
diff --git a/exploits/bombs/fork/fork_bombs/fork-bomb.vbs b/acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.vbs
similarity index 100%
rename from exploits/bombs/fork/fork_bombs/fork-bomb.vbs
rename to acsploit/exploits/bombs/fork/fork_bombs/fork-bomb.vbs
diff --git a/exploits/bombs/git/__init__.py b/acsploit/exploits/bombs/git/__init__.py
similarity index 100%
rename from exploits/bombs/git/__init__.py
rename to acsploit/exploits/bombs/git/__init__.py
diff --git a/exploits/bombs/git/git_bombs.py b/acsploit/exploits/bombs/git/git_bombs.py
similarity index 96%
rename from exploits/bombs/git/git_bombs.py
rename to acsploit/exploits/bombs/git/git_bombs.py
index 62a28a0..bc46f0b 100644
--- a/exploits/bombs/git/git_bombs.py
+++ b/acsploit/exploits/bombs/git/git_bombs.py
@@ -1,6 +1,6 @@
 import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/bombs/git/git_bombs/gitbomb10.tar.gz b/acsploit/exploits/bombs/git/git_bombs/gitbomb10.tar.gz
similarity index 100%
rename from exploits/bombs/git/git_bombs/gitbomb10.tar.gz
rename to acsploit/exploits/bombs/git/git_bombs/gitbomb10.tar.gz
diff --git a/exploits/bombs/git/git_bombs/gitbomb20.tar.gz b/acsploit/exploits/bombs/git/git_bombs/gitbomb20.tar.gz
similarity index 100%
rename from exploits/bombs/git/git_bombs/gitbomb20.tar.gz
rename to acsploit/exploits/bombs/git/git_bombs/gitbomb20.tar.gz
diff --git a/exploits/bombs/git/git_bombs/gitbomb30.tar.gz b/acsploit/exploits/bombs/git/git_bombs/gitbomb30.tar.gz
similarity index 100%
rename from exploits/bombs/git/git_bombs/gitbomb30.tar.gz
rename to acsploit/exploits/bombs/git/git_bombs/gitbomb30.tar.gz
diff --git a/exploits/bombs/git/git_bombs/gitbomb40.tar.gz b/acsploit/exploits/bombs/git/git_bombs/gitbomb40.tar.gz
similarity index 100%
rename from exploits/bombs/git/git_bombs/gitbomb40.tar.gz
rename to acsploit/exploits/bombs/git/git_bombs/gitbomb40.tar.gz
diff --git a/exploits/bombs/git/git_bombs/gitbomb50.tar.gz b/acsploit/exploits/bombs/git/git_bombs/gitbomb50.tar.gz
similarity index 100%
rename from exploits/bombs/git/git_bombs/gitbomb50.tar.gz
rename to acsploit/exploits/bombs/git/git_bombs/gitbomb50.tar.gz
diff --git a/exploits/bombs/images/__init__.py b/acsploit/exploits/bombs/images/__init__.py
similarity index 100%
rename from exploits/bombs/images/__init__.py
rename to acsploit/exploits/bombs/images/__init__.py
diff --git a/exploits/bombs/images/badsize.dat b/acsploit/exploits/bombs/images/badsize.dat
similarity index 100%
rename from exploits/bombs/images/badsize.dat
rename to acsploit/exploits/bombs/images/badsize.dat
diff --git a/exploits/bombs/images/deflate.py b/acsploit/exploits/bombs/images/deflate.py
similarity index 100%
rename from exploits/bombs/images/deflate.py
rename to acsploit/exploits/bombs/images/deflate.py
diff --git a/exploits/bombs/images/jpeg_bad_header.py b/acsploit/exploits/bombs/images/jpeg_bad_header.py
similarity index 97%
rename from exploits/bombs/images/jpeg_bad_header.py
rename to acsploit/exploits/bombs/images/jpeg_bad_header.py
index 67b7e4a..867f3ff 100644
--- a/exploits/bombs/images/jpeg_bad_header.py
+++ b/acsploit/exploits/bombs/images/jpeg_bad_header.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 import struct
 import os
 
diff --git a/exploits/bombs/images/jpeg_bomb.py b/acsploit/exploits/bombs/images/jpeg_bomb.py
similarity index 95%
rename from exploits/bombs/images/jpeg_bomb.py
rename to acsploit/exploits/bombs/images/jpeg_bomb.py
index 1aa6f94..eb3ae1b 100644
--- a/exploits/bombs/images/jpeg_bomb.py
+++ b/acsploit/exploits/bombs/images/jpeg_bomb.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 import os
 
 options = Options()
diff --git a/exploits/bombs/images/jpeg_bombs/gray/10K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/10K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/10K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/10K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/gray/20K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/20K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/20K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/20K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/gray/30K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/30K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/30K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/30K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/gray/40K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/40K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/40K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/40K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/gray/50K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/50K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/50K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/50K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/gray/60K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/gray/60K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/gray/60K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/gray/60K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/10K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/10K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/10K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/10K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/20K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/20K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/20K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/20K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/30K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/30K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/30K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/30K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/40K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/40K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/40K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/40K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/50K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/50K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/50K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/50K.jpeg
diff --git a/exploits/bombs/images/jpeg_bombs/rgb/60K.jpeg b/acsploit/exploits/bombs/images/jpeg_bombs/rgb/60K.jpeg
similarity index 100%
rename from exploits/bombs/images/jpeg_bombs/rgb/60K.jpeg
rename to acsploit/exploits/bombs/images/jpeg_bombs/rgb/60K.jpeg
diff --git a/exploits/bombs/images/png.py b/acsploit/exploits/bombs/images/png.py
similarity index 96%
rename from exploits/bombs/images/png.py
rename to acsploit/exploits/bombs/images/png.py
index 85d2e61..43baa7a 100644
--- a/exploits/bombs/images/png.py
+++ b/acsploit/exploits/bombs/images/png.py
@@ -1,5 +1,5 @@
 from .deflate import max_deflate_png
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('width', 225000, 'Desired width of uncompressed PNG in pixels')
diff --git a/exploits/bombs/xml/__init__.py b/acsploit/exploits/bombs/xml/__init__.py
similarity index 100%
rename from exploits/bombs/xml/__init__.py
rename to acsploit/exploits/bombs/xml/__init__.py
diff --git a/exploits/bombs/xml/billion_laughs.py b/acsploit/exploits/bombs/xml/billion_laughs.py
similarity index 97%
rename from exploits/bombs/xml/billion_laughs.py
rename to acsploit/exploits/bombs/xml/billion_laughs.py
index 96b1662..e33e135 100644
--- a/exploits/bombs/xml/billion_laughs.py
+++ b/acsploit/exploits/bombs/xml/billion_laughs.py
@@ -1,7 +1,7 @@
 import math
 import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/bombs/xml/xml_bomb_template.txt b/acsploit/exploits/bombs/xml/xml_bomb_template.txt
similarity index 100%
rename from exploits/bombs/xml/xml_bomb_template.txt
rename to acsploit/exploits/bombs/xml/xml_bomb_template.txt
diff --git a/exploits/geometry/__init__.py b/acsploit/exploits/geometry/__init__.py
similarity index 100%
rename from exploits/geometry/__init__.py
rename to acsploit/exploits/geometry/__init__.py
diff --git a/exploits/geometry/convex_hull.py b/acsploit/exploits/geometry/convex_hull.py
similarity index 97%
rename from exploits/geometry/convex_hull.py
rename to acsploit/exploits/geometry/convex_hull.py
index b6fb490..29b45bb 100644
--- a/exploits/geometry/convex_hull.py
+++ b/acsploit/exploits/geometry/convex_hull.py
@@ -1,5 +1,5 @@
 import math
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/graphs/__init__.py b/acsploit/exploits/graphs/__init__.py
similarity index 100%
rename from exploits/graphs/__init__.py
rename to acsploit/exploits/graphs/__init__.py
diff --git a/exploits/graphs/min_span_tree/__init__.py b/acsploit/exploits/graphs/min_span_tree/__init__.py
similarity index 100%
rename from exploits/graphs/min_span_tree/__init__.py
rename to acsploit/exploits/graphs/min_span_tree/__init__.py
diff --git a/exploits/graphs/min_span_tree/kruskal.py b/acsploit/exploits/graphs/min_span_tree/kruskal.py
similarity index 96%
rename from exploits/graphs/min_span_tree/kruskal.py
rename to acsploit/exploits/graphs/min_span_tree/kruskal.py
index 602911d..cdf76d5 100644
--- a/exploits/graphs/min_span_tree/kruskal.py
+++ b/acsploit/exploits/graphs/min_span_tree/kruskal.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/hashes/__init__.py b/acsploit/exploits/hashes/__init__.py
similarity index 100%
rename from exploits/hashes/__init__.py
rename to acsploit/exploits/hashes/__init__.py
diff --git a/exploits/hashes/collisions/__init__.py b/acsploit/exploits/hashes/collisions/__init__.py
similarity index 100%
rename from exploits/hashes/collisions/__init__.py
rename to acsploit/exploits/hashes/collisions/__init__.py
diff --git a/exploits/hashes/collisions/adler32.py b/acsploit/exploits/hashes/collisions/adler32.py
similarity index 97%
rename from exploits/hashes/collisions/adler32.py
rename to acsploit/exploits/hashes/collisions/adler32.py
index 5bc8f1e..b6ed563 100644
--- a/exploits/hashes/collisions/adler32.py
+++ b/acsploit/exploits/hashes/collisions/adler32.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/bsd.py b/acsploit/exploits/hashes/collisions/bsd.py
similarity index 97%
rename from exploits/hashes/collisions/bsd.py
rename to acsploit/exploits/hashes/collisions/bsd.py
index 046898a..0bcbab0 100644
--- a/exploits/hashes/collisions/bsd.py
+++ b/acsploit/exploits/hashes/collisions/bsd.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/chicken_scheme.py b/acsploit/exploits/hashes/collisions/chicken_scheme.py
similarity index 98%
rename from exploits/hashes/collisions/chicken_scheme.py
rename to acsploit/exploits/hashes/collisions/chicken_scheme.py
index 40c5c36..c54ee94 100644
--- a/exploits/hashes/collisions/chicken_scheme.py
+++ b/acsploit/exploits/hashes/collisions/chicken_scheme.py
@@ -1,6 +1,6 @@
 import z3
 from .z3_common import get_collisions
-from options import Options
+from acsploit.options import Options
 import itertools
 
 options = Options()
diff --git a/exploits/hashes/collisions/crc32.py b/acsploit/exploits/hashes/collisions/crc32.py
similarity index 97%
rename from exploits/hashes/collisions/crc32.py
rename to acsploit/exploits/hashes/collisions/crc32.py
index d5427f3..078ba0c 100644
--- a/exploits/hashes/collisions/crc32.py
+++ b/acsploit/exploits/hashes/collisions/crc32.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/custom_hash.py b/acsploit/exploits/hashes/collisions/custom_hash.py
similarity index 99%
rename from exploits/hashes/collisions/custom_hash.py
rename to acsploit/exploits/hashes/collisions/custom_hash.py
index d9b12ac..c87dcc6 100644
--- a/exploits/hashes/collisions/custom_hash.py
+++ b/acsploit/exploits/hashes/collisions/custom_hash.py
@@ -1,7 +1,7 @@
 import string
 import z3
 
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('hash', '+ * x y z', 'The hash function to use, in prefix notation')
diff --git a/exploits/hashes/collisions/fletcher.py b/acsploit/exploits/hashes/collisions/fletcher.py
similarity index 97%
rename from exploits/hashes/collisions/fletcher.py
rename to acsploit/exploits/hashes/collisions/fletcher.py
index 6faccbb..7ada786 100644
--- a/exploits/hashes/collisions/fletcher.py
+++ b/acsploit/exploits/hashes/collisions/fletcher.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/java.py b/acsploit/exploits/hashes/collisions/java.py
similarity index 97%
rename from exploits/hashes/collisions/java.py
rename to acsploit/exploits/hashes/collisions/java.py
index 09779d3..8a7e02c 100644
--- a/exploits/hashes/collisions/java.py
+++ b/acsploit/exploits/hashes/collisions/java.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 from .java_common import generate_via_half_string_merge, java_hash
 
 
diff --git a/exploits/hashes/collisions/java7_hashmap.py b/acsploit/exploits/hashes/collisions/java7_hashmap.py
similarity index 99%
rename from exploits/hashes/collisions/java7_hashmap.py
rename to acsploit/exploits/hashes/collisions/java7_hashmap.py
index 6d30fac..446dd43 100644
--- a/exploits/hashes/collisions/java7_hashmap.py
+++ b/acsploit/exploits/hashes/collisions/java7_hashmap.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('n_collisions', 10, 'Number of colliding hashes to create')
diff --git a/exploits/hashes/collisions/java8+_hashmap.py b/acsploit/exploits/hashes/collisions/java8+_hashmap.py
similarity index 97%
rename from exploits/hashes/collisions/java8+_hashmap.py
rename to acsploit/exploits/hashes/collisions/java8+_hashmap.py
index 0d80fd8..d137ace 100644
--- a/exploits/hashes/collisions/java8+_hashmap.py
+++ b/acsploit/exploits/hashes/collisions/java8+_hashmap.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/hashes/collisions/java_common.py b/acsploit/exploits/hashes/collisions/java_common.py
similarity index 100%
rename from exploits/hashes/collisions/java_common.py
rename to acsploit/exploits/hashes/collisions/java_common.py
diff --git a/exploits/hashes/collisions/java_fast.py b/acsploit/exploits/hashes/collisions/java_fast.py
similarity index 98%
rename from exploits/hashes/collisions/java_fast.py
rename to acsploit/exploits/hashes/collisions/java_fast.py
index e63798f..1f4413f 100644
--- a/exploits/hashes/collisions/java_fast.py
+++ b/acsploit/exploits/hashes/collisions/java_fast.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 import itertools
 from .java_common import generate_via_half_string_merge, java_hash
 
diff --git a/exploits/hashes/collisions/java_z3.py b/acsploit/exploits/hashes/collisions/java_z3.py
similarity index 97%
rename from exploits/hashes/collisions/java_z3.py
rename to acsploit/exploits/hashes/collisions/java_z3.py
index 7a5a4f2..b66a742 100644
--- a/exploits/hashes/collisions/java_z3.py
+++ b/acsploit/exploits/hashes/collisions/java_z3.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/lrc.py b/acsploit/exploits/hashes/collisions/lrc.py
similarity index 97%
rename from exploits/hashes/collisions/lrc.py
rename to acsploit/exploits/hashes/collisions/lrc.py
index 92029a6..28840fd 100644
--- a/exploits/hashes/collisions/lrc.py
+++ b/acsploit/exploits/hashes/collisions/lrc.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/php5.py b/acsploit/exploits/hashes/collisions/php5.py
similarity index 97%
rename from exploits/hashes/collisions/php5.py
rename to acsploit/exploits/hashes/collisions/php5.py
index dc02dec..01f7e1a 100644
--- a/exploits/hashes/collisions/php5.py
+++ b/acsploit/exploits/hashes/collisions/php5.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 from .php5_common import generate_via_half_string_merge, php_hash
 
 
diff --git a/exploits/hashes/collisions/php5_common.py b/acsploit/exploits/hashes/collisions/php5_common.py
similarity index 100%
rename from exploits/hashes/collisions/php5_common.py
rename to acsploit/exploits/hashes/collisions/php5_common.py
diff --git a/exploits/hashes/collisions/php5_fast.py b/acsploit/exploits/hashes/collisions/php5_fast.py
similarity index 98%
rename from exploits/hashes/collisions/php5_fast.py
rename to acsploit/exploits/hashes/collisions/php5_fast.py
index d2e7b8d..b95bd4b 100644
--- a/exploits/hashes/collisions/php5_fast.py
+++ b/acsploit/exploits/hashes/collisions/php5_fast.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 import itertools
 from .php5_common import generate_via_half_string_merge, php_hash
 
diff --git a/exploits/hashes/collisions/python2_32.py b/acsploit/exploits/hashes/collisions/python2_32.py
similarity index 99%
rename from exploits/hashes/collisions/python2_32.py
rename to acsploit/exploits/hashes/collisions/python2_32.py
index 9dd677b..1cf9aaa 100644
--- a/exploits/hashes/collisions/python2_32.py
+++ b/acsploit/exploits/hashes/collisions/python2_32.py
@@ -1,5 +1,5 @@
 import itertools
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('n_collisions', 10, 'Number of colliding strings to create')
diff --git a/exploits/hashes/collisions/sum.py b/acsploit/exploits/hashes/collisions/sum.py
similarity index 97%
rename from exploits/hashes/collisions/sum.py
rename to acsploit/exploits/hashes/collisions/sum.py
index 0102e1c..e12a059 100644
--- a/exploits/hashes/collisions/sum.py
+++ b/acsploit/exploits/hashes/collisions/sum.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/xor8.py b/acsploit/exploits/hashes/collisions/xor8.py
similarity index 97%
rename from exploits/hashes/collisions/xor8.py
rename to acsploit/exploits/hashes/collisions/xor8.py
index 63e8819..d5f425f 100644
--- a/exploits/hashes/collisions/xor8.py
+++ b/acsploit/exploits/hashes/collisions/xor8.py
@@ -1,5 +1,5 @@
 import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/exploits/hashes/collisions/z3_common.py b/acsploit/exploits/hashes/collisions/z3_common.py
similarity index 100%
rename from exploits/hashes/collisions/z3_common.py
rename to acsploit/exploits/hashes/collisions/z3_common.py
diff --git a/exploits/linear_programming/__init__.py b/acsploit/exploits/linear_programming/__init__.py
similarity index 100%
rename from exploits/linear_programming/__init__.py
rename to acsploit/exploits/linear_programming/__init__.py
diff --git a/exploits/linear_programming/simplex.py b/acsploit/exploits/linear_programming/simplex.py
similarity index 97%
rename from exploits/linear_programming/simplex.py
rename to acsploit/exploits/linear_programming/simplex.py
index f782346..1329ff9 100644
--- a/exploits/linear_programming/simplex.py
+++ b/acsploit/exploits/linear_programming/simplex.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('order', 2, 'Order n of linear program (aka number of equations)')
diff --git a/exploits/networking/__init__.py b/acsploit/exploits/networking/__init__.py
similarity index 100%
rename from exploits/networking/__init__.py
rename to acsploit/exploits/networking/__init__.py
diff --git a/exploits/networking/segment_smack.py b/acsploit/exploits/networking/segment_smack.py
similarity index 99%
rename from exploits/networking/segment_smack.py
rename to acsploit/exploits/networking/segment_smack.py
index f29a08f..c3afbe6 100644
--- a/exploits/networking/segment_smack.py
+++ b/acsploit/exploits/networking/segment_smack.py
@@ -5,7 +5,7 @@
 import netifaces
 import ctypes
 import os
-from options import Options
+from acsploit.options import Options
 import time
 
 try:
diff --git a/exploits/passwords/__init__.py b/acsploit/exploits/passwords/__init__.py
similarity index 100%
rename from exploits/passwords/__init__.py
rename to acsploit/exploits/passwords/__init__.py
diff --git a/exploits/passwords/zxcvbn.py b/acsploit/exploits/passwords/zxcvbn.py
similarity index 97%
rename from exploits/passwords/zxcvbn.py
rename to acsploit/exploits/passwords/zxcvbn.py
index 93118ab..0bc824a 100644
--- a/exploits/passwords/zxcvbn.py
+++ b/acsploit/exploits/passwords/zxcvbn.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('library', "zxcvbn", 'The library to target with worst-case passwords', ['zxcvbn', 'nbvcxz'])
diff --git a/exploits/regex/__init__.py b/acsploit/exploits/regex/__init__.py
similarity index 100%
rename from exploits/regex/__init__.py
rename to acsploit/exploits/regex/__init__.py
diff --git a/exploits/regex/redos.py b/acsploit/exploits/regex/redos.py
similarity index 99%
rename from exploits/regex/redos.py
rename to acsploit/exploits/regex/redos.py
index ca7431a..df46c21 100644
--- a/exploits/regex/redos.py
+++ b/acsploit/exploits/regex/redos.py
@@ -8,7 +8,7 @@
 from scipy.optimize import curve_fit
 import tqdm
 
-from options import Options
+from acsploit.options import Options
 from . import regex_common
 
 options = Options()
diff --git a/exploits/regex/regex_common.py b/acsploit/exploits/regex/regex_common.py
similarity index 100%
rename from exploits/regex/regex_common.py
rename to acsploit/exploits/regex/regex_common.py
diff --git a/exploits/sort/__init__.py b/acsploit/exploits/sort/__init__.py
similarity index 100%
rename from exploits/sort/__init__.py
rename to acsploit/exploits/sort/__init__.py
diff --git a/exploits/sort/bubblesort.py b/acsploit/exploits/sort/bubblesort.py
similarity index 94%
rename from exploits/sort/bubblesort.py
rename to acsploit/exploits/sort/bubblesort.py
index 782e3aa..e73e491 100644
--- a/exploits/sort/bubblesort.py
+++ b/acsploit/exploits/sort/bubblesort.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/sort/bucketsort.py b/acsploit/exploits/sort/bucketsort.py
similarity index 94%
rename from exploits/sort/bucketsort.py
rename to acsploit/exploits/sort/bucketsort.py
index 146bf04..4192fb8 100644
--- a/exploits/sort/bucketsort.py
+++ b/acsploit/exploits/sort/bucketsort.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option('n_inputs', 10, 'Number of elements to sort')
diff --git a/exploits/sort/insertionsort.py b/acsploit/exploits/sort/insertionsort.py
similarity index 94%
rename from exploits/sort/insertionsort.py
rename to acsploit/exploits/sort/insertionsort.py
index 9f2e85d..3876e98 100644
--- a/exploits/sort/insertionsort.py
+++ b/acsploit/exploits/sort/insertionsort.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/sort/mergesort.py b/acsploit/exploits/sort/mergesort.py
similarity index 97%
rename from exploits/sort/mergesort.py
rename to acsploit/exploits/sort/mergesort.py
index ac3e429..4d3b943 100644
--- a/exploits/sort/mergesort.py
+++ b/acsploit/exploits/sort/mergesort.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/sort/quicksort.py b/acsploit/exploits/sort/quicksort.py
similarity index 97%
rename from exploits/sort/quicksort.py
rename to acsploit/exploits/sort/quicksort.py
index 14ab0c0..ab05ca3 100644
--- a/exploits/sort/quicksort.py
+++ b/acsploit/exploits/sort/quicksort.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/strings/__init__.py b/acsploit/exploits/strings/__init__.py
similarity index 100%
rename from exploits/strings/__init__.py
rename to acsploit/exploits/strings/__init__.py
diff --git a/exploits/strings/line_breaking.py b/acsploit/exploits/strings/line_breaking.py
similarity index 94%
rename from exploits/strings/line_breaking.py
rename to acsploit/exploits/strings/line_breaking.py
index 0eaec52..7e97464 100644
--- a/exploits/strings/line_breaking.py
+++ b/acsploit/exploits/strings/line_breaking.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/strings/matching/__init__.py b/acsploit/exploits/strings/matching/__init__.py
similarity index 100%
rename from exploits/strings/matching/__init__.py
rename to acsploit/exploits/strings/matching/__init__.py
diff --git a/exploits/strings/matching/boyer_moore.py b/acsploit/exploits/strings/matching/boyer_moore.py
similarity index 97%
rename from exploits/strings/matching/boyer_moore.py
rename to acsploit/exploits/strings/matching/boyer_moore.py
index 4159c8b..fefeca6 100644
--- a/exploits/strings/matching/boyer_moore.py
+++ b/acsploit/exploits/strings/matching/boyer_moore.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/strings/matching/knuth_morris_pratt.py b/acsploit/exploits/strings/matching/knuth_morris_pratt.py
similarity index 97%
rename from exploits/strings/matching/knuth_morris_pratt.py
rename to acsploit/exploits/strings/matching/knuth_morris_pratt.py
index 71b1f52..6745b0a 100644
--- a/exploits/strings/matching/knuth_morris_pratt.py
+++ b/acsploit/exploits/strings/matching/knuth_morris_pratt.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/strings/matching/rabin_karp.py b/acsploit/exploits/strings/matching/rabin_karp.py
similarity index 97%
rename from exploits/strings/matching/rabin_karp.py
rename to acsploit/exploits/strings/matching/rabin_karp.py
index 65fd8f5..a52b7e2 100644
--- a/exploits/strings/matching/rabin_karp.py
+++ b/acsploit/exploits/strings/matching/rabin_karp.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/tree/__init__.py b/acsploit/exploits/tree/__init__.py
similarity index 100%
rename from exploits/tree/__init__.py
rename to acsploit/exploits/tree/__init__.py
diff --git a/exploits/tree/avl_tree.py b/acsploit/exploits/tree/avl_tree.py
similarity index 94%
rename from exploits/tree/avl_tree.py
rename to acsploit/exploits/tree/avl_tree.py
index 28839c3..487cf42 100644
--- a/exploits/tree/avl_tree.py
+++ b/acsploit/exploits/tree/avl_tree.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/tree/b_tree.py b/acsploit/exploits/tree/b_tree.py
similarity index 94%
rename from exploits/tree/b_tree.py
rename to acsploit/exploits/tree/b_tree.py
index b331328..a81fc5b 100644
--- a/exploits/tree/b_tree.py
+++ b/acsploit/exploits/tree/b_tree.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/tree/binary_search_tree.py b/acsploit/exploits/tree/binary_search_tree.py
similarity index 97%
rename from exploits/tree/binary_search_tree.py
rename to acsploit/exploits/tree/binary_search_tree.py
index f10c1f5..c20f437 100644
--- a/exploits/tree/binary_search_tree.py
+++ b/acsploit/exploits/tree/binary_search_tree.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/tree/heap.py b/acsploit/exploits/tree/heap.py
similarity index 96%
rename from exploits/tree/heap.py
rename to acsploit/exploits/tree/heap.py
index 009e973..4fc03a1 100644
--- a/exploits/tree/heap.py
+++ b/acsploit/exploits/tree/heap.py
@@ -1,5 +1,5 @@
 import logging
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/exploits/tree/huffman.py b/acsploit/exploits/tree/huffman.py
similarity index 96%
rename from exploits/tree/huffman.py
rename to acsploit/exploits/tree/huffman.py
index 7688a34..cbc2f07 100644
--- a/exploits/tree/huffman.py
+++ b/acsploit/exploits/tree/huffman.py
@@ -1,5 +1,5 @@
 import math
-from options import Options
+from acsploit.options import Options
 
 
 # TODO - add option to optimize for filesize or huffman tree depth
diff --git a/exploits/tree/red_black_tree.py b/acsploit/exploits/tree/red_black_tree.py
similarity index 94%
rename from exploits/tree/red_black_tree.py
rename to acsploit/exploits/tree/red_black_tree.py
index f1e0fae..10e2745 100644
--- a/exploits/tree/red_black_tree.py
+++ b/acsploit/exploits/tree/red_black_tree.py
@@ -1,4 +1,4 @@
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/input/__init__.py b/acsploit/input/__init__.py
similarity index 77%
rename from input/__init__.py
rename to acsploit/input/__init__.py
index d1f2fb6..da65260 100644
--- a/input/__init__.py
+++ b/acsploit/input/__init__.py
@@ -2,4 +2,4 @@
 from .floats import FloatGenerator
 from .ints import IntGenerator
 from .strings import StringGenerator
-from .regex import RegexMatchGenerator
+from .regex import RegexMatchGenerator
\ No newline at end of file
diff --git a/input/chars.py b/acsploit/input/chars.py
similarity index 98%
rename from input/chars.py
rename to acsploit/input/chars.py
index c1d1d34..20d6715 100644
--- a/input/chars.py
+++ b/acsploit/input/chars.py
@@ -1,6 +1,6 @@
 import random
 import string
-from options import Options
+from acsploit.options import Options
 
 
 class CharGenerator:
diff --git a/input/floats.py b/acsploit/input/floats.py
similarity index 98%
rename from input/floats.py
rename to acsploit/input/floats.py
index 87356df..d11426b 100644
--- a/input/floats.py
+++ b/acsploit/input/floats.py
@@ -1,5 +1,5 @@
 import random
-from options import Options
+from acsploit.options import Options
 
 
 class FloatGenerator:
diff --git a/input/ints.py b/acsploit/input/ints.py
similarity index 98%
rename from input/ints.py
rename to acsploit/input/ints.py
index f068b09..cdc2ae0 100644
--- a/input/ints.py
+++ b/acsploit/input/ints.py
@@ -1,6 +1,6 @@
 import random
 import math
-from options import Options
+from acsploit.options import Options
 
 
 class IntGenerator:
diff --git a/input/regex.py b/acsploit/input/regex.py
similarity index 98%
rename from input/regex.py
rename to acsploit/input/regex.py
index a577222..1c10484 100644
--- a/input/regex.py
+++ b/acsploit/input/regex.py
@@ -1,6 +1,6 @@
 import exrex
 import re
-from options import Options
+from acsploit.options import Options
 
 
 class RegexMatchGenerator:
diff --git a/input/strings.py b/acsploit/input/strings.py
similarity index 99%
rename from input/strings.py
rename to acsploit/input/strings.py
index 988140d..bd1f666 100644
--- a/input/strings.py
+++ b/acsploit/input/strings.py
@@ -1,6 +1,6 @@
 import random
 from .chars import CharGenerator
-from options import Options
+from acsploit.options import Options
 
 
 class StringGenerator:
diff --git a/options/__init__.py b/acsploit/options/__init__.py
similarity index 100%
rename from options/__init__.py
rename to acsploit/options/__init__.py
diff --git a/options/options.py b/acsploit/options/options.py
similarity index 100%
rename from options/options.py
rename to acsploit/options/options.py
diff --git a/output/__init__.py b/acsploit/output/__init__.py
similarity index 100%
rename from output/__init__.py
rename to acsploit/output/__init__.py
diff --git a/output/files.py b/acsploit/output/files.py
similarity index 99%
rename from output/files.py
rename to acsploit/output/files.py
index 145ccb2..47cb2fb 100644
--- a/output/files.py
+++ b/acsploit/output/files.py
@@ -1,5 +1,5 @@
 import os
-from options import Options
+from acsploit.options import Options
 from . import output_common
 
 
diff --git a/output/http.py b/acsploit/output/http.py
similarity index 99%
rename from output/http.py
rename to acsploit/output/http.py
index 01fa8b9..4d0e772 100644
--- a/output/http.py
+++ b/acsploit/output/http.py
@@ -2,7 +2,7 @@
 import requests
 import multiprocessing.pool
 
-from options import Options
+from acsploit.options import Options
 from . import output_common
 
 
diff --git a/output/output_common.py b/acsploit/output/output_common.py
similarity index 100%
rename from output/output_common.py
rename to acsploit/output/output_common.py
diff --git a/output/socket.py b/acsploit/output/socket.py
similarity index 98%
rename from output/socket.py
rename to acsploit/output/socket.py
index 2e66407..b77374e 100644
--- a/output/socket.py
+++ b/acsploit/output/socket.py
@@ -2,7 +2,7 @@
 import socket
 
 from . import output_common
-from options import Options
+from acsploit.options import Options
 
 
 class Socket:
diff --git a/output/stdout.py b/acsploit/output/stdout.py
similarity index 97%
rename from output/stdout.py
rename to acsploit/output/stdout.py
index 59f1261..dc28fc6 100644
--- a/output/stdout.py
+++ b/acsploit/output/stdout.py
@@ -1,6 +1,6 @@
 import os
 import sys
-from options import Options
+from acsploit.options import Options
 from . import output_common
 
 
diff --git a/docs/exploits/bombs/compression/gz.html b/docs/exploits/bombs/compression/gz.html
index e8b8edf..a6001f0 100644
--- a/docs/exploits/bombs/compression/gz.html
+++ b/docs/exploits/bombs/compression/gz.html
@@ -25,7 +25,7 @@ <h1 class="title"><code>exploits.bombs.compression.gz</code> module</h1>
 <pre><code class="python">import gzip
 import os
 import io
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/bombs/compression/tar_gz.html b/docs/exploits/bombs/compression/tar_gz.html
index 2864a8f..e62cba1 100644
--- a/docs/exploits/bombs/compression/tar_gz.html
+++ b/docs/exploits/bombs/compression/tar_gz.html
@@ -27,7 +27,7 @@ <h1 class="title"><code>exploits.bombs.compression.tar_gz</code> module</h1>
 import tarfile
 import math
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/bombs/compression/zip.html b/docs/exploits/bombs/compression/zip.html
index 7e2e3bb..87e23c0 100644
--- a/docs/exploits/bombs/compression/zip.html
+++ b/docs/exploits/bombs/compression/zip.html
@@ -27,7 +27,7 @@ <h1 class="title"><code>exploits.bombs.compression.zip</code> module</h1>
 import math
 import zipfile
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/bombs/fork/fork_bombs.html b/docs/exploits/bombs/fork/fork_bombs.html
index e354c54..6959198 100644
--- a/docs/exploits/bombs/fork/fork_bombs.html
+++ b/docs/exploits/bombs/fork/fork_bombs.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>exploits.bombs.fork.fork_bombs</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/bombs/git/git_bombs.html b/docs/exploits/bombs/git/git_bombs.html
index 7f22fc8..c39847a 100644
--- a/docs/exploits/bombs/git/git_bombs.html
+++ b/docs/exploits/bombs/git/git_bombs.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>exploits.bombs.git.git_bombs</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/bombs/images/png.html b/docs/exploits/bombs/images/png.html
index 605f8d5..0430ecb 100644
--- a/docs/exploits/bombs/images/png.html
+++ b/docs/exploits/bombs/images/png.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.bombs.images.png</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">from .deflate import max_deflate_png
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option(&#39;width&#39;, 225000, &#39;Desired width of uncompressed png in pixels&#39;)
diff --git a/docs/exploits/bombs/xml/billion_laughs.html b/docs/exploits/bombs/xml/billion_laughs.html
index f336650..8c5a2bf 100644
--- a/docs/exploits/bombs/xml/billion_laughs.html
+++ b/docs/exploits/bombs/xml/billion_laughs.html
@@ -25,7 +25,7 @@ <h1 class="title"><code>exploits.bombs.xml.billion_laughs</code> module</h1>
 <pre><code class="python">import math
 import os
 
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/geometry/convex_hull.html b/docs/exploits/geometry/convex_hull.html
index 184faf5..efae82a 100644
--- a/docs/exploits/geometry/convex_hull.html
+++ b/docs/exploits/geometry/convex_hull.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.geometry.convex_hull</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import math
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/graphs/min_span_tree/kruskal.html b/docs/exploits/graphs/min_span_tree/kruskal.html
index 1d6e249..cfefaaa 100644
--- a/docs/exploits/graphs/min_span_tree/kruskal.html
+++ b/docs/exploits/graphs/min_span_tree/kruskal.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.graphs.min_span_tree.kruskal</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/hashes/collisions/adler32.html b/docs/exploits/hashes/collisions/adler32.html
index 47b59c6..b5f85f0 100644
--- a/docs/exploits/hashes/collisions/adler32.html
+++ b/docs/exploits/hashes/collisions/adler32.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.adler32</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/bsd.html b/docs/exploits/hashes/collisions/bsd.html
index 6bf8184..775b8e0 100644
--- a/docs/exploits/hashes/collisions/bsd.html
+++ b/docs/exploits/hashes/collisions/bsd.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.bsd</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/custom_hash.html b/docs/exploits/hashes/collisions/custom_hash.html
index 5866eec..aca1e4b 100644
--- a/docs/exploits/hashes/collisions/custom_hash.html
+++ b/docs/exploits/hashes/collisions/custom_hash.html
@@ -25,7 +25,7 @@ <h1 class="title"><code>exploits.hashes.collisions.custom_hash</code> module</h1
 <pre><code class="python">import string
 import z3
 
-from options import Options
+from acsploit.options import Options
 
 options = Options()
 options.add_option(&#39;hash&#39;, &#39;+ * x y z&#39;, &#39;The hash function to use, in prefix notation&#39;)
diff --git a/docs/exploits/hashes/collisions/fletcher.html b/docs/exploits/hashes/collisions/fletcher.html
index d6a7aeb..71aec81 100644
--- a/docs/exploits/hashes/collisions/fletcher.html
+++ b/docs/exploits/hashes/collisions/fletcher.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.fletcher</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/java.html b/docs/exploits/hashes/collisions/java.html
index 3187939..6c8f38d 100644
--- a/docs/exploits/hashes/collisions/java.html
+++ b/docs/exploits/hashes/collisions/java.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.java</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import itertools
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/hashes/collisions/lrc.html b/docs/exploits/hashes/collisions/lrc.html
index 33bd047..51adf18 100644
--- a/docs/exploits/hashes/collisions/lrc.html
+++ b/docs/exploits/hashes/collisions/lrc.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.lrc</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/sum.html b/docs/exploits/hashes/collisions/sum.html
index b5ff49d..f7d435b 100644
--- a/docs/exploits/hashes/collisions/sum.html
+++ b/docs/exploits/hashes/collisions/sum.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.sum</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/xor8.html b/docs/exploits/hashes/collisions/xor8.html
index 05a100d..e1ff17d 100644
--- a/docs/exploits/hashes/collisions/xor8.html
+++ b/docs/exploits/hashes/collisions/xor8.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.xor8</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from.z3_common import get_collisions
 
 
diff --git a/docs/exploits/hashes/collisions/z3_java.html b/docs/exploits/hashes/collisions/z3_java.html
index affcfc3..c1a961b 100644
--- a/docs/exploits/hashes/collisions/z3_java.html
+++ b/docs/exploits/hashes/collisions/z3_java.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.hashes.collisions.z3_java</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import z3
-from options import Options
+from acsploit.options import Options
 from .z3_common import get_collisions
 
 
diff --git a/docs/exploits/linear_programming/simplex.html b/docs/exploits/linear_programming/simplex.html
index 69cf5c6..46f0674 100644
--- a/docs/exploits/linear_programming/simplex.html
+++ b/docs/exploits/linear_programming/simplex.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.linear_programming.simplex</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 options = Options()
 options.add_option(&#39;order&#39;, 2, &#39;Order n of linear program (aka number of equations)&#39;)
diff --git a/docs/exploits/sort/bubblesort.html b/docs/exploits/sort/bubblesort.html
index 8f572ce..4426fcf 100644
--- a/docs/exploits/sort/bubblesort.html
+++ b/docs/exploits/sort/bubblesort.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.sort.bubblesort</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/sort/bucketsort.html b/docs/exploits/sort/bucketsort.html
index ca27a59..cae0ca0 100644
--- a/docs/exploits/sort/bucketsort.html
+++ b/docs/exploits/sort/bucketsort.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.sort.bucketsort</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 options = Options()
 options.add_option(&#39;n_inputs&#39;, 10, &#39;Number of elements to sort&#39;)
diff --git a/docs/exploits/sort/insertionsort.html b/docs/exploits/sort/insertionsort.html
index 652d12c..1a13e58 100644
--- a/docs/exploits/sort/insertionsort.html
+++ b/docs/exploits/sort/insertionsort.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.sort.insertionsort</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/sort/mergesort.html b/docs/exploits/sort/mergesort.html
index 1e62f07..8da956e 100644
--- a/docs/exploits/sort/mergesort.html
+++ b/docs/exploits/sort/mergesort.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.sort.mergesort</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/sort/quicksort.html b/docs/exploits/sort/quicksort.html
index b7c2e43..0f8954e 100644
--- a/docs/exploits/sort/quicksort.html
+++ b/docs/exploits/sort/quicksort.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.sort.quicksort</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/strings/line_breaking.html b/docs/exploits/strings/line_breaking.html
index 144503f..565da39 100644
--- a/docs/exploits/strings/line_breaking.html
+++ b/docs/exploits/strings/line_breaking.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.strings.line_breaking</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/strings/matching/boyer_moore.html b/docs/exploits/strings/matching/boyer_moore.html
index 14df1f7..94b3a4a 100644
--- a/docs/exploits/strings/matching/boyer_moore.html
+++ b/docs/exploits/strings/matching/boyer_moore.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.strings.matching.boyer_moore</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/strings/matching/knuth_moore_pratt.html b/docs/exploits/strings/matching/knuth_moore_pratt.html
index ff66a32..9fc07db 100644
--- a/docs/exploits/strings/matching/knuth_moore_pratt.html
+++ b/docs/exploits/strings/matching/knuth_moore_pratt.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.strings.matching.knuth_moore_pratt</code> modul
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/strings/matching/rabin_karp.html b/docs/exploits/strings/matching/rabin_karp.html
index 76e5620..8575f04 100644
--- a/docs/exploits/strings/matching/rabin_karp.html
+++ b/docs/exploits/strings/matching/rabin_karp.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.strings.matching.rabin_karp</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/tree/avl_tree.html b/docs/exploits/tree/avl_tree.html
index e7b64af..c3cf349 100644
--- a/docs/exploits/tree/avl_tree.html
+++ b/docs/exploits/tree/avl_tree.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.tree.avl_tree</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/tree/b_tree.html b/docs/exploits/tree/b_tree.html
index 93f9ba0..33be997 100644
--- a/docs/exploits/tree/b_tree.html
+++ b/docs/exploits/tree/b_tree.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.tree.b_tree</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/tree/binary_search_tree.html b/docs/exploits/tree/binary_search_tree.html
index 8ff91c7..f3ba5e1 100644
--- a/docs/exploits/tree/binary_search_tree.html
+++ b/docs/exploits/tree/binary_search_tree.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.tree.binary_search_tree</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/tree/heap.html b/docs/exploits/tree/heap.html
index 116181a..a17d8b9 100644
--- a/docs/exploits/tree/heap.html
+++ b/docs/exploits/tree/heap.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.tree.heap</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import logging
-from options import Options
+from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/exploits/tree/huffman.html b/docs/exploits/tree/huffman.html
index a26dc03..21793e0 100644
--- a/docs/exploits/tree/huffman.html
+++ b/docs/exploits/tree/huffman.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>exploits.tree.huffman</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import math
-from options import Options
+from acsploit.options import Options
 
 
 # TODO - add option to optimize for filesize or huffman tree depth
diff --git a/docs/exploits/tree/red_black_tree.html b/docs/exploits/tree/red_black_tree.html
index 12741f5..0a3513d 100644
--- a/docs/exploits/tree/red_black_tree.html
+++ b/docs/exploits/tree/red_black_tree.html
@@ -22,7 +22,7 @@ <h1 class="title"><code>exploits.tree.red_black_tree</code> module</h1>
 <section id="section-intro">
 <details class="source">
 <summary>Source code</summary>
-<pre><code class="python">from options import Options
+<pre><code class="python">from acsploit.options import Options
 
 
 options = Options()
diff --git a/docs/index.html b/docs/index.html
index 26860ab..b857c14 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -43,7 +43,7 @@ <h1 class="title"><code>acsploit</code> module</h1>
 import argparse
 import importlib
 
-from options import Options
+from acsploit.options import Options
 
 
 def eprint(*args, **kwargs):
diff --git a/docs/input/chars.html b/docs/input/chars.html
index 9f838fc..51c9cad 100644
--- a/docs/input/chars.html
+++ b/docs/input/chars.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>input.chars</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import random
 import string
-from options import Options
+from acsploit.options import Options
 
 
 class CharGenerator:
diff --git a/docs/input/floats.html b/docs/input/floats.html
index 2f4dc89..6e2ec6e 100644
--- a/docs/input/floats.html
+++ b/docs/input/floats.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>input.floats</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import random
-from options import Options
+from acsploit.options import Options
 
 
 class FloatGenerator:
diff --git a/docs/input/ints.html b/docs/input/ints.html
index 7be4271..32e004d 100644
--- a/docs/input/ints.html
+++ b/docs/input/ints.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>input.ints</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import random
 import math
-from options import Options
+from acsploit.options import Options
 
 
 class IntGenerator:
diff --git a/docs/input/regex.html b/docs/input/regex.html
index a88c7c0..c24193e 100644
--- a/docs/input/regex.html
+++ b/docs/input/regex.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>input.regex</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import exrex
 import re
-from options import Options
+from acsploit.options import Options
 
 
 class RegexMatchGenerator:
diff --git a/docs/input/strings.html b/docs/input/strings.html
index d98660d..5322f80 100644
--- a/docs/input/strings.html
+++ b/docs/input/strings.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>input.strings</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import random
 from .chars import CharGenerator
-from options import Options
+from acsploit.options import Options
 
 
 class StringGenerator:
diff --git a/docs/output/files.html b/docs/output/files.html
index 854e15b..3493492 100644
--- a/docs/output/files.html
+++ b/docs/output/files.html
@@ -23,7 +23,7 @@ <h1 class="title"><code>output.files</code> module</h1>
 <details class="source">
 <summary>Source code</summary>
 <pre><code class="python">import os
-from options import Options
+from acsploit.options import Options
 
 
 class File:
diff --git a/docs/output/http.html b/docs/output/http.html
index 7375cb8..1d58f03 100644
--- a/docs/output/http.html
+++ b/docs/output/http.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>output.http</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import os
 import requests
-from options import Options
+from acsploit.options import Options
 
 
 class Http:
diff --git a/docs/output/socket.html b/docs/output/socket.html
index 049001b..3a56746 100644
--- a/docs/output/socket.html
+++ b/docs/output/socket.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>output.socket</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import os
 import socket
-from options import Options
+from acsploit.options import Options
 
 
 class Socket:
diff --git a/docs/output/stdout.html b/docs/output/stdout.html
index eb8efe9..c9c250a 100644
--- a/docs/output/stdout.html
+++ b/docs/output/stdout.html
@@ -24,7 +24,7 @@ <h1 class="title"><code>output.stdout</code> module</h1>
 <summary>Source code</summary>
 <pre><code class="python">import os
 import sys
-from options import Options
+from acsploit.options import Options
 
 
 class Stdout:
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..b5a3c46
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,6 @@
+[build-system]
+requires = [
+    "setuptools>=42",
+    "wheel"
+]
+build-backend = "setuptools.build_meta"
\ No newline at end of file
diff --git a/requirements.in b/requirements.in
deleted file mode 100644
index ce5182a..0000000
--- a/requirements.in
+++ /dev/null
@@ -1,19 +0,0 @@
-# requirements.in
-colorama
-cmd2
-delayed-assert
-exrex
-graphviz
-more-itertools
-netifaces
-pdoc3
-ply
-pypng
-pytest-cov
-pytest-xdist
-python-utils
-requests
-scapy
-scipy
-tqdm
-z3-solver
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 8e394b7..46fafb0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,7 @@
 # This file is autogenerated by pip-compile
 # To update, run:
 #
-#    pip-compile requirements.in
+#    pip-compile
 #
 apipkg==1.5
     # via execnet
@@ -15,21 +15,21 @@ certifi==2020.12.5
 chardet==4.0.0
     # via requests
 cmd2==1.5.0
-    # via -r requirements.in
+    # via acsploit (setup.py)
 colorama==0.4.4
     # via
-    #   -r requirements.in
+    #   acsploit (setup.py)
     #   cmd2
 coverage==5.5
     # via pytest-cov
 delayed-assert==0.3.5
-    # via -r requirements.in
+    # via acsploit (setup.py)
 execnet==1.8.0
     # via pytest-xdist
 exrex==0.10.5
-    # via -r requirements.in
+    # via acsploit (setup.py)
 graphviz==0.16
-    # via -r requirements.in
+    # via acsploit (setup.py)
 idna==2.10
     # via requests
 iniconfig==1.1.1
@@ -41,19 +41,19 @@ markdown==3.3.4
 markupsafe==1.1.1
     # via mako
 more-itertools==8.7.0
-    # via -r requirements.in
+    # via acsploit (setup.py)
 netifaces==0.10.9
-    # via -r requirements.in
+    # via acsploit (setup.py)
 numpy==1.20.2
     # via scipy
 packaging==20.9
     # via pytest
 pdoc3==0.9.2
-    # via -r requirements.in
+    # via acsploit (setup.py)
 pluggy==0.13.1
     # via pytest
 ply==3.11
-    # via -r requirements.in
+    # via acsploit (setup.py)
 py==1.10.0
     # via
     #   pytest
@@ -63,35 +63,35 @@ pyparsing==2.4.7
 pyperclip==1.8.2
     # via cmd2
 pypng==0.0.20
-    # via -r requirements.in
+    # via acsploit (setup.py)
 pytest-cov==2.11.1
-    # via -r requirements.in
+    # via acsploit (setup.py)
 pytest-forked==1.3.0
     # via pytest-xdist
 pytest-xdist==2.2.1
-    # via -r requirements.in
+    # via acsploit (setup.py)
 pytest==6.2.3
     # via
     #   pytest-cov
     #   pytest-forked
     #   pytest-xdist
 python-utils==2.5.6
-    # via -r requirements.in
+    # via acsploit (setup.py)
 requests==2.25.1
-    # via -r requirements.in
+    # via acsploit (setup.py)
 scapy==2.4.4
-    # via -r requirements.in
+    # via acsploit (setup.py)
 scipy==1.6.2
-    # via -r requirements.in
+    # via acsploit (setup.py)
 six==1.15.0
     # via python-utils
 toml==0.10.2
     # via pytest
 tqdm==4.60.0
-    # via -r requirements.in
+    # via acsploit (setup.py)
 urllib3==1.26.4
     # via requests
 wcwidth==0.2.5
     # via cmd2
 z3-solver==4.8.10.0
-    # via -r requirements.in
+    # via acsploit (setup.py)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..e4b8e7d
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,76 @@
+"""A setuptools based setup module.
+
+See:
+https://packaging.python.org/guides/distributing-packages-using-setuptools/
+https://github.com/pypa/sampleproject
+"""
+
+# Always prefer setuptools over distutils
+from setuptools import setup, find_packages
+import pathlib
+
+here = pathlib.Path(__file__).parent.resolve()
+
+# Get the long description from the README file
+long_description = (here / 'README.md').read_text(encoding='utf-8')
+
+# Arguments marked as "Required" below must be included for upload to PyPI.
+# Fields marked as "Optional" may be commented out.
+
+setup(
+    name='acsploit',
+    version='1.0.0',
+    description='A tool for generating worst-case inputs for algorithms',
+    long_description=long_description,
+    long_description_content_type='text/markdown',
+    url='https://github.com/twosixlabs/acsploit',
+    author='twosixlabs',
+
+    packages=find_packages(),
+
+    python_requires='>=3.5, <4',
+
+    install_requires=[
+        'colorama',
+        'cmd2',
+        'delayed-assert',
+        'exrex',
+        'graphviz',
+        'more-itertools',
+        'netifaces',
+        'pdoc3',
+        'ply',
+        'pypng',
+        'pytest-cov',
+        'pytest-xdist',
+        'python-utils',
+        'requests',
+        'scapy',
+        'scipy',
+        'tqdm',
+        'z3-solver',
+    ],
+
+    # If there are data files included in your packages that need to be
+    # installed, specify them here.
+    package_data={  # Optional
+        'acsploit.exploits': [
+            'exploits/bombs/compression/bombs-DONOTOPEN/*.gz',
+            'exploits/bombs/compression/bombs-DONOTOPEN/zip_recursive.zip',
+            'exploits/bombs/git/git_bombs/*.gz',
+            'exploits/bombs/images/badsize.dat',
+            'exploits/bombs/images/jpeg_bombs/*/*.jpeg',
+            'exploits/bombs/xml/xml_bomb_template.txt',
+            'exploits/bombs/fork/fork_bombs/fork-bomb.*',
+            'exploits/bombs/fork/fork_bombs/fork-bomb.*',
+        ],
+    },
+
+    entry_points={
+        'console_scripts': [
+            'acsploit=acsploit.__main__:main',
+            'acsploit-test=acsploit.test.test_acsploit:test_acsploit_init',
+        ],
+    },
+
+)


Test patch:
diff --git a/test/__init__.py b/acsploit/test/__init__.py
similarity index 100%
rename from test/__init__.py
rename to acsploit/test/__init__.py
diff --git a/test/exploits/__init__.py b/acsploit/test/exploits/__init__.py
similarity index 100%
rename from test/exploits/__init__.py
rename to acsploit/test/exploits/__init__.py
diff --git a/test/exploits/bombs/__init__.py b/acsploit/test/exploits/bombs/__init__.py
similarity index 100%
rename from test/exploits/bombs/__init__.py
rename to acsploit/test/exploits/bombs/__init__.py
diff --git a/test/exploits/bombs/compression/__init__.py b/acsploit/test/exploits/bombs/compression/__init__.py
similarity index 100%
rename from test/exploits/bombs/compression/__init__.py
rename to acsploit/test/exploits/bombs/compression/__init__.py
diff --git a/test/exploits/bombs/compression/test_gz.py b/acsploit/test/exploits/bombs/compression/test_gz.py
similarity index 100%
rename from test/exploits/bombs/compression/test_gz.py
rename to acsploit/test/exploits/bombs/compression/test_gz.py
diff --git a/test/exploits/bombs/compression/test_pdf.py b/acsploit/test/exploits/bombs/compression/test_pdf.py
similarity index 100%
rename from test/exploits/bombs/compression/test_pdf.py
rename to acsploit/test/exploits/bombs/compression/test_pdf.py
diff --git a/test/exploits/bombs/compression/test_tar_gz.py b/acsploit/test/exploits/bombs/compression/test_tar_gz.py
similarity index 100%
rename from test/exploits/bombs/compression/test_tar_gz.py
rename to acsploit/test/exploits/bombs/compression/test_tar_gz.py
diff --git a/test/exploits/bombs/compression/test_zip.py b/acsploit/test/exploits/bombs/compression/test_zip.py
similarity index 100%
rename from test/exploits/bombs/compression/test_zip.py
rename to acsploit/test/exploits/bombs/compression/test_zip.py
diff --git a/test/exploits/bombs/fork/__init__.py b/acsploit/test/exploits/bombs/fork/__init__.py
similarity index 100%
rename from test/exploits/bombs/fork/__init__.py
rename to acsploit/test/exploits/bombs/fork/__init__.py
diff --git a/test/exploits/bombs/fork/test_fork_bombs.py b/acsploit/test/exploits/bombs/fork/test_fork_bombs.py
similarity index 100%
rename from test/exploits/bombs/fork/test_fork_bombs.py
rename to acsploit/test/exploits/bombs/fork/test_fork_bombs.py
diff --git a/test/exploits/bombs/git/__init__.py b/acsploit/test/exploits/bombs/git/__init__.py
similarity index 100%
rename from test/exploits/bombs/git/__init__.py
rename to acsploit/test/exploits/bombs/git/__init__.py
diff --git a/test/exploits/bombs/git/test_git_bombs.py b/acsploit/test/exploits/bombs/git/test_git_bombs.py
similarity index 100%
rename from test/exploits/bombs/git/test_git_bombs.py
rename to acsploit/test/exploits/bombs/git/test_git_bombs.py
diff --git a/test/exploits/bombs/images/__init__.py b/acsploit/test/exploits/bombs/images/__init__.py
similarity index 100%
rename from test/exploits/bombs/images/__init__.py
rename to acsploit/test/exploits/bombs/images/__init__.py
diff --git a/test/exploits/bombs/images/test_jpeg_bad_header.py b/acsploit/test/exploits/bombs/images/test_jpeg_bad_header.py
similarity index 100%
rename from test/exploits/bombs/images/test_jpeg_bad_header.py
rename to acsploit/test/exploits/bombs/images/test_jpeg_bad_header.py
diff --git a/test/exploits/bombs/images/test_jpeg_bomb.py b/acsploit/test/exploits/bombs/images/test_jpeg_bomb.py
similarity index 100%
rename from test/exploits/bombs/images/test_jpeg_bomb.py
rename to acsploit/test/exploits/bombs/images/test_jpeg_bomb.py
diff --git a/test/exploits/bombs/images/test_png.py b/acsploit/test/exploits/bombs/images/test_png.py
similarity index 100%
rename from test/exploits/bombs/images/test_png.py
rename to acsploit/test/exploits/bombs/images/test_png.py
diff --git a/test/exploits/bombs/xml/__init__.py b/acsploit/test/exploits/bombs/xml/__init__.py
similarity index 100%
rename from test/exploits/bombs/xml/__init__.py
rename to acsploit/test/exploits/bombs/xml/__init__.py
diff --git a/test/exploits/bombs/xml/test_billion_laughts.py b/acsploit/test/exploits/bombs/xml/test_billion_laughts.py
similarity index 100%
rename from test/exploits/bombs/xml/test_billion_laughts.py
rename to acsploit/test/exploits/bombs/xml/test_billion_laughts.py
diff --git a/test/exploits/dummy_output.py b/acsploit/test/exploits/dummy_output.py
similarity index 100%
rename from test/exploits/dummy_output.py
rename to acsploit/test/exploits/dummy_output.py
diff --git a/test/exploits/geometry/__init__.py b/acsploit/test/exploits/geometry/__init__.py
similarity index 100%
rename from test/exploits/geometry/__init__.py
rename to acsploit/test/exploits/geometry/__init__.py
diff --git a/test/exploits/geometry/test_convex_hull.py b/acsploit/test/exploits/geometry/test_convex_hull.py
similarity index 100%
rename from test/exploits/geometry/test_convex_hull.py
rename to acsploit/test/exploits/geometry/test_convex_hull.py
diff --git a/test/exploits/graphs/__init__.py b/acsploit/test/exploits/graphs/__init__.py
similarity index 100%
rename from test/exploits/graphs/__init__.py
rename to acsploit/test/exploits/graphs/__init__.py
diff --git a/test/exploits/graphs/min_span_tree/__init__.py b/acsploit/test/exploits/graphs/min_span_tree/__init__.py
similarity index 100%
rename from test/exploits/graphs/min_span_tree/__init__.py
rename to acsploit/test/exploits/graphs/min_span_tree/__init__.py
diff --git a/test/exploits/graphs/min_span_tree/test_kruskal.py b/acsploit/test/exploits/graphs/min_span_tree/test_kruskal.py
similarity index 100%
rename from test/exploits/graphs/min_span_tree/test_kruskal.py
rename to acsploit/test/exploits/graphs/min_span_tree/test_kruskal.py
diff --git a/test/exploits/hashes/__init__.py b/acsploit/test/exploits/hashes/__init__.py
similarity index 100%
rename from test/exploits/hashes/__init__.py
rename to acsploit/test/exploits/hashes/__init__.py
diff --git a/test/exploits/hashes/collisions/__init__.py b/acsploit/test/exploits/hashes/collisions/__init__.py
similarity index 100%
rename from test/exploits/hashes/collisions/__init__.py
rename to acsploit/test/exploits/hashes/collisions/__init__.py
diff --git a/test/exploits/hashes/collisions/test_adler32.py b/acsploit/test/exploits/hashes/collisions/test_adler32.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_adler32.py
rename to acsploit/test/exploits/hashes/collisions/test_adler32.py
diff --git a/test/exploits/hashes/collisions/test_bsd.py b/acsploit/test/exploits/hashes/collisions/test_bsd.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_bsd.py
rename to acsploit/test/exploits/hashes/collisions/test_bsd.py
diff --git a/test/exploits/hashes/collisions/test_chicken_scheme.py b/acsploit/test/exploits/hashes/collisions/test_chicken_scheme.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_chicken_scheme.py
rename to acsploit/test/exploits/hashes/collisions/test_chicken_scheme.py
diff --git a/test/exploits/hashes/collisions/test_crc32.py b/acsploit/test/exploits/hashes/collisions/test_crc32.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_crc32.py
rename to acsploit/test/exploits/hashes/collisions/test_crc32.py
diff --git a/test/exploits/hashes/collisions/test_custom_hash.py b/acsploit/test/exploits/hashes/collisions/test_custom_hash.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_custom_hash.py
rename to acsploit/test/exploits/hashes/collisions/test_custom_hash.py
diff --git a/test/exploits/hashes/collisions/test_fletcher.py b/acsploit/test/exploits/hashes/collisions/test_fletcher.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_fletcher.py
rename to acsploit/test/exploits/hashes/collisions/test_fletcher.py
diff --git a/test/exploits/hashes/collisions/test_java.py b/acsploit/test/exploits/hashes/collisions/test_java.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_java.py
rename to acsploit/test/exploits/hashes/collisions/test_java.py
diff --git a/test/exploits/hashes/collisions/test_java7_hashmap.py b/acsploit/test/exploits/hashes/collisions/test_java7_hashmap.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_java7_hashmap.py
rename to acsploit/test/exploits/hashes/collisions/test_java7_hashmap.py
diff --git a/test/exploits/hashes/collisions/test_java_fast.py b/acsploit/test/exploits/hashes/collisions/test_java_fast.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_java_fast.py
rename to acsploit/test/exploits/hashes/collisions/test_java_fast.py
diff --git a/test/exploits/hashes/collisions/test_java_z3.py b/acsploit/test/exploits/hashes/collisions/test_java_z3.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_java_z3.py
rename to acsploit/test/exploits/hashes/collisions/test_java_z3.py
diff --git a/test/exploits/hashes/collisions/test_lrc.py b/acsploit/test/exploits/hashes/collisions/test_lrc.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_lrc.py
rename to acsploit/test/exploits/hashes/collisions/test_lrc.py
diff --git a/test/exploits/hashes/collisions/test_php5.py b/acsploit/test/exploits/hashes/collisions/test_php5.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_php5.py
rename to acsploit/test/exploits/hashes/collisions/test_php5.py
diff --git a/test/exploits/hashes/collisions/test_php5_fast.py b/acsploit/test/exploits/hashes/collisions/test_php5_fast.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_php5_fast.py
rename to acsploit/test/exploits/hashes/collisions/test_php5_fast.py
diff --git a/test/exploits/hashes/collisions/test_python2_32.py b/acsploit/test/exploits/hashes/collisions/test_python2_32.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_python2_32.py
rename to acsploit/test/exploits/hashes/collisions/test_python2_32.py
diff --git a/test/exploits/hashes/collisions/test_sum.py b/acsploit/test/exploits/hashes/collisions/test_sum.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_sum.py
rename to acsploit/test/exploits/hashes/collisions/test_sum.py
diff --git a/test/exploits/hashes/collisions/test_xor8.py b/acsploit/test/exploits/hashes/collisions/test_xor8.py
similarity index 100%
rename from test/exploits/hashes/collisions/test_xor8.py
rename to acsploit/test/exploits/hashes/collisions/test_xor8.py
diff --git a/test/exploits/linear_programming/__init__.py b/acsploit/test/exploits/linear_programming/__init__.py
similarity index 100%
rename from test/exploits/linear_programming/__init__.py
rename to acsploit/test/exploits/linear_programming/__init__.py
diff --git a/test/exploits/linear_programming/test_simplex.py b/acsploit/test/exploits/linear_programming/test_simplex.py
similarity index 100%
rename from test/exploits/linear_programming/test_simplex.py
rename to acsploit/test/exploits/linear_programming/test_simplex.py
diff --git a/test/exploits/passwords/__init__.py b/acsploit/test/exploits/passwords/__init__.py
similarity index 100%
rename from test/exploits/passwords/__init__.py
rename to acsploit/test/exploits/passwords/__init__.py
diff --git a/test/exploits/passwords/test_zxcvbn.py b/acsploit/test/exploits/passwords/test_zxcvbn.py
similarity index 100%
rename from test/exploits/passwords/test_zxcvbn.py
rename to acsploit/test/exploits/passwords/test_zxcvbn.py
diff --git a/test/exploits/regex/__init__.py b/acsploit/test/exploits/regex/__init__.py
similarity index 100%
rename from test/exploits/regex/__init__.py
rename to acsploit/test/exploits/regex/__init__.py
diff --git a/test/exploits/regex/test_redos.py b/acsploit/test/exploits/regex/test_redos.py
similarity index 100%
rename from test/exploits/regex/test_redos.py
rename to acsploit/test/exploits/regex/test_redos.py
diff --git a/test/exploits/regex/test_regex_common.py b/acsploit/test/exploits/regex/test_regex_common.py
similarity index 100%
rename from test/exploits/regex/test_regex_common.py
rename to acsploit/test/exploits/regex/test_regex_common.py
diff --git a/test/exploits/sort/test_bubblesort.py b/acsploit/test/exploits/sort/test_bubblesort.py
similarity index 100%
rename from test/exploits/sort/test_bubblesort.py
rename to acsploit/test/exploits/sort/test_bubblesort.py
diff --git a/test/exploits/sort/test_bucketsort.py b/acsploit/test/exploits/sort/test_bucketsort.py
similarity index 100%
rename from test/exploits/sort/test_bucketsort.py
rename to acsploit/test/exploits/sort/test_bucketsort.py
diff --git a/test/exploits/sort/test_insertionsort.py b/acsploit/test/exploits/sort/test_insertionsort.py
similarity index 100%
rename from test/exploits/sort/test_insertionsort.py
rename to acsploit/test/exploits/sort/test_insertionsort.py
diff --git a/test/exploits/sort/test_mergesort.py b/acsploit/test/exploits/sort/test_mergesort.py
similarity index 100%
rename from test/exploits/sort/test_mergesort.py
rename to acsploit/test/exploits/sort/test_mergesort.py
diff --git a/test/exploits/sort/test_quicksort.py b/acsploit/test/exploits/sort/test_quicksort.py
similarity index 100%
rename from test/exploits/sort/test_quicksort.py
rename to acsploit/test/exploits/sort/test_quicksort.py
diff --git a/test/exploits/strings/__init__.py b/acsploit/test/exploits/strings/__init__.py
similarity index 100%
rename from test/exploits/strings/__init__.py
rename to acsploit/test/exploits/strings/__init__.py
diff --git a/test/exploits/strings/matching/__init__.py b/acsploit/test/exploits/strings/matching/__init__.py
similarity index 100%
rename from test/exploits/strings/matching/__init__.py
rename to acsploit/test/exploits/strings/matching/__init__.py
diff --git a/test/exploits/strings/matching/test_boyer_moore.py b/acsploit/test/exploits/strings/matching/test_boyer_moore.py
similarity index 100%
rename from test/exploits/strings/matching/test_boyer_moore.py
rename to acsploit/test/exploits/strings/matching/test_boyer_moore.py
diff --git a/test/exploits/strings/matching/test_knuth_morris_pratt.py b/acsploit/test/exploits/strings/matching/test_knuth_morris_pratt.py
similarity index 100%
rename from test/exploits/strings/matching/test_knuth_morris_pratt.py
rename to acsploit/test/exploits/strings/matching/test_knuth_morris_pratt.py
diff --git a/test/exploits/strings/matching/test_rabin_karp.py b/acsploit/test/exploits/strings/matching/test_rabin_karp.py
similarity index 100%
rename from test/exploits/strings/matching/test_rabin_karp.py
rename to acsploit/test/exploits/strings/matching/test_rabin_karp.py
diff --git a/test/exploits/strings/test_line_breaking.py b/acsploit/test/exploits/strings/test_line_breaking.py
similarity index 100%
rename from test/exploits/strings/test_line_breaking.py
rename to acsploit/test/exploits/strings/test_line_breaking.py
diff --git a/test/exploits/tree/__init__.py b/acsploit/test/exploits/tree/__init__.py
similarity index 100%
rename from test/exploits/tree/__init__.py
rename to acsploit/test/exploits/tree/__init__.py
diff --git a/test/exploits/tree/test_avl_tree.py b/acsploit/test/exploits/tree/test_avl_tree.py
similarity index 100%
rename from test/exploits/tree/test_avl_tree.py
rename to acsploit/test/exploits/tree/test_avl_tree.py
diff --git a/test/exploits/tree/test_b_tree.py b/acsploit/test/exploits/tree/test_b_tree.py
similarity index 100%
rename from test/exploits/tree/test_b_tree.py
rename to acsploit/test/exploits/tree/test_b_tree.py
diff --git a/test/exploits/tree/test_binary_search_tree.py b/acsploit/test/exploits/tree/test_binary_search_tree.py
similarity index 100%
rename from test/exploits/tree/test_binary_search_tree.py
rename to acsploit/test/exploits/tree/test_binary_search_tree.py
diff --git a/test/exploits/tree/test_heap.py b/acsploit/test/exploits/tree/test_heap.py
similarity index 100%
rename from test/exploits/tree/test_heap.py
rename to acsploit/test/exploits/tree/test_heap.py
diff --git a/test/exploits/tree/test_huffman.py b/acsploit/test/exploits/tree/test_huffman.py
similarity index 100%
rename from test/exploits/tree/test_huffman.py
rename to acsploit/test/exploits/tree/test_huffman.py
diff --git a/test/exploits/tree/test_red_black_tree.py b/acsploit/test/exploits/tree/test_red_black_tree.py
similarity index 100%
rename from test/exploits/tree/test_red_black_tree.py
rename to acsploit/test/exploits/tree/test_red_black_tree.py
diff --git a/test/input/__init__.py b/acsploit/test/input/__init__.py
similarity index 100%
rename from test/input/__init__.py
rename to acsploit/test/input/__init__.py
diff --git a/test/input/test_chars.py b/acsploit/test/input/test_chars.py
similarity index 100%
rename from test/input/test_chars.py
rename to acsploit/test/input/test_chars.py
diff --git a/test/input/test_floats.py b/acsploit/test/input/test_floats.py
similarity index 100%
rename from test/input/test_floats.py
rename to acsploit/test/input/test_floats.py
diff --git a/test/input/test_ints.py b/acsploit/test/input/test_ints.py
similarity index 100%
rename from test/input/test_ints.py
rename to acsploit/test/input/test_ints.py
diff --git a/test/input/test_strings.py b/acsploit/test/input/test_strings.py
similarity index 100%
rename from test/input/test_strings.py
rename to acsploit/test/input/test_strings.py
diff --git a/test/output/__init__.py b/acsploit/test/output/__init__.py
similarity index 100%
rename from test/output/__init__.py
rename to acsploit/test/output/__init__.py
diff --git a/test/output/template.txt b/acsploit/test/output/template.txt
similarity index 100%
rename from test/output/template.txt
rename to acsploit/test/output/template.txt
diff --git a/test/output/test_files.py b/acsploit/test/output/test_files.py
similarity index 100%
rename from test/output/test_files.py
rename to acsploit/test/output/test_files.py
diff --git a/test/output/test_http.py b/acsploit/test/output/test_http.py
similarity index 100%
rename from test/output/test_http.py
rename to acsploit/test/output/test_http.py
diff --git a/test/output/test_socket.py b/acsploit/test/output/test_socket.py
similarity index 100%
rename from test/output/test_socket.py
rename to acsploit/test/output/test_socket.py
diff --git a/test/output/test_stdout.py b/acsploit/test/output/test_stdout.py
similarity index 100%
rename from test/output/test_stdout.py
rename to acsploit/test/output/test_stdout.py
diff --git a/test/test_acsploit.py b/acsploit/test/test_acsploit.py
similarity index 100%
rename from test/test_acsploit.py
rename to acsploit/test/test_acsploit.py