text: import os.path
  import sublime
  import sublime_plugin
  
  hacker_enabled = False
  
  
  class HackerTyperCommand(sublime_plugin.TextCommand):
  
      def run(self, edit, enable=False, content=False):
          global hacker_enabled
          hacker_enabled = enable
  
          if content is False:
              return
  
          # Replace contents
          self.view.replace(edit, sublime.Region(0, len(content)), content)
  
  
  class HackerTyper(sublime_plugin.EventListener):
      solution_exists = False
      hacker_buffer = ""
  
      def on_activated(self, view):
          # Don't check for solution files if the plugin is disabled
          if hacker_enabled is False:
              return
  
          # Check if the current file has a solution
          filename = view.file_name()
          if filename is None:
              return
  
          solution = filename + ".hackertyper"
          self.solution_exists = os.path.isfile(solution)
  
          # Give a feedback message if no solution was found
          # Clear the status bar if one was found
          if not self.solution_exists:
              err = "HackerTyper Error: " + os.path.basename(filename)
              err += ".hackertyper not found"
              return sublime.status_message(err)
          else:
              sublime.status_message("")
  
          # Read the entire solution text
          self.hacker_buffer = open(solution, encoding='utf-8').read()
  
      def on_modified_async(self, view):
          global hacker_enabled
  
          if hacker_enabled is False or self.solution_exists is False:
              return
  
          # Fetch correct part of the buffer
          bufSize = view.size()
  
          # Fall back if we're outrunning the original solution
          if bufSize > len(self.hacker_buffer):
              return
  
          newBuf = self.hacker_buffer[:bufSize]
  
          view.run_command("hacker_typer", {"enable": True, "content": newBuf})
  