text: ace.define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module) {
  "use strict";
  var event = require("../lib/event");
  
  exports.contextMenuHandler = function(e){
      var host = e.target;
      var text = host.textInput.getElement();
      if (!host.selection.isEmpty())
          return;
      var c = host.getCursorPosition();
      var r = host.session.getWordRange(c.row, c.column);
      var w = host.session.getTextRange(r);
  
      host.session.tokenRe.lastIndex = 0;
      if (!host.session.tokenRe.test(w))
          return;
      var PLACEHOLDER = "\x01\x01";
      var value = w + " " + PLACEHOLDER;
      text.value = value;
      text.setSelectionRange(w.length, w.length + 1);
      text.setSelectionRange(0, 0);
      text.setSelectionRange(0, w.length);
  
      var afterKeydown = false;
      event.addListener(text, "keydown", function onKeydown() {
          event.removeListener(text, "keydown", onKeydown);
          afterKeydown = true;
      });
  
      host.textInput.setInputHandler(function(newVal) {
          console.log(newVal , value, text.selectionStart, text.selectionEnd)
          if (newVal == value)
              return '';
          if (newVal.lastIndexOf(value, 0) === 0)
              return newVal.slice(value.length);
          if (newVal.substr(text.selectionEnd) == value)
              return newVal.slice(0, -value.length);
          if (newVal.slice(-2) == PLACEHOLDER) {
              var val = newVal.slice(0, -2);
              if (val.slice(-1) == " ") {
                  if (afterKeydown)
                      return val.substring(0, text.selectionEnd);
                  val = val.slice(0, -1);
                  host.session.replace(r, val);
                  return "";
              }
          }
  
          return newVal;
      });
  };
  var Editor = require("../editor").Editor;
  require("../config").defineOptions(Editor.prototype, "editor", {
      spellcheck: {
          set: function(val) {
              var text = this.textInput.getElement();
              text.spellcheck = !!val;
              if (!val)
                  this.removeListener("nativecontextmenu", exports.contextMenuHandler);
              else
                  this.on("nativecontextmenu", exports.contextMenuHandler);
          },
          value: true
      }
  });
  
  });
  ;
                  (function() {
                      ace.require(["ace/ext/spellcheck"], function() {});
                  })();
              