{"version":3,"file":"vendor2.3eb16dde.js","sources":["../../node_modules/ace-builds/src-noconflict/ace.js","../../node_modules/react-ace/lib/editorOptions.js","../../node_modules/react-ace/lib/ace.js","../../node_modules/ace-builds/src-noconflict/ext-split.js","../../node_modules/lodash.get/index.js","../../node_modules/react-ace/lib/split.js","../../node_modules/diff-match-patch/index.js","../../node_modules/react-ace/lib/diff.js","../../node_modules/react-ace/lib/index.js"],"sourcesContent":["/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\")\n return;\n\n\nvar define = function(module, deps, payload) {\n if (typeof module !== \"string\") {\n if (define.original)\n define.original.apply(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _require = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n var params = [];\n for (var i = 0, l = module.length; i < l; ++i) {\n var dep = lookup(parentId, module[i]);\n if (dep == undefined && require.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar require = function(module, callback) {\n var packagedModule = _require(\"\", module, callback);\n if (packagedModule == undefined && require.original)\n return require.original.apply(this, arguments);\n return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n // normalize plugin requires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n // normalize relative requires\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = base + \"/\" + moduleName;\n\n while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n moduleName = normalizeModule(parentId, moduleName);\n\n var module = define.modules[moduleName];\n if (!module) {\n module = define.payloads[moduleName];\n if (typeof module === 'function') {\n var exports = {};\n var mod = {\n id: moduleName,\n uri: '',\n exports: exports,\n packaged: true\n };\n\n var req = function(module, callback) {\n return _require(moduleName, module, callback);\n };\n\n var returnValue = module(req, exports, mod);\n exports = returnValue || mod.exports;\n define.modules[moduleName] = exports;\n delete define.payloads[moduleName];\n }\n module = define.modules[moduleName] = exports || module;\n }\n return module;\n};\n\nfunction exportAce(ns) {\n var root = global;\n if (ns) {\n if (!global[ns])\n global[ns] = {};\n root = global[ns];\n }\n\n if (!root.define || !root.define.packaged) {\n define.original = root.define;\n root.define = define;\n root.define.packaged = true;\n }\n\n if (!root.require || !root.require.packaged) {\n require.original = root.require;\n root.require = require;\n root.require.packaged = true;\n }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nif (typeof Element != \"undefined\" && !Element.prototype.remove) {\n Object.defineProperty(Element.prototype, \"remove\", {\n enumerable: false,\n writable: true,\n configurable: true,\n value: function() { this.parentNode && this.parentNode.removeChild(this); }\n });\n}\n\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nexports.OS = {\n LINUX: \"LINUX\",\n MAC: \"MAC\",\n WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n if (exports.isMac) {\n return exports.OS.MAC;\n } else if (exports.isLinux) {\n return exports.OS.LINUX;\n } else {\n return exports.OS.WINDOWS;\n }\n};\nvar _navigator = typeof navigator == \"object\" ? navigator : {};\n\nvar os = (/mac|win|linux/i.exec(_navigator.platform) || [\"other\"])[0].toLowerCase();\nvar ua = _navigator.userAgent || \"\";\nvar appName = _navigator.appName || \"\";\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (appName == \"Microsoft Internet Explorer\" || appName.indexOf(\"MSAppHost\") >= 0)\n ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = ua.match(/ Gecko\\/\\d+/);\nexports.isOpera = typeof opera == \"object\" && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isEdge = parseFloat(ua.split(\" Edge/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isAndroid = ua.indexOf(\"Android\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\nexports.isMobile = exports.isIOS || exports.isAndroid;\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"./useragent\"); \nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.buildDom = function buildDom(arr, parent, refs) {\n if (typeof arr == \"string\" && arr) {\n var txt = document.createTextNode(arr);\n if (parent)\n parent.appendChild(txt);\n return txt;\n }\n \n if (!Array.isArray(arr)) {\n if (arr && arr.appendChild && parent)\n parent.appendChild(arr);\n return arr;\n }\n if (typeof arr[0] != \"string\" || !arr[0]) {\n var els = [];\n for (var i = 0; i < arr.length; i++) {\n var ch = buildDom(arr[i], parent, refs);\n ch && els.push(ch);\n }\n return els;\n }\n \n var el = document.createElement(arr[0]);\n var options = arr[1];\n var childIndex = 1;\n if (options && typeof options == \"object\" && !Array.isArray(options))\n childIndex = 2;\n for (var i = childIndex; i < arr.length; i++)\n buildDom(arr[i], el, refs);\n if (childIndex == 2) {\n Object.keys(options).forEach(function(n) {\n var val = options[n];\n if (n === \"class\") {\n el.className = Array.isArray(val) ? val.join(\" \") : val;\n } else if (typeof val == \"function\" || n == \"value\" || n[0] == \"$\") {\n el[n] = val;\n } else if (n === \"ref\") {\n if (refs) refs[val] = el;\n } else if (n === \"style\") {\n if (typeof val == \"string\") el.style.cssText = val;\n } else if (val != null) {\n el.setAttribute(n, val);\n }\n });\n }\n if (parent)\n parent.appendChild(el);\n return el;\n};\n\nexports.getDocumentHead = function(doc) {\n if (!doc)\n doc = document;\n return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n return document.createElementNS ?\n document.createElementNS(ns || XHTML_NS, tag) :\n document.createElement(tag);\n};\n\nexports.removeChildren = function(element) {\n element.innerHTML = \"\";\n};\n\nexports.createTextNode = function(textContent, element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createTextNode(textContent);\n};\n\nexports.createFragment = function(element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createDocumentFragment();\n};\n\nexports.hasCssClass = function(el, name) {\n var classes = (el.className + \"\").split(/\\s+/g);\n return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n if (!exports.hasCssClass(el, name)) {\n el.className += \" \" + name;\n }\n};\nexports.removeCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n classes.splice(index, 1);\n }\n el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g), add = true;\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n add = false;\n classes.splice(index, 1);\n }\n if (add)\n classes.push(name);\n\n el.className = classes.join(\" \");\n return add;\n};\nexports.setCssClass = function(node, className, include) {\n if (include) {\n exports.addCssClass(node, className);\n } else {\n exports.removeCssClass(node, className);\n }\n};\n\nexports.hasCssString = function(id, doc) {\n var index = 0, sheets;\n doc = doc || document;\n if ((sheets = doc.querySelectorAll(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id)\n return true;\n }\n};\n\nvar strictCSP;\nvar cssCache = [];\nexports.useStrictCSP = function(value) {\n strictCSP = value;\n if (value == false) insertPendingStyles();\n else if (!cssCache) cssCache = [];\n};\n\nfunction insertPendingStyles() {\n var cache = cssCache;\n cssCache = null;\n cache && cache.forEach(function(item) {\n importCssString(item[0], item[1]);\n });\n}\n\nfunction importCssString(cssText, id, target) {\n if (typeof document == \"undefined\")\n return;\n if (cssCache) {\n if (target) {\n insertPendingStyles();\n } else if (target === false) {\n return cssCache.push([cssText, id]);\n }\n }\n if (strictCSP) return;\n\n var container = target;\n if (!target || !target.getRootNode) {\n container = document;\n } else {\n container = target.getRootNode();\n if (!container || container == target)\n container = document;\n }\n \n var doc = container.ownerDocument || container;\n if (id && exports.hasCssString(id, container))\n return null;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n var style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n if (container == doc)\n container = exports.getDocumentHead(doc);\n container.insertBefore(style, container.firstChild);\n}\nexports.importCssString = importCssString;\n\nexports.importCssStylsheet = function(uri, doc) {\n exports.buildDom([\"link\", {rel: \"stylesheet\", href: uri}], exports.getDocumentHead(doc));\n};\nexports.scrollbarWidth = function(document) {\n var inner = exports.createElement(\"ace_inner\");\n inner.style.width = \"100%\";\n inner.style.minWidth = \"0px\";\n inner.style.height = \"200px\";\n inner.style.display = \"block\";\n\n var outer = exports.createElement(\"ace_outer\");\n var style = outer.style;\n\n style.position = \"absolute\";\n style.left = \"-10000px\";\n style.overflow = \"hidden\";\n style.width = \"200px\";\n style.minWidth = \"0px\";\n style.height = \"150px\";\n style.display = \"block\";\n\n outer.appendChild(inner);\n\n var body = document.documentElement;\n body.appendChild(outer);\n\n var noScrollbar = inner.offsetWidth;\n\n style.overflow = \"scroll\";\n var withScrollbar = inner.offsetWidth;\n\n if (noScrollbar == withScrollbar) {\n withScrollbar = outer.clientWidth;\n }\n\n body.removeChild(outer);\n\n return noScrollbar-withScrollbar;\n};\n\nexports.computedStyle = function(element, style) {\n return window.getComputedStyle(element, \"\") || {};\n};\n\nexports.setStyle = function(styles, property, value) {\n if (styles[property] !== value) {\n styles[property] = value;\n }\n};\n\nexports.HAS_CSS_ANIMATION = false;\nexports.HAS_CSS_TRANSFORMS = false;\nexports.HI_DPI = useragent.isWin\n ? typeof window !== \"undefined\" && window.devicePixelRatio >= 1.5\n : true;\n\nif (useragent.isChromeOS) exports.HI_DPI = false;\n\nif (typeof document !== \"undefined\") {\n var div = document.createElement(\"div\");\n if (exports.HI_DPI && div.style.transform !== undefined)\n exports.HAS_CSS_TRANSFORMS = true;\n if (!useragent.isEdge && typeof div.style.animationName !== \"undefined\")\n exports.HAS_CSS_ANIMATION = true;\n div = null;\n}\n\nif (exports.HAS_CSS_TRANSFORMS) {\n exports.translate = function(element, tx, ty) {\n element.style.transform = \"translate(\" + Math.round(tx) + \"px, \" + Math.round(ty) +\"px)\";\n };\n} else {\n exports.translate = function(element, tx, ty) {\n element.style.top = Math.round(ty) + \"px\";\n element.style.left = Math.round(tx) + \"px\";\n };\n}\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\n\nexports.mixin = function(obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\n\nexports.implement = function(proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta',\n 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8, \n \"control\": 1\n },\n\n FUNCTION_KEYS : {\n 8 : \"Backspace\",\n 9 : \"Tab\",\n 13 : \"Return\",\n 19 : \"Pause\",\n 27 : \"Esc\",\n 32 : \"Space\",\n 33 : \"PageUp\",\n 34 : \"PageDown\",\n 35 : \"End\",\n 36 : \"Home\",\n 37 : \"Left\",\n 38 : \"Up\",\n 39 : \"Right\",\n 40 : \"Down\",\n 44 : \"Print\",\n 45 : \"Insert\",\n 46 : \"Delete\",\n 96 : \"Numpad0\",\n 97 : \"Numpad1\",\n 98 : \"Numpad2\",\n 99 : \"Numpad3\",\n 100: \"Numpad4\",\n 101: \"Numpad5\",\n 102: \"Numpad6\",\n 103: \"Numpad7\",\n 104: \"Numpad8\",\n 105: \"Numpad9\",\n '-13': \"NumpadEnter\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"Numlock\",\n 145: \"Scrolllock\"\n },\n\n PRINTABLE_KEYS: {\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n }\n };\n var name, i;\n for (i in ret.FUNCTION_KEYS) {\n name = ret.FUNCTION_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n for (i in ret.PRINTABLE_KEYS) {\n name = ret.PRINTABLE_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n oop.mixin(ret, ret.MODIFIER_KEYS);\n oop.mixin(ret, ret.PRINTABLE_KEYS);\n oop.mixin(ret, ret.FUNCTION_KEYS);\n ret.enter = ret[\"return\"];\n ret.escape = ret.esc;\n ret.del = ret[\"delete\"];\n ret[173] = '-';\n \n (function() {\n var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n for (var i = Math.pow(2, mods.length); i--;) { \n ret.KEY_MODS[i] = mods.filter(function(x) {\n return i & ret.KEY_MODS[x];\n }).join(\"-\") + \"-\";\n }\n })();\n\n ret.KEY_MODS[0] = \"\";\n ret.KEY_MODS[-1] = \"input-\";\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n var keyString = Keys[keyCode];\n if (typeof keyString != \"string\")\n keyString = String.fromCharCode(keyCode);\n return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nvar activeListenerOptions;\nfunction detectListenerOptionsSupport() {\n activeListenerOptions = false;\n try {\n document.createComment(\"\").addEventListener(\"test\", function() {}, { \n get passive() { \n activeListenerOptions = {passive: false};\n }\n });\n } catch(e) {}\n}\n\nfunction getListenerOptions() {\n if (activeListenerOptions == undefined)\n detectListenerOptionsSupport();\n return activeListenerOptions;\n}\n\nfunction EventListener(elem, type, callback) {\n this.elem = elem;\n this.type = type;\n this.callback = callback;\n}\nEventListener.prototype.destroy = function() {\n removeListener(this.elem, this.type, this.callback);\n this.elem = this.type = this.callback = undefined;\n};\n\nvar addListener = exports.addListener = function(elem, type, callback, destroyer) {\n elem.addEventListener(type, callback, getListenerOptions());\n if (destroyer)\n destroyer.$toDestroy.push(new EventListener(elem, type, callback));\n};\n\nvar removeListener = exports.removeListener = function(elem, type, callback) {\n elem.removeEventListener(type, callback, getListenerOptions());\n};\nexports.stopEvent = function(e) {\n exports.stopPropagation(e);\n exports.preventDefault(e);\n return false;\n};\n\nexports.stopPropagation = function(e) {\n if (e.stopPropagation)\n e.stopPropagation();\n};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n return 2;\n return e.button;\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n var ownerDocument = el && el.ownerDocument || document;\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n removeListener(ownerDocument, \"mousemove\", eventHandler);\n removeListener(ownerDocument, \"mouseup\", onMouseUp);\n removeListener(ownerDocument, \"dragstart\", onMouseUp);\n }\n\n addListener(ownerDocument, \"mousemove\", eventHandler);\n addListener(ownerDocument, \"mouseup\", onMouseUp);\n addListener(ownerDocument, \"dragstart\", onMouseUp);\n \n return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback, destroyer) {\n if (\"onmousewheel\" in el) {\n addListener(el, \"mousewheel\", function(e) {\n var factor = 8;\n if (e.wheelDeltaX !== undefined) {\n e.wheelX = -e.wheelDeltaX / factor;\n e.wheelY = -e.wheelDeltaY / factor;\n } else {\n e.wheelX = 0;\n e.wheelY = -e.wheelDelta / factor;\n }\n callback(e);\n }, destroyer);\n } else if (\"onwheel\" in el) {\n addListener(el, \"wheel\", function(e) {\n var factor = 0.35;\n switch (e.deltaMode) {\n case e.DOM_DELTA_PIXEL:\n e.wheelX = e.deltaX * factor || 0;\n e.wheelY = e.deltaY * factor || 0;\n break;\n case e.DOM_DELTA_LINE:\n case e.DOM_DELTA_PAGE:\n e.wheelX = (e.deltaX || 0) * 5;\n e.wheelY = (e.deltaY || 0) * 5;\n break;\n }\n \n callback(e);\n }, destroyer);\n } else {\n addListener(el, \"DOMMouseScroll\", function(e) {\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n e.wheelX = (e.detail || 0) * 5;\n e.wheelY = 0;\n } else {\n e.wheelX = 0;\n e.wheelY = (e.detail || 0) * 5;\n }\n callback(e);\n }, destroyer);\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(e) {\n if (exports.getButton(e) !== 0) {\n clicks = 0;\n } else if (e.detail > 1) {\n clicks++;\n if (clicks > 4)\n clicks = 1;\n } else {\n clicks = 1;\n }\n if (useragent.isIE) {\n var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n if (!timer || isNewClick)\n clicks = 1;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n \n e._clicks = clicks;\n\n eventHandler[callbackName](\"mousedown\", e);\n\n if (clicks > 4)\n clicks = 0;\n else if (clicks > 1)\n return eventHandler[callbackName](eventNames[clicks], e);\n }\n if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n addListener(el, \"mousedown\", onMousedown, destroyer);\n });\n};\n\nvar getModifierHash = function(e) {\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n};\n\nexports.getModifierString = function(e) {\n return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n var hashId = getModifierHash(e);\n\n if (!useragent.isMac && pressedKeys) {\n if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n hashId |= 8;\n if (pressedKeys.altGr) {\n if ((3 & hashId) != 3)\n pressedKeys.altGr = 0;\n else\n return;\n }\n if (keyCode === 18 || keyCode === 17) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (keyCode === 17 && location === 1) {\n if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (location === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n \n if (useragent.isChromeOS && hashId & 8) {\n callback(e, hashId, keyCode);\n if (e.defaultPrevented)\n return;\n else\n hashId &= ~8;\n }\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n return false;\n }\n \n return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback, destroyer) {\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n }, destroyer);\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n }, destroyer);\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n }, destroyer);\n\n addListener(el, \"keypress\", function(e) {\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n exports.stopEvent(e);\n lastDefaultPrevented = null;\n }\n }, destroyer);\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n }, destroyer);\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n var postMessageId = 1;\n exports.nextTick = function(callback, win) {\n win = win || window;\n var messageName = \"zero-timeout-message-\" + (postMessageId++);\n \n var listener = function(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n removeListener(win, \"message\", listener);\n callback();\n }\n };\n \n addListener(win, \"message\", listener);\n win.postMessage(messageName, \"*\");\n };\n}\n\nexports.$idleBlocked = false;\nexports.onIdle = function(cb, timeout) {\n return setTimeout(function handler() {\n if (!exports.$idleBlocked) {\n cb();\n } else {\n setTimeout(handler, 100);\n }\n }, timeout);\n};\n\nexports.$idleBlockId = null;\nexports.blockIdle = function(delay) {\n if (exports.$idleBlockId)\n clearTimeout(exports.$idleBlockId);\n \n exports.$idleBlocked = true;\n exports.$idleBlockId = setTimeout(function() {\n exports.$idleBlocked = false;\n }, delay || 100);\n};\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.msRequestAnimationFrame\n || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n exports.nextFrame = exports.nextFrame.bind(window);\nelse\n exports.nextFrame = function(callback) {\n setTimeout(callback, 17);\n };\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n\n this.end = {\n row: endRow,\n column: endColumn\n };\n};\n\n(function() {\n this.isEqual = function(range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n this.toString = function() {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n\n this.contains = function(row, column) {\n return this.compare(row, column) == 0;\n };\n this.compareRange = function(range) {\n var cmp,\n end = range.end,\n start = range.start;\n\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n } else if (cmp == 0) {\n return 1;\n } else {\n return 0;\n }\n } else if (cmp == -1) {\n return -2;\n } else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n } else if (cmp == 1) {\n return 42;\n } else {\n return 0;\n }\n }\n };\n this.comparePoint = function(p) {\n return this.compare(p.row, p.column);\n };\n this.containsRange = function(range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n this.intersects = function(range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n this.isEnd = function(row, column) {\n return this.end.row == row && this.end.column == column;\n };\n this.isStart = function(row, column) {\n return this.start.row == row && this.start.column == column;\n };\n this.setStart = function(row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n } else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n this.setEnd = function(row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n } else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n this.inside = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideStart = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideEnd = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.compare = function(row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n }\n }\n\n if (row < this.start.row)\n return -1;\n\n if (row > this.end.row)\n return 1;\n\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n\n return 0;\n };\n this.compareStart = function(row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareEnd = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareInside = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.clipRows = function(firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = {row: lastRow + 1, column: 0};\n else if (this.end.row < firstRow)\n var end = {row: firstRow, column: 0};\n\n if (this.start.row > lastRow)\n var start = {row: lastRow + 1, column: 0};\n else if (this.start.row < firstRow)\n var start = {row: firstRow, column: 0};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n this.extend = function(row, column) {\n var cmp = this.compare(row, column);\n\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = {row: row, column: column};\n else\n var end = {row: row, column: column};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n\n this.isEmpty = function() {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n this.isMultiLine = function() {\n return (this.start.row !== this.end.row);\n };\n this.clone = function() {\n return Range.fromPoints(this.start, this.end);\n };\n this.collapseRows = function() {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);\n else\n return new Range(this.start.row, 0, this.end.row, 0);\n };\n this.toScreenRange = function(session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n\n return new Range(\n screenPosStart.row, screenPosStart.column,\n screenPosEnd.row, screenPosEnd.column\n );\n };\n this.moveBy = function(row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n\n if (count >>= 1)\n string += string;\n }\n return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\n\nexports.copyArray = function(array){\n var copy = [];\n for (var i=0, l=array.length; i Date.now() - 50)\n return true;\n return $cancelT = false;\n },\n cancel: function() {\n $cancelT = Date.now();\n }\n};\n\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/clipboard\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar clipboard = require(\"../clipboard\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\nvar HAS_FOCUS_ARGS = useragent.isChrome > 63;\nvar MAX_LINE_LENGTH = 400;\n\nvar KEYS = require(\"../lib/keys\");\nvar MODS = KEYS.KEY_MODS;\nvar isIOS = useragent.isIOS;\nvar valueResetRegex = isIOS ? /\\s/ : /\\n/;\nvar isMobile = useragent.isMobile;\n\nvar TextInput = function(parentNode, host) {\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n text.setAttribute(\"wrap\", \"off\");\n text.setAttribute(\"autocorrect\", \"off\");\n text.setAttribute(\"autocapitalize\", \"off\");\n text.setAttribute(\"spellcheck\", false);\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var sendingText = false;\n var tempStyle = '';\n \n if (!isMobile)\n text.style.fontSize = \"1px\";\n\n var commandMode = false;\n var ignoreFocusEvents = false;\n \n var lastValue = \"\";\n var lastSelectionStart = 0;\n var lastSelectionEnd = 0;\n var lastRestoreEnd = 0;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n if (ignoreFocusEvents) return;\n host.onBlur(e);\n isFocused = false;\n }, host);\n event.addListener(text, \"focus\", function(e) {\n if (ignoreFocusEvents) return;\n isFocused = true;\n if (useragent.isEdge) {\n try {\n if (!document.hasFocus())\n return;\n } catch(e) {}\n }\n host.onFocus(e);\n if (useragent.isEdge)\n setTimeout(resetSelection);\n else\n resetSelection();\n }, host);\n this.$focusScroll = false;\n this.focus = function() {\n if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == \"browser\")\n return text.focus({ preventScroll: true });\n\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n try {\n var isTransformed = text.getBoundingClientRect().top != 0;\n } catch(e) {\n return;\n }\n var ancestors = [];\n if (isTransformed) {\n var t = text.parentElement;\n while (t && t.nodeType == 1) {\n ancestors.push(t);\n t.setAttribute(\"ace_nocontext\", true);\n if (!t.parentElement && t.getRootNode)\n t = t.getRootNode().host;\n else\n t = t.parentElement;\n }\n }\n text.focus({ preventScroll: true });\n if (isTransformed) {\n ancestors.forEach(function(p) {\n p.removeAttribute(\"ace_nocontext\");\n });\n }\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n \n host.on(\"beforeEndOperation\", function() {\n var curOp = host.curOp;\n var commandName = curOp && curOp.command && curOp.command.name;\n if (commandName == \"insertstring\")\n return;\n var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged);\n if (inComposition && isUserAction) {\n lastValue = text.value = \"\";\n onCompositionEnd();\n }\n resetSelection();\n });\n \n var resetSelection = isIOS\n ? function(value) {\n if (!isFocused || (copied && !value) || sendingText) return;\n if (!value) \n value = \"\";\n var newValue = \"\\n ab\" + value + \"cde fg\\n\";\n if (newValue != text.value)\n text.value = lastValue = newValue;\n \n var selectionStart = 4;\n var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1));\n\n if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) {\n text.setSelectionRange(selectionStart, selectionEnd);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n }\n : function() {\n if (inComposition || sendingText)\n return;\n if (!isFocused && !afterContextMenu)\n return;\n inComposition = true;\n \n var selectionStart = 0;\n var selectionEnd = 0;\n var line = \"\";\n\n if (host.session) {\n var selection = host.selection;\n var range = selection.getRange();\n var row = selection.cursor.row;\n selectionStart = range.start.column;\n selectionEnd = range.end.column;\n line = host.session.getLine(row);\n\n if (range.start.row != row) {\n var prevLine = host.session.getLine(row - 1);\n selectionStart = range.start.row < row - 1 ? 0 : selectionStart;\n selectionEnd += prevLine.length + 1;\n line = prevLine + \"\\n\" + line;\n }\n else if (range.end.row != row) {\n var nextLine = host.session.getLine(row + 1);\n selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd;\n selectionEnd += line.length + 1;\n line = line + \"\\n\" + nextLine;\n }\n else if (isMobile && row > 0) {\n line = \"\\n\" + line;\n selectionEnd += 1;\n selectionStart += 1;\n }\n\n if (line.length > MAX_LINE_LENGTH) {\n if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) {\n line = line.slice(0, MAX_LINE_LENGTH);\n } else {\n line = \"\\n\";\n if (selectionStart == selectionEnd) {\n selectionStart = selectionEnd = 0;\n }\n else {\n selectionStart = 0;\n selectionEnd = 1;\n }\n }\n }\n }\n\n var newValue = line + \"\\n\\n\";\n if (newValue != lastValue) {\n text.value = lastValue = newValue;\n lastSelectionStart = lastSelectionEnd = newValue.length;\n }\n if (afterContextMenu) {\n lastSelectionStart = text.selectionStart;\n lastSelectionEnd = text.selectionEnd;\n }\n if (\n lastSelectionEnd != selectionEnd \n || lastSelectionStart != selectionStart \n || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization\n ) {\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n } catch(e){}\n }\n inComposition = false;\n };\n this.resetSelection = resetSelection;\n\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd >= lastValue.length\n && text.value === lastValue && lastValue\n && text.selectionEnd !== lastSelectionEnd;\n };\n\n var onSelect = function(e) {\n if (inComposition)\n return;\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (isMobile && text.selectionStart != lastSelectionStart) {\n resetSelection();\n }\n };\n\n var inputHandler = null;\n this.setInputHandler = function(cb) {inputHandler = cb;};\n this.getInputHandler = function() {return inputHandler;};\n var afterContextMenu = false;\n \n var sendText = function(value, fromInput) {\n if (afterContextMenu)\n afterContextMenu = false;\n if (pasted) {\n resetSelection();\n if (value)\n host.onPaste(value);\n pasted = false;\n return \"\";\n } else {\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var extendLeft = lastSelectionStart;\n var extendRight = lastValue.length - lastSelectionEnd;\n \n var inserted = value;\n var restoreStart = value.length - selectionStart;\n var restoreEnd = value.length - selectionEnd;\n \n var i = 0;\n while (extendLeft > 0 && lastValue[i] == value[i]) {\n i++;\n extendLeft--;\n }\n inserted = inserted.slice(i);\n i = 1;\n while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) {\n i++;\n extendRight--;\n }\n restoreStart -= i-1;\n restoreEnd -= i-1;\n var endIndex = inserted.length - i + 1;\n if (endIndex < 0) {\n extendLeft = -endIndex;\n endIndex = 0;\n } \n inserted = inserted.slice(0, endIndex);\n if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd)\n return \"\";\n sendingText = true;\n var shouldReset = false;\n if (useragent.isAndroid && inserted == \". \") {\n inserted = \" \";\n shouldReset = true;\n }\n \n if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) {\n host.onTextInput(inserted);\n } else {\n host.onTextInput(inserted, {\n extendLeft: extendLeft,\n extendRight: extendRight,\n restoreStart: restoreStart,\n restoreEnd: restoreEnd\n });\n }\n sendingText = false;\n \n lastValue = value;\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n lastRestoreEnd = restoreEnd;\n return shouldReset ? \"\\n\" : inserted;\n }\n };\n var onInput = function(e) {\n if (inComposition)\n return onCompositionUpdate();\n if (e && e.inputType) {\n if (e.inputType == \"historyUndo\") return host.execCommand(\"undo\");\n if (e.inputType == \"historyRedo\") return host.execCommand(\"redo\");\n }\n var data = text.value;\n var inserted = sendText(data, true);\n if (\n data.length > MAX_LINE_LENGTH + 100 \n || valueResetRegex.test(inserted)\n || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd\n ) {\n resetSelection();\n }\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n if (isIOS) {\n resetSelection(data);\n copied = data;\n setTimeout(function () {\n copied = false;\n }, 10);\n }\n isCut ? host.onCut() : host.onCopy();\n event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n \n var onCut = function(e) {\n doCopy(e, true);\n };\n \n var onCopy = function(e) {\n doCopy(e, false);\n };\n \n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (clipboard.pasteCancelled())\n return;\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host), host);\n\n event.addListener(text, \"select\", onSelect, host);\n event.addListener(text, \"input\", onInput, host);\n\n event.addListener(text, \"cut\", onCut, host);\n event.addListener(text, \"copy\", onCopy, host);\n event.addListener(text, \"paste\", onPaste, host);\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n event.addListener(parentNode, \"keydown\", function(e) {\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n return;\n\n switch (e.keyCode) {\n case 67:\n onCopy(e);\n break;\n case 86:\n onPaste(e);\n break;\n case 88:\n onCut(e);\n break;\n }\n }, host);\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n \n inComposition = {};\n\n if (commandMode)\n return;\n \n if (e.data)\n inComposition.useTextareaForIME = false;\n \n setTimeout(onCompositionUpdate, 0);\n host._signal(\"compositionStart\");\n host.on(\"mousedown\", cancelComposition);\n \n var range = host.getSelectionRange();\n range.end.row = range.start.row;\n range.end.column = range.start.column;\n inComposition.markerRange = range;\n inComposition.selectionStart = lastSelectionStart;\n host.onCompositionStart(inComposition);\n \n if (inComposition.useTextareaForIME) {\n lastValue = text.value = \"\";\n lastSelectionStart = 0;\n lastSelectionEnd = 0;\n }\n else {\n if (text.msGetInputContext)\n inComposition.context = text.msGetInputContext();\n if (text.getInputContext)\n inComposition.context = text.getInputContext();\n }\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n if (commandMode)\n return cancelComposition();\n \n if (inComposition.useTextareaForIME) {\n host.onCompositionUpdate(text.value);\n }\n else {\n var data = text.value;\n sendText(data);\n if (inComposition.markerRange) {\n if (inComposition.context) {\n inComposition.markerRange.start.column = inComposition.selectionStart\n = inComposition.context.compositionStartOffset;\n }\n inComposition.markerRange.end.column = inComposition.markerRange.start.column\n + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd;\n }\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n inComposition = false;\n host.onCompositionEnd();\n host.off(\"mousedown\", cancelComposition);\n if (e) onInput();\n };\n \n\n function cancelComposition() {\n ignoreFocusEvents = true;\n text.blur();\n text.focus();\n ignoreFocusEvents = false;\n }\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null);\n \n function onKeyup(e) {\n if (e.keyCode == 27 && text.value.length < text.selectionStart) {\n if (!inComposition)\n lastValue = text.value;\n lastSelectionStart = lastSelectionEnd = -1;\n resetSelection();\n }\n syncComposition();\n }\n\n event.addListener(text, \"compositionstart\", onCompositionStart, host);\n event.addListener(text, \"compositionupdate\", onCompositionUpdate, host);\n event.addListener(text, \"keyup\", onKeyup, host);\n event.addListener(text, \"keydown\", syncComposition, host);\n event.addListener(text, \"compositionend\", onCompositionEnd, host);\n\n this.getElement = function() {\n return text;\n };\n this.setCommandMode = function(value) {\n commandMode = value;\n text.readOnly = false;\n };\n \n this.setReadOnly = function(readOnly) {\n if (!commandMode)\n text.readOnly = readOnly;\n };\n\n this.setCopyWithEmptySelection = function(value) {\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection();\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + (useragent.isIE ? \"opacity:0.1;\" : \"\")\n + \"text-indent: -\" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + \"px;\";\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop));\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n host.renderer.$isMousePressed = true;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n host.renderer.$isMousePressed = false;\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$moveTextAreaToCursor();\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu, host);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n }, host);\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu, host);\n event.addListener(text, \"contextmenu\", onContextMenu, host);\n \n if (isIOS)\n addIosSelectionHandler(parentNode, host, text);\n\n function addIosSelectionHandler(parentNode, host, text) {\n var typingResetTimeout = null;\n var typing = false;\n \n text.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n }, true);\n\n text.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n }, true);\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing || inComposition || host.$mouseHandler.isMousePressed) return;\n\n if (copied) {\n return;\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var key = null;\n var modifier = 0;\n if (selectionStart == 0) {\n key = KEYS.up;\n } else if (selectionStart == 1) {\n key = KEYS.home;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == \"\\n\") {\n key = KEYS.end;\n } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == \" \") {\n key = KEYS.left;\n modifier = MODS.option;\n } else if (\n selectionStart < lastSelectionStart\n || (\n selectionStart == lastSelectionStart \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.left;\n } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split(\"\\n\").length > 2) {\n key = KEYS.down;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == \" \") {\n key = KEYS.right;\n modifier = MODS.option;\n } else if (\n selectionEnd > lastSelectionEnd\n || (\n selectionEnd == lastSelectionEnd \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.right;\n }\n \n if (selectionStart !== selectionEnd)\n modifier |= MODS.shift;\n\n if (key) {\n var result = host.onCommandKey({}, modifier, key);\n if (!result && host.commands) {\n key = KEYS.keyCodeToString(key);\n var command = host.commands.findKeyCommand(modifier, key);\n if (command)\n host.execCommand(command);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n resetSelection(\"\");\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\nexports.$setUserAgentForTests = function(_isMobile, _isIOS) {\n isMobile = _isMobile;\n isIOS = _isIOS;\n};\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 550; // milliseconds\n\nfunction DefaultHandlers(mouseHandler) {\n mouseHandler.$clickSelection = null;\n\n var editor = mouseHandler.editor;\n editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n this.onMouseDown = function(ev) {\n var inSelection = ev.inSelection();\n var pos = ev.getDocumentPosition();\n this.mousedownEvent = ev;\n var editor = this.editor;\n\n var button = ev.getButton();\n if (button !== 0) {\n var selectionRange = editor.getSelectionRange();\n var selectionEmpty = selectionRange.isEmpty();\n if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimeout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n this.startSelect(pos, ev.domEvent._clicks > 1);\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos, waitForClickSelection) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n if (!this.mousedownEvent) return;\n if (this.mousedownEvent.getShiftKey())\n editor.selection.selectToPosition(pos);\n else if (!waitForClickSelection)\n editor.selection.moveToPosition(pos);\n if (!waitForClickSelection)\n this.select();\n if (editor.renderer.scroller.setCapture) {\n editor.renderer.scroller.setCapture();\n }\n editor.setStyle(\"ace_selecting\");\n this.setState(\"select\");\n };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n if (this.$clickSelection) {\n var cmp = this.$clickSelection.comparePoint(cursor);\n\n if (cmp == -1) {\n anchor = this.$clickSelection.end;\n } else if (cmp == 1) {\n anchor = this.$clickSelection.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n };\n\n this.extendSelectionBy = function(unitName) {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n var range = editor.selection[unitName](cursor.row, cursor.column);\n if (this.$clickSelection) {\n var cmpStart = this.$clickSelection.comparePoint(range.start);\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n if (cmpStart == -1 && cmpEnd <= 0) {\n anchor = this.$clickSelection.end;\n if (range.end.row != cursor.row || range.end.column != cursor.column)\n cursor = range.start;\n } else if (cmpEnd == 1 && cmpStart >= 0) {\n anchor = this.$clickSelection.start;\n if (range.start.row != cursor.row || range.start.column != cursor.column)\n cursor = range.end;\n } else if (cmpStart == -1 && cmpEnd == 1) {\n cursor = range.end;\n anchor = range.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.$clickSelection = null;\n this.editor.unsetStyle(\"ace_selecting\");\n if (this.editor.renderer.scroller.releaseCapture) {\n this.editor.renderer.scroller.releaseCapture();\n }\n };\n\n this.focusWait = function() {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n var time = Date.now();\n\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout)\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n };\n\n this.onDoubleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n var session = editor.session;\n\n var range = session.getBracketRange(pos);\n if (range) {\n if (range.isEmpty()) {\n range.start.column--;\n range.end.column++;\n }\n this.setState(\"select\");\n } else {\n range = editor.selection.getWordRange(pos.row, pos.column);\n this.setState(\"selectByWords\");\n }\n this.$clickSelection = range;\n this.select();\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n var range = editor.getSelectionRange();\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n } else {\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n }\n this.select();\n };\n\n this.onQuadClick = function(ev) {\n var editor = this.editor;\n\n editor.selectAll();\n this.$clickSelection = editor.getSelectionRange();\n this.setState(\"selectAll\");\n };\n\n this.onMouseWheel = function(ev) {\n if (ev.getAccelKey())\n return;\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n ev.wheelX = ev.wheelY;\n ev.wheelY = 0;\n }\n \n var editor = this.editor;\n \n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n \n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = dt ? ev.wheelX / dt : prevScroll.vx;\n var vy = dt ? ev.wheelY / dt : prevScroll.vy;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n \n var direction = Math.abs(vx / vy);\n \n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n \n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n \n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\n editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n return ev.stop();\n }\n };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n if (range.start.row == range.end.row)\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n var cmp = cursor.column - 4;\n else\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n if (cmp < 0)\n return {cursor: range.start, anchor: range.end};\n else\n return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n this.isOpen = false;\n this.$element = null;\n this.$parentNode = parentNode;\n}\n\n(function() {\n this.$init = function() {\n this.$element = dom.createElement(\"div\");\n this.$element.className = \"ace_tooltip\";\n this.$element.style.display = \"none\";\n this.$parentNode.appendChild(this.$element);\n return this.$element;\n };\n this.getElement = function() {\n return this.$element || this.$init();\n };\n this.setText = function(text) {\n this.getElement().textContent = text;\n };\n this.setHtml = function(html) {\n this.getElement().innerHTML = html;\n };\n this.setPosition = function(x, y) {\n this.getElement().style.left = x + \"px\";\n this.getElement().style.top = y + \"px\";\n };\n this.setClassName = function(className) {\n dom.addCssClass(this.getElement(), className);\n };\n this.show = function(text, x, y) {\n if (text != null)\n this.setText(text);\n if (x != null && y != null)\n this.setPosition(x, y);\n if (!this.isOpen) {\n this.getElement().style.display = \"block\";\n this.isOpen = true;\n }\n };\n\n this.hide = function() {\n if (this.isOpen) {\n this.getElement().style.display = \"none\";\n this.isOpen = false;\n }\n };\n this.getHeight = function() {\n return this.getElement().offsetHeight;\n };\n this.getWidth = function() {\n return this.getElement().offsetWidth;\n };\n \n this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar event = require(\"../lib/event\");\nvar Tooltip = require(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n var editor = mouseHandler.editor;\n var gutter = editor.renderer.$gutterLayer;\n var tooltip = new GutterTooltip(editor.container);\n\n mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n if (!editor.isFocused() || e.getButton() != 0)\n return;\n var gutterRegion = gutter.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\")\n return;\n\n var row = e.getDocumentPosition().row;\n var selection = editor.session.selection;\n\n if (e.getShiftKey())\n selection.selectTo(row, 0);\n else {\n if (e.domEvent.detail == 2) {\n editor.selectAll();\n return e.preventDefault();\n }\n mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n }\n mouseHandler.setState(\"selectByLines\");\n mouseHandler.captureMouse(e);\n return e.preventDefault();\n });\n\n\n var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n function showTooltip() {\n var row = mouseEvent.getDocumentPosition().row;\n var annotation = gutter.$annotations[row];\n if (!annotation)\n return hideTooltip();\n\n var maxRow = editor.session.getLength();\n if (row == maxRow) {\n var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n var pos = mouseEvent.$pos;\n if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n return hideTooltip();\n }\n\n if (tooltipAnnotation == annotation)\n return;\n tooltipAnnotation = annotation.text.join(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor._signal(\"hideGutterTooltip\", tooltip);\n editor.off(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n }, editor);\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var dragImage = dom.createElement(\"div\");\n dragImage.style.cssText = \"top:-100px;position:absolute;z-index:2147483647;opacity:0.5\";\n dragImage.textContent = \"\\xa0\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.on(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n editor.container.appendChild(dragImage);\n\n dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0);\n setTimeout(function() {\n editor.container.removeChild(dragImage);\n });\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.$resetCursorStyle();\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragCursor)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler), editor);\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.moveCursorToPosition(cursor);\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n onDragInterval();\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.selection.fromOrientedRange(range);\n if (editor.isFocused() && !isInternal)\n editor.$resetCursorStyle();\n range = null;\n dragCursor = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.$resetCursorStyle();\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/mouse/touch_handler\",[\"require\",\"exports\",\"module\",\"ace/mouse/mouse_event\",\"ace/lib/event\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar event = require(\"../lib/event\");\nvar dom = require(\"../lib/dom\");\n\nexports.addTouchListeners = function(el, editor) {\n var mode = \"scroll\";\n var startX;\n var startY;\n var touchStartT;\n var lastT;\n var longTouchTimer;\n var animationTimer;\n var animationSteps = 0;\n var pos;\n var clickCount = 0;\n var vX = 0;\n var vY = 0;\n var pressed;\n var contextMenu;\n \n function createContextMenu() {\n var clipboard = window.navigator && window.navigator.clipboard;\n var isOpen = false;\n var updateMenu = function() {\n var selected = editor.getCopyText();\n var hasUndo = editor.session.getUndoManager().hasUndo();\n contextMenu.replaceChild(\n dom.buildDom(isOpen ? [\"span\",\n !selected && [\"span\", { class: \"ace_mobile-button\", action: \"selectall\" }, \"Select All\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"copy\" }, \"Copy\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"cut\" }, \"Cut\"],\n clipboard && [\"span\", { class: \"ace_mobile-button\", action: \"paste\" }, \"Paste\"],\n hasUndo && [\"span\", { class: \"ace_mobile-button\", action: \"undo\" }, \"Undo\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"find\" }, \"Find\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"openCommandPallete\" }, \"Pallete\"]\n ] : [\"span\"]),\n contextMenu.firstChild\n );\n };\n var handleClick = function(e) {\n var action = e.target.getAttribute(\"action\");\n\n if (action == \"more\" || !isOpen) {\n isOpen = !isOpen;\n return updateMenu();\n }\n if (action == \"paste\") {\n clipboard.readText().then(function (text) {\n editor.execCommand(action, text);\n });\n }\n else if (action) {\n if (action == \"cut\" || action == \"copy\") {\n if (clipboard)\n clipboard.writeText(editor.getCopyText());\n else\n document.execCommand(\"copy\");\n }\n editor.execCommand(action);\n }\n contextMenu.firstChild.style.display = \"none\";\n isOpen = false;\n if (action != \"openCommandPallete\")\n editor.focus();\n };\n contextMenu = dom.buildDom([\"div\",\n {\n class: \"ace_mobile-menu\",\n ontouchstart: function(e) {\n mode = \"menu\";\n e.stopPropagation();\n e.preventDefault();\n editor.textInput.focus();\n },\n ontouchend: function(e) {\n e.stopPropagation();\n e.preventDefault();\n handleClick(e);\n },\n onclick: handleClick\n },\n [\"span\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"more\" }, \"...\"]\n ], editor.container);\n }\n function showContextMenu() {\n if (!contextMenu) createContextMenu();\n var cursor = editor.selection.cursor;\n var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column);\n var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX;\n var scrollLeft = editor.renderer.scrollLeft;\n var rect = editor.container.getBoundingClientRect();\n contextMenu.style.top = pagePos.pageY - rect.top - 3 + \"px\";\n if (pagePos.pageX - rect.left < rect.width - 70) {\n contextMenu.style.left = \"\";\n contextMenu.style.right = \"10px\";\n } else {\n contextMenu.style.right = \"\";\n contextMenu.style.left = leftOffset + scrollLeft - rect.left + \"px\";\n }\n contextMenu.style.display = \"\";\n contextMenu.firstChild.style.display = \"none\";\n editor.on(\"input\", hideContextMenu);\n }\n function hideContextMenu(e) {\n if (contextMenu)\n contextMenu.style.display = \"none\";\n editor.off(\"input\", hideContextMenu);\n }\n\n function handleLongTap() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n var range = editor.selection.getRange();\n var inSelection = range.contains(pos.row, pos.column);\n if (range.isEmpty() || !inSelection) {\n editor.selection.moveToPosition(pos);\n editor.selection.selectWord();\n }\n mode = \"wait\";\n showContextMenu();\n }\n function switchToSelectionMode() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n editor.selection.moveToPosition(pos);\n var range = clickCount >= 2\n ? editor.selection.getLineRange(pos.row)\n : editor.session.getBracketRange(pos);\n if (range && !range.isEmpty()) {\n editor.selection.setRange(range);\n } else {\n editor.selection.selectWord();\n }\n mode = \"wait\";\n }\n event.addListener(el, \"contextmenu\", function(e) {\n if (!pressed) return;\n var textarea = editor.textInput.getElement();\n textarea.focus();\n }, editor);\n event.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n if (longTouchTimer || touches.length > 1) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n touchStartT = -1;\n mode = \"zoom\";\n return;\n }\n \n pressed = editor.$mouseHandler.isMousePressed = true;\n var h = editor.renderer.layerConfig.lineHeight;\n var w = editor.renderer.layerConfig.lineHeight;\n var t = e.timeStamp;\n lastT = t;\n var touchObj = touches[0];\n var x = touchObj.clientX;\n var y = touchObj.clientY;\n if (Math.abs(startX - x) + Math.abs(startY - y) > h)\n touchStartT = -1;\n \n startX = e.clientX = x;\n startY = e.clientY = y;\n vX = vY = 0;\n \n var ev = new MouseEvent(e, editor);\n pos = ev.getDocumentPosition();\n\n if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) {\n clickCount++;\n e.preventDefault();\n e.button = 0;\n switchToSelectionMode();\n } else {\n clickCount = 0;\n var cursor = editor.selection.cursor;\n var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor;\n \n var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true);\n var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true);\n var rect = editor.renderer.scroller.getBoundingClientRect();\n var offsetTop = editor.renderer.layerConfig.offset;\n var offsetLeft = editor.renderer.scrollLeft;\n var weightedDistance = function(x, y) {\n x = x / w;\n y = y / h - 0.75;\n return x * x + y * y;\n };\n \n if (e.clientX < rect.left) {\n mode = \"zoom\";\n return;\n }\n \n var diff1 = weightedDistance(\n e.clientX - rect.left - cursorPos.left + offsetLeft,\n e.clientY - rect.top - cursorPos.top + offsetTop\n );\n var diff2 = weightedDistance(\n e.clientX - rect.left - anchorPos.left + offsetLeft,\n e.clientY - rect.top - anchorPos.top + offsetTop\n );\n if (diff1 < 3.5 && diff2 < 3.5)\n mode = diff1 > diff2 ? \"cursor\" : \"anchor\";\n \n if (diff2 < 3.5)\n mode = \"anchor\";\n else if (diff1 < 3.5)\n mode = \"cursor\";\n else\n mode = \"scroll\";\n longTouchTimer = setTimeout(handleLongTap, 450);\n }\n touchStartT = t;\n }, editor);\n\n event.addListener(el, \"touchend\", function (e) {\n pressed = editor.$mouseHandler.isMousePressed = false;\n if (animationTimer) clearInterval(animationTimer);\n if (mode == \"zoom\") {\n mode = \"\";\n animationSteps = 0;\n } else if (longTouchTimer) {\n editor.selection.moveToPosition(pos);\n animationSteps = 0;\n showContextMenu();\n } else if (mode == \"scroll\") {\n animate();\n hideContextMenu();\n } else {\n showContextMenu();\n }\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }, editor);\n event.addListener(el, \"touchmove\", function (e) {\n if (longTouchTimer) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }\n var touches = e.touches;\n if (touches.length > 1 || mode == \"zoom\") return;\n\n var touchObj = touches[0];\n\n var wheelX = startX - touchObj.clientX;\n var wheelY = startY - touchObj.clientY;\n\n if (mode == \"wait\") {\n if (wheelX * wheelX + wheelY * wheelY > 4)\n mode = \"cursor\";\n else\n return e.preventDefault();\n }\n\n startX = touchObj.clientX;\n startY = touchObj.clientY;\n\n e.clientX = touchObj.clientX;\n e.clientY = touchObj.clientY;\n\n var t = e.timeStamp;\n var dt = t - lastT;\n lastT = t;\n if (mode == \"scroll\") {\n var mouseEvent = new MouseEvent(e, editor);\n mouseEvent.speed = 1;\n mouseEvent.wheelX = wheelX;\n mouseEvent.wheelY = wheelY;\n if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0;\n if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0;\n if (dt != 0) {\n vX = wheelX / dt;\n vY = wheelY / dt;\n }\n editor._emit(\"mousewheel\", mouseEvent);\n if (!mouseEvent.propagationStopped) {\n vX = vY = 0;\n }\n }\n else {\n var ev = new MouseEvent(e, editor);\n var pos = ev.getDocumentPosition();\n if (mode == \"cursor\")\n editor.selection.moveCursorToPosition(pos);\n else if (mode == \"anchor\")\n editor.selection.setSelectionAnchor(pos.row, pos.column);\n editor.renderer.scrollCursorIntoView(pos);\n e.preventDefault();\n }\n }, editor);\n\n function animate() {\n animationSteps += 60;\n animationTimer = setInterval(function() {\n if (animationSteps-- <= 0) {\n clearInterval(animationTimer);\n animationTimer = null;\n }\n if (Math.abs(vX) < 0.01) vX = 0;\n if (Math.abs(vY) < 0.01) vY = 0;\n if (animationSteps < 20) vX = 0.9 * vX;\n if (animationSteps < 20) vY = 0.9 * vY;\n var oldScrollTop = editor.session.getScrollTop();\n editor.renderer.scrollBy(10 * vX, 10 * vY);\n if (oldScrollTop == editor.session.getScrollTop())\n animationSteps = 0;\n }, 10);\n }\n};\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = require(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n require([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n \n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n reportErrorIfPathIsNotConfigured();\n};\n\nvar reportErrorIfPathIsNotConfigured = function() {\n if (\n !options.basePath && !options.workerPath \n && !options.modePath && !options.themePath\n && !Object.keys(options.$moduleUrls).length\n ) {\n console.error(\n \"Unable to infer path to ace from script src,\",\n \"use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes\",\n \"or with webpack use ace/webpack-resolver\"\n );\n reportErrorIfPathIsNotConfigured = function() {};\n }\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\t\t\t\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\t\t\t\t\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\t\t\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\t\n\tif (hi == 0) {\t\t\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\t\t\t\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\t\t\n\treturn ON;\t\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\nexports.RLE = 7;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\t\t\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = []; \n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) \n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\t\t\t\t\n\tif (chars[0] === '\\u202B')\n\t\tlevels[0] = exports.RLE;\n\t\t\t\t\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\t\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar bidiUtil = require(\"./lib/bidiutil\");\nvar lang = require(\"./lib/lang\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\u202B]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.$isRtl = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.EOF = \"\\xB6\";\n this.RLE = \"\\u202B\";\n this.contentWidth = 0;\n this.fontMetrics = null;\n this.rtlLineOffset = 0;\n this.wrapOffset = 0;\n this.isMoveLeftOperation = false;\n this.seenBidi = bidiRE.test(session.getValue());\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n } \n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n } else {\n splitIndex = this.currentRow;\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n \n var isLastRow = (docRow === this.session.getLength() - 1),\n endOfLine = isLastRow ? this.EOF : this.EOL;\n\n this.wrapIndent = 0;\n this.line = this.session.getLine(docRow);\n this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE;\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L];\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splitIndex]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n if (splitIndex == splits.length)\n this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT;\n } else {\n this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n\n if (this.isRtlDir) {\n this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line;\n this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width;\n }\n };\n \n this.updateBidiMap = function() {\n var textCharTypes = [];\n if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) {\n this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n this.fontMetrics = fontMetrics;\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0;\n\n this.currentRow = null;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar; \n };\n\n this.setContentWidth = function(width) {\n this.contentWidth = width;\n };\n\n this.isRtlLine = function(row) {\n if (this.$isRtl) return true;\n if (row != undefined)\n return (this.session.getLine(row).charAt(0) == this.RLE);\n else\n return this.isRtlDir; \n };\n\n this.setRtlDirection = function(editor, isRtlDir) {\n var cursor = editor.getCursorPosition(); \n for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) {\n if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE)\n editor.session.doc.removeInLine(row, 0, 1);\n else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE)\n editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE);\n }\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0;\n var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n \n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0))\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n if (this.isRtlDir)\n left += this.rtlLineOffset;\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0,\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n \n if (this.wrapIndent)\n offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n if(this.isRtlDir) {\n for (var i = 0; i < selections.length; i++) {\n selections[i].left += this.rtlLineOffset;\n }\n }\n return selections;\n };\n this.offsetToCol = function(posX) {\n if(this.isRtlDir)\n posX -= this.rtlLineOffset;\n\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n \n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n \n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n if (logicalIdx === 0 && this.isRtlDir)\n logicalIdx++;\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.cursor = this.lead = this.doc.createAnchor(0, 0);\n this.anchor = this.doc.createAnchor(0, 0);\n this.$silent = false;\n\n var self = this;\n this.cursor.on(\"change\", function(e) {\n self.$cursorChanged = true;\n if (!self.$silent)\n self._emit(\"changeCursor\");\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.anchor.on(\"change\", function() {\n self.$anchorChanged = true;\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n );\n };\n this.isMultiLine = function() {\n return !this.$isEmpty && this.anchor.row != this.cursor.row;\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.$isEmpty = false;\n this.anchor.setPosition(row, column);\n };\n this.getAnchor = \n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n \n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.$isEmpty)\n return Range.fromPoints(lead, lead);\n\n return this.isBackwards()\n ? Range.fromPoints(lead, anchor)\n : Range.fromPoints(anchor, lead);\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n var start = reverse ? range.end : range.start;\n var end = reverse ? range.start : range.end;\n this.$setSelection(start.row, start.column, end.row, end.column);\n };\n\n this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) {\n if (this.$silent)\n return;\n var wasEmpty = this.$isEmpty;\n var wasMultiselect = this.inMultiSelectMode;\n this.$silent = true;\n this.$cursorChanged = this.$anchorChanged = false;\n this.anchor.setPosition(anchorRow, anchorColumn);\n this.cursor.setPosition(cursorRow, cursorColumn);\n this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor);\n this.$silent = false;\n if (this.$cursorChanged)\n this._emit(\"changeCursor\");\n if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect)\n this._emit(\"changeSelection\");\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column === 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column);\n }\n\n var leftOfCursor = lang.stringReverse(str);\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--;\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break;\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row);\n } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\";\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column === 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line));\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\";\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n \n if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) {\n var widget = this.session.lineWidgets[this.lead.row];\n if (rows < 0)\n rows -= widget.rowsAbove || 0;\n else if (rows > 0)\n rows += widget.rowCount - (widget.rowsAbove || 0);\n }\n \n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n \n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n };\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n };\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n };\n this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start, end);\n } catch(e) {\n return Range.fromPoints(start, start);\n } finally {\n this.moveCursorToPosition(start);\n }\n };\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList && data.length > 1) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else {\n data = data[0];\n }\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false;\n }\n return true;\n };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar config = require(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n };\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\\\.|\\[(?:\\\\.|[^\\\\\\]])*|\\(\\?[:=!<]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack;\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n \n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n var matchAttempts = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack, line);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\") {\n currentState = rule.next;\n } else {\n currentState = rule.next(currentState, stack);\n }\n \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n if (rule.consumeLineEnd)\n lastIndex = index;\n break;\n }\n\n if (value) {\n if (typeof type === \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 500),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n }\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n this.$keywordList = [];\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; ) {\n var word = list[i];\n this.$keywordList.push(word);\n if (ignoreCase)\n word = word.toLowerCase(); \n keywords[word] = className;\n }\n }, this);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n : function(value) {return keywords[value] || defaultToken; };\n };\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n };\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n };\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n };\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n };\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {};\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n };\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) \n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n \n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n \n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n \n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n var charBefore = line[cursor.column - 2];\n if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore)))\n return null;\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n if (/[)}\\]]/.test(editor.session.getLine(cursor.row)[cursor.column]))\n return true;\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2];\n\nvar code = 0;\nvar str = [];\nfor (var i = 0; i < wordChars.length; i += 2) {\n str.push(code += wordChars[i]);\n if (wordChars[i + 1])\n str.push(45, code += wordChars[i + 1]);\n}\n\nexports.wordChars = String.fromCharCode.apply(null, str);\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar config = require(\"../config\");\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = require(\"../unicode\");\nvar lang = require(\"../lib/lang\");\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\" + unicode.wordChars + \"\\\\$_]+\", \"g\");\n\n this.nonTokenRe = new RegExp(\"^(?:[^\" + unicode.wordChars + \"\\\\$_]|\\\\s])+\", \"g\");\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === \"comment\")\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n var Mode = mapping[i];\n var id = Mode.prototype.$id;\n var mode = config.$modes[id];\n if (!mode)\n config.$modes[id] = mode = new Mode();\n if (!config.$modes[i])\n config.$modes[i] = mode;\n this.$embeds.push(i);\n this.$modes[i] = mode;\n }\n }\n\n var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n }(this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0] || \"start\";\n if (typeof state != \"string\") {\n if (Array.isArray(state[2])) {\n var language = state[2][state[2].length - 1];\n var mode = this.$modes[language];\n if (mode)\n return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1)));\n }\n state = state[0] || \"start\";\n }\n \n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n }\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.off(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar applyDelta = require(\"./apply_delta\").applyDelta;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({row: 0, column: 0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0) {\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n } else {\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n }\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\n };\n \n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n } else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n \n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000) {\n this.$splitAndapplyLargeDelta(delta, 20000);\n }\n else {\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n }\n };\n \n this.$safeApplyDelta = function(delta) {\n var docLength = this.$lines.length;\n if (\n delta.action == \"remove\" && delta.start.row < docLength && delta.end.row < docLength\n || delta.action == \"insert\" && delta.start.row <= docLength\n ) {\n this.applyDelta(delta);\n }\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length - MAX + 1;\n var row = delta.start.row; \n var column = delta.start.column;\n for (var from = 0, to = 0; from < l; from = to) {\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n }\n delta.lines = lines.slice(from);\n delta.start.row = row + from;\n delta.start.column = column;\n this.applyDelta(delta, true);\n };\n this.revertDelta = function(delta) {\n this.$safeApplyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: index + lines[l-1].length + newlineLength};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n var startLine = currentLine;\n while (self.lines[currentLine])\n currentLine++;\n \n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {\n self.running = setTimeout(self.$worker, 20);\n break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = currentLine;\n \n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n };\n\n this.$updateOnChange = function(delta) {\n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1];\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n };\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n };\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n };\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n cmp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || cmp === 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n };\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp === 0) {\n return {\n fold: fold,\n kind: \"inside\"\n };\n }\n }\n return null;\n };\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i === 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n };\n\n this.split = function(row, column) {\n var pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\n \n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n };\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n };\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\");\n return ret.join(\"\\n\");\n };\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n this.$bias = 1;\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.apply(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(delta) {\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var ranges = this.ranges;\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row >= startRow)\n break;\n }\n \n if (delta.action == \"insert\") {\n var lineDif = endRow - startRow;\n var colDiff = -start.column + end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n if (r.start.row > startRow)\n break;\n \n if (r.start.row == startRow && r.start.column >= start.column) {\n if (r.start.column == start.column && this.$bias <= 0) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$bias < 0) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) {\n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n } else {\n var lineDif = startRow - endRow;\n var colDiff = start.column - end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n \n if (r.start.row > endRow)\n break;\n \n if (r.end.row < endRow\n && (\n startRow < r.end.row \n || startRow == r.end.row && start.column < r.end.column\n )\n ) {\n r.end.row = startRow;\n r.end.column = start.column;\n }\n else if (r.end.row == endRow) {\n if (r.end.column <= end.column) {\n if (lineDif || r.end.column > start.column) {\n r.end.column = start.column;\n r.end.row = start.row;\n }\n }\n else {\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n else if (r.end.row > endRow) {\n r.end.row += lineDif;\n }\n \n if (r.start.row < endRow\n && (\n startRow < r.start.row \n || startRow == r.start.row && start.column < r.start.column\n )\n ) {\n r.start.row = startRow;\n r.start.column = start.column;\n }\n else if (r.start.row == endRow) {\n if (r.start.column <= end.column) {\n if (lineDif || r.start.column > start.column) {\n r.start.column = start.column;\n r.start.row = start.row;\n }\n }\n else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n else if (r.start.row > endRow) {\n r.start.row += lineDif;\n }\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar RangeList = require(\"../range_list\").RangeList;\nvar oop = require(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n var firstConsumed = 0;\n\n if (cmp == 0) {\n if (afterStart.range.containsRange(fold))\n return afterStart.addSubFold(fold);\n else\n firstConsumed = 1;\n }\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n if (cmp == 0) j++;\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length;\n for (var k = firstConsumed; k < last; k++) {\n fold.addSubFold(consumedFolds[k]);\n }\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var range = folds[i].range;\n if (range.contains(row, column)) {\n if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) {\n continue;\n } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) {\n continue;\n }\n return folds[i];\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n };\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if (start < last) {\n if (start >= first)\n rowCount -= last-start;\n else\n rowCount = 0; // in one fold\n }\n break;\n } else if (end >= first){\n if (start >= first) // fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n if (!fold.collapseChildren) {\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n if (expandInner == null) expandInner = true;\n } else if (typeof location == \"number\") {\n range = new Range(location, 0, location, this.getLine(location).length);\n } else if (\"row\" in location) {\n range = Range.fromPoints(location, location);\n } else if (Array.isArray(location)) {\n folds = [];\n location.forEach(function(range) {\n folds = folds.concat(this.unfold(range));\n }, this);\n return folds;\n } else {\n range = location;\n }\n \n folds = this.getFoldsInRangeList(range);\n var outermostFolds = folds;\n while (\n folds.length == 1\n && Range.comparePoints(folds[0].start, range.start) < 0 \n && Range.comparePoints(folds[0].end, range.end) > 0\n ) {\n this.expandFolds(folds);\n folds = this.getFoldsInRangeList(range);\n }\n \n if (expandInner != false) {\n this.removeFolds(folds);\n } else {\n this.expandFolds(folds);\n }\n if (outermostFolds.length)\n return outermostFolds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null)\n startRow = foldLine.start.row;\n if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if (placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n var type = token && token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while (token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\n } while (token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth, test) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n \n if (test && !test(row)) continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n range.collapseChildren = depth;\n this.addFold(\"...\", range);\n }\n }\n };\n \n this.foldToLevel = function(level) {\n this.foldAll();\n while (level-- > 0)\n this.unfold(null, false);\n };\n \n this.foldAllComments = function() {\n var session = this;\n this.foldAll(null, null, null, function(row) {\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.type == \"text\" && /^\\s+$/.test(token.value))\n continue;\n if (/comment/.test(token.type))\n return true;\n return false;\n }\n });\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n };\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement);\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return fold;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return fold;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column - 1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n this.getMatchingBracketRanges = function(pos) {\n var line = this.getLine(pos.row);\n\n var chr = line.charAt(pos.column - 1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n }\n\n if (!match)\n return null;\n\n var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column);\n var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos)\n : this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return [startRange];\n var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1);\n\n return [startRange, endRange];\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\",\n \"<\": \">\",\n \">\": \"<\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/bidihandler\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar BidiHandler = require(\"./bidihandler\").BidiHandler;\nvar config = require(\"./config\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.id = \"session\" + (++EditSession.$uid);\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n };\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.setDocument(text);\n this.selection = new Selection(this);\n this.$bidiHandler = new BidiHandler(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.off(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager) {\n if (removedFolds && removedFolds.length) {\n this.$undoManager.add({\n action: \"removeFolds\",\n folds: removedFolds\n }, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n }\n this.$undoManager.add(delta, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n \n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n var i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n \n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n \n if (undoManager) {\n var self = this;\n undoManager.addSession(this);\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n self.mergeUndoDeltas = false;\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n } else {\n this.$syncInformUndoManager = function() {};\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n hasUndo: function() {},\n hasRedo: function() {},\n reset: function() {},\n add: function() {},\n addSelection: function() {},\n startNewGroup: function() {},\n addSession: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = config.$modes;\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n } else if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n }\n cb && cb();\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n \n var oldMode = this.$mode;\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.on !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.on(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.on(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\", {oldMode: oldMode, mode: mode});\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.revertDelta(delta);\n } else if (delta.folds) {\n this.addFolds(delta.folds);\n }\n }\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionBefore)\n this.selection.fromJSON(deltas.selectionBefore);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, true));\n }\n this.$fromUndo = false;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.$safeApplyDelta(delta);\n }\n }\n\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionAfter)\n this.selection.fromJSON(deltas.selectionAfter);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, false));\n }\n this.$fromUndo = false;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var range, point;\n\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (!delta.start) continue; // skip folds\n if (!range) {\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n }\n continue;\n }\n \n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\n }\n }\n }\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.doc.insertInLine({row: row, column: 0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n \n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange;\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column);\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var len = screenPos - lastSplit;\n for (var i = lastSplit; i < screenPos; i++) {\n var ch = tokens[i];\n if (ch === 12 || ch === 2) len -= 1;\n }\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n var h = 1;\n if (this.lineWidgets)\n h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n \n if (!this.$useWrapMode || !this.$wrapData[row])\n return h;\n else\n return this.$wrapData[row].length + h;\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - (screenColumn % this.$tabSize | 0);\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n };\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n var wrapIndent = 0;\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n \n if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove)\n screenRow += this.lineWidgets[row].rowsAbove;\n\n return {\n row: screenRow,\n column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n this.removeAllListeners();\n if (this.doc) {\n this.doc.off(\"change\", this.$onChange);\n }\n this.selection.detach();\n };\n\n this.isFullWidth = isFullWidth;\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n }\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n this.$wrap = value;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: {\n set: function() {\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n },\n initialValue: true \n },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n tabSize = parseInt(tabSize);\n if (tabSize > 0 && this.$tabSize !== tabSize) {\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n }\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n foldStyle: {\n set: function(val) {this.setFoldStyle(val);},\n handlesSet: true\n },\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val);},\n get: function() {return this.doc.getNewLineMode();},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val); },\n get: function() { return this.$modeId; },\n handlesSet: true\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n \n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n \n if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0 || startRow + len > session.getLength()) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var last;\n var m;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position \n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n \n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x;});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar MultiHashHandler = require(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\n if (typeof command === \"string\")\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.off(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\nvar Range = require(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n description: \"Show settings menu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n description: \"Go to next error\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n description: \"Go to previous error\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n description: \"Select all\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n description: \"Center selection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n description: \"Go to line...\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor, line) {\n if (typeof line === \"number\" && !isNaN(line))\n editor.gotoLine(line);\n editor.prompt({ $type: \"gotoLine\" });\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n description: \"Toggle fold widget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n description: \"Toggle parent fold widget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n description: \"Fold all\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldAllComments\",\n description: \"Fold all comments\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAllComments(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n description: \"Fold other\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n description: \"Unfold all\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n description: \"Find next\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n description: \"Find previous\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n description: \"Select or find next\",\n bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n description: \"Select or find previous\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n description: \"Find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n description: \"Overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n description: \"Select to start\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n description: \"Go to start\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n description: \"Select up\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n description: \"Go line up\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n description: \"Select to end\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n description: \"Go to end\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n description: \"Select down\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n description: \"Go line down\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n description: \"Select word left\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n description: \"Go to word left\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n description: \"Select to line start\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n description: \"Go to line start\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n description: \"Select left\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n description: \"Go to left\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n description: \"Select word right\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n description: \"Go to word right\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n description: \"Select to line end\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n description: \"Go to line end\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n description: \"Select right\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n description: \"Go to right\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n description: \"Select page down\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n description: \"Page down\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n description: \"Go to page down\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n description: \"Select page up\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n description: \"Page up\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n description: \"Go to page up\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n description: \"Scroll up\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n description: \"Scroll down\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n description: \"Select line start\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n description: \"Select line end\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n description: \"Toggle recording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n description: \"Replay macro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n description: \"Jump to matching\",\n bindKey: bindKey(\"Ctrl-\\\\|Ctrl-P\", \"Command-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n description: \"Select to matching\",\n bindKey: bindKey(\"Ctrl-Shift-\\\\|Ctrl-Shift-P\", \"Command-Shift-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n description: \"Expand to matching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n description: \"Pass keys to browser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n description: \"Copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n description: \"Cut\",\n exec: function(editor) {\n var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty();\n var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange();\n editor._emit(\"cut\", range);\n\n if (!range.isEmpty())\n editor.session.remove(range);\n editor.clearSelection();\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n description: \"Paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n description: \"Remove line\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n description: \"Duplicate selection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n description: \"Sort lines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n description: \"Toggle comment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n description: \"Toggle block comment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n description: \"Modify number up\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n description: \"Modify number down\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n description: \"Replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n }\n}, {\n name: \"undo\",\n description: \"Undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n description: \"Redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n description: \"Copy lines up\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n description: \"Move lines up\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n description: \"Copy lines down\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n description: \"Move lines down\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n description: \"Delete\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n description: \"Backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n description: \"Cut or delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n description: \"Remove to line start\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n description: \"Remove to line end\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n description: \"Remove to line start hard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n description: \"Remove to line end hard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n description: \"Remove word left\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n description: \"Remove word right\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n description: \"Outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n description: \"Indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n description: \"Block outdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n description: \"Block indent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n description: \"Insert string\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n description: \"Insert text\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n description: \"Split line\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n description: \"Transpose letters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n description: \"To uppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n description: \"To lowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"autoindent\",\n description: \"Auto Indent\",\n bindKey: bindKey(null, null),\n exec: function(editor) { editor.autoIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"animate\"\n}, {\n name: \"expandtoline\",\n description: \"Expand to line\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n description: \"Join lines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n description: \"Invert selection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}, {\n name: \"addLineAfter\",\n description: \"Add new line after the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n editor.navigateLineEnd();\n editor.insert(\"\\n\");\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"addLineBefore\",\n description: \"Add new line before the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n var cursor = editor.getCursorPosition();\n editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE);\n editor.insert(\"\\n\");\n if (cursor.row === 0) editor.navigateUp();\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"openCommandPallete\",\n description: \"Open command pallete\",\n bindKey: bindKey(\"F1\", \"F1\"),\n exec: function(editor) {\n editor.prompt({ $type: \"commands\" });\n },\n readOnly: true\n}, {\n name: \"modeSelect\",\n description: \"Change language mode...\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n editor.prompt({ $type: \"modes\" });\n },\n readOnly: true\n}];\n\nfor (var i = 1; i < 9; i++) {\n exports.commands.push({\n name: \"foldToLevel\" + i,\n description: \"Fold To Level \" + i,\n level: i,\n exec: function(editor) { editor.session.foldToLevel(this.level); },\n scrollIntoView: \"center\",\n readOnly: true\n });\n}\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\",\"ace/clipboard\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\nvar config = require(\"./config\");\nvar TokenIterator = require(\"./token_iterator\").TokenIterator;\n\nvar clipboard = require(\"./clipboard\");\nvar Editor = function(renderer, session, options) {\n this.$toDestroy = [];\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n if (this.session && this.session.bgTokenizer)\n this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || options && options.session || new EditSession(\"\"));\n config.resetOptions(this);\n if (options)\n this.setOptions(options);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true));\n this.on(\"change\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.docChanged = true;\n }.bind(this), true);\n \n this.on(\"changeSelection\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commandEvent) {\n if (this.curOp) {\n if (!commandEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commandEvent) {\n this.previousCommand = null;\n commandEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = this.session.curOp = {\n command: commandEvent.command || {},\n args: commandEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n this.curOp.selectionBefore = this.selection.toJSON();\n };\n\n this.endOperation = function(e) {\n if (this.curOp && this.session) {\n if (e && e.returnValue === false || !this.session)\n return (this.curOp = null);\n if (e == true && this.curOp.command && this.curOp.command.name == \"mouse\")\n return;\n this._signal(\"beforeEndOperation\");\n if (!this.curOp) return;\n var command = this.curOp.command;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n var sel = this.selection.toJSON();\n this.curOp.selectionAfter = sel;\n this.$lastSel = this.selection.toJSON();\n this.session.getUndoManager().addSelection(sel);\n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\" && keyboardHandler != \"ace\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.onCursorChange();\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n \n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme, cb) {\n this.renderer.setTheme(theme, cb);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container).fontSize;\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function () {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n if (session.$bracketHighlight) {\n session.$bracketHighlight.markerIds.forEach(function(id) {\n session.removeMarker(id);\n });\n session.$bracketHighlight = null;\n }\n var ranges = session.getMatchingBracketRanges(self.getCursorPosition());\n if (!ranges && session.$mode.getMatching) \n ranges = session.$mode.getMatching(self.session);\n if (!ranges)\n return;\n\n var markerType = \"ace_bracket\";\n if (!Array.isArray(ranges)) {\n ranges = [ranges];\n } else if (ranges.length == 1) {\n markerType = \"ace_error_bracket\";\n }\n if (ranges.length == 2) {\n if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0)\n ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)];\n else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0)\n ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)];\n }\n\n session.$bracketHighlight = {\n ranges: ranges,\n markerIds: ranges.map(function(range) {\n return session.addMarker(range, markerType, \"text\");\n })\n };\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") !== -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var currentTag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value === '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n currentTag = token.value;\n if (tag === currentTag) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n depth--;\n }\n }\n \n } while (token && depth >= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n if (tag === token.value) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n var stepCount = 0;\n var tmpToken = prevToken;\n while (tmpToken) {\n if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) {\n depth--;\n break;\n } else if (tmpToken.value === '<') {\n break;\n }\n tmpToken = iterator.stepBackward();\n stepCount++;\n }\n for (var i = 0; i < stepCount; i++) {\n iterator.stepForward();\n }\n }\n }\n } while (prevToken && depth <= 0);\n iterator.stepForward();\n }\n \n if (!token) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn();\n var range = new Range(row, column, row, column+token.value.length);\n var sbm = session.$backMarkers[session.$tagHighlight];\n if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n }\n \n if (!session.$tagHighlight)\n session.$tagHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.focus = function() {\n var _self = this;\n setTimeout(function() {\n if (!_self.isFocused())\n _self.textInput.focus();\n });\n this.textInput.focus();\n };\n this.isFocused = function() {\n return this.textInput.isFocused();\n };\n this.blur = function() {\n this.textInput.blur();\n };\n this.onFocus = function(e) {\n if (this.$isFocused)\n return;\n this.$isFocused = true;\n this.renderer.showCursor();\n this.renderer.visualizeFocus();\n this._emit(\"focus\", e);\n };\n this.onBlur = function(e) {\n if (!this.$isFocused)\n return;\n this.$isFocused = false;\n this.renderer.hideCursor();\n this.renderer.visualizeBlur();\n this._emit(\"blur\", e);\n };\n\n this.$cursorChange = function() {\n this.renderer.updateCursor();\n this.$highlightBrackets();\n this.$highlightTags();\n this.$updateHighlightActiveLine();\n };\n this.onDocumentChange = function(delta) {\n var wrap = this.session.$useWrapMode;\n var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);\n this.renderer.updateLines(delta.start.row, lastRow, wrap);\n\n this._signal(\"change\", delta);\n this.$cursorChange();\n };\n\n this.onTokenizerUpdate = function(e) {\n var rows = e.data;\n this.renderer.updateLines(rows.first, rows.last);\n };\n\n\n this.onScrollTopChange = function() {\n this.renderer.scrollToY(this.session.getScrollTop());\n };\n\n this.onScrollLeftChange = function() {\n this.renderer.scrollToX(this.session.getScrollLeft());\n };\n this.onCursorChange = function() {\n this.$cursorChange();\n this._signal(\"changeSelection\");\n };\n\n this.$updateHighlightActiveLine = function() {\n var session = this.getSession();\n\n var highlight;\n if (this.$highlightActiveLine) {\n if (this.$selectionStyle != \"line\" || !this.selection.isMultiLine())\n highlight = this.getCursorPosition();\n if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty())\n highlight = false;\n if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startColumn = selection.start.column;\n var endColumn = selection.end.column;\n var line = session.getLine(selection.start.row);\n \n var needle = line.substring(startColumn, endColumn);\n if (needle.length > 5000 || !/[\\w\\d]/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n \n var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1);\n if (!re.test(wordWithBoundary))\n return;\n \n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n var nl = this.session.doc.getNewLineCharacter();\n var copyLine= false;\n if (!text && this.$copyWithEmptySelection) {\n copyLine = true;\n var ranges = this.selection.getAllRanges();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (i && ranges[i - 1].start.row == range.start.row)\n continue;\n text += this.session.getLine(range.start.row) + nl;\n }\n }\n var e = {text: text};\n this._signal(\"copy\", e);\n clipboard.lineMode = copyLine ? e.text : false;\n return e.text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n\n var lineMode = text === clipboard.lineMode;\n var session = this.session;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n if (lineMode)\n session.insert({ row: this.selection.lead.row, column: 0 }, text);\n else\n this.insert(text);\n } else if (lineMode) {\n this.selection.rangeList.ranges.forEach(function(range) {\n session.insert({ row: range.start.row, column: 0 }, text);\n });\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]);\n if (lines.length != ranges.length || isFullLine)\n return this.commands.exec(\"insertstring\", this, text);\n \n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n session.remove(range);\n \n session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n if (!this.inVirtualSelectionMode) {\n this.session.mergeUndoDeltas = false;\n this.mergeNextCommand = false;\n }\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n if (this.$enableAutoIndent) {\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n }\n };\n\n this.autoIndent = function () {\n var session = this.session;\n var mode = session.getMode();\n\n var startRow, endRow;\n if (this.selection.isEmpty()) {\n startRow = 0;\n endRow = session.doc.getLength() - 1;\n } else {\n var selectedRange = this.getSelectionRange();\n\n startRow = selectedRange.start.row;\n endRow = selectedRange.end.row;\n }\n\n var prevLineState = \"\";\n var prevLine = \"\";\n var lineIndent = \"\";\n var line, currIndent, range;\n var tab = session.getTabString();\n\n for (var row = startRow; row <= endRow; row++) {\n if (row > 0) {\n prevLineState = session.getState(row - 1);\n prevLine = session.getLine(row - 1);\n lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab);\n }\n\n line = session.getLine(row);\n currIndent = mode.$getIndent(line);\n if (lineIndent !== currIndent) {\n if (currIndent.length > 0) {\n range = new Range(row, 0, row, currIndent.length);\n session.remove(range);\n }\n if (lineIndent.length > 0) {\n session.insert({row: row, column: 0}, lineIndent);\n }\n }\n\n mode.autoOutdent(prevLineState, session, row);\n }\n };\n\n\n this.onTextInput = function(text, composition) {\n if (!composition)\n return this.keyBinding.onTextInput(text);\n \n this.startOperation({command: { name: \"insertstring\" }});\n var applyComposition = this.applyComposition.bind(this, text, composition);\n if (this.selection.rangeCount)\n this.forEachSelection(applyComposition);\n else\n applyComposition();\n this.endOperation();\n };\n \n this.applyComposition = function(text, composition) {\n if (composition.extendLeft || composition.extendRight) {\n var r = this.selection.getRange();\n r.start.column -= composition.extendLeft;\n r.end.column += composition.extendRight;\n if (r.start.column < 0) {\n r.start.row--;\n r.start.column += this.session.getLine(r.start.row).length + 1;\n }\n this.selection.setRange(r);\n if (!text && !r.isEmpty())\n this.remove();\n }\n if (text || !this.selection.isEmpty())\n this.insert(text, true);\n if (composition.restoreStart || composition.restoreEnd) {\n var r = this.selection.getRange();\n r.start.column -= composition.restoreStart;\n r.end.column -= composition.restoreEnd;\n this.selection.setRange(r);\n }\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n return this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n if (this.selection.isEmpty())\n this.selection.selectLeft();\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n this.session.selection.moveToPosition(range.end);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column - 1] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (var i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n } else {\n this.toggleWord();\n }\n };\n\n this.$toggleWordPairs = [\n [\"first\", \"last\"],\n [\"true\", \"false\"],\n [\"yes\", \"no\"],\n [\"width\", \"height\"],\n [\"top\", \"bottom\"],\n [\"right\", \"left\"],\n [\"on\", \"off\"],\n [\"x\", \"y\"],\n [\"get\", \"set\"],\n [\"max\", \"min\"],\n [\"horizontal\", \"vertical\"],\n [\"show\", \"hide\"],\n [\"add\", \"remove\"],\n [\"up\", \"down\"],\n [\"before\", \"after\"],\n [\"even\", \"odd\"],\n [\"in\", \"out\"],\n [\"inside\", \"outside\"],\n [\"next\", \"previous\"],\n [\"increase\", \"decrease\"],\n [\"attach\", \"detach\"],\n [\"&&\", \"||\"],\n [\"==\", \"!=\"]\n ];\n\n this.toggleWord = function () {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n this.selection.selectWord();\n var currentState = this.getSelectedText();\n var currWordStart = this.selection.getWordRange().start.column;\n var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\\s/);\n var delta = column - currWordStart - 1;\n if (delta < 0) delta = 0;\n var curLength = 0, itLength = 0;\n var that = this;\n if (currentState.match(/[A-Za-z0-9_]+/)) {\n wordParts.forEach(function (item, i) {\n itLength = curLength + item.length;\n if (delta >= curLength && delta <= itLength) {\n currentState = item;\n that.selection.clearSelection();\n that.moveCursorTo(row, curLength + currWordStart);\n that.selection.selectTo(row, itLength + currWordStart);\n }\n curLength = itLength;\n });\n }\n\n var wordPairs = this.$toggleWordPairs;\n var reg;\n for (var i = 0; i < wordPairs.length; i++) {\n var item = wordPairs[i];\n for (var j = 0; j <= 1; j++) {\n var negate = +!j;\n var firstCondition = currentState.match(new RegExp('^\\\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\\\s?$', 'i'));\n if (firstCondition) {\n var secondCondition = currentState.match(new RegExp('([_]|^|\\\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\\\s)', 'g'));\n if (secondCondition) {\n reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) {\n var res = item[negate];\n if (result.toUpperCase() == result) {\n res = res.toUpperCase();\n } else if (result.charAt(0).toUpperCase() == result.charAt(0)) {\n res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1);\n }\n return res;\n });\n this.insert(reg);\n reg = \"\";\n }\n }\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (range || this.getSelectionRange()).collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(compositionState) {\n this.renderer.showComposition(compositionState);\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.selection.selectAll();\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.session.getUndoManager().undo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.session.getUndoManager().redo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n if (this.$toDestroy) {\n this.$toDestroy.forEach(function(el) {\n el.destroy();\n });\n this.$toDestroy = null;\n }\n if (this.$mouseHandler)\n this.$mouseHandler.destroy();\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session)\n this.session.destroy();\n if (this._$emitInputEvent)\n this._$emitInputEvent.cancel();\n this.removeAllListeners();\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && (self.isFocused()\n || self.searchBox && self.searchBox.isFocused())\n ) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n this.prompt = function(message, options, callback) {\n var editor = this;\n config.loadModule(\"./ext/prompt\", function (module) {\n module.prompt(editor, message, options, callback);\n });\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.textInput.setReadOnly(readOnly);\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n copyWithEmptySelection: {\n set: function(value) {\n this.textInput.setCopyWithEmptySelection(value);\n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n enableAutoIndent: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.$keybindingId; },\n handlesSet: true\n },\n value: {\n set: function(val) { this.session.setValue(val); },\n get: function() { return this.getValue(); },\n handlesSet: true,\n hidden: true\n },\n session: {\n set: function(val) { this.setSession(val); },\n get: function() { return this.session; },\n handlesSet: true,\n hidden: true\n },\n \n showLineNumbers: {\n set: function(show) {\n this.renderer.$gutterLayer.setShowLineNumbers(show);\n this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER);\n if (show && this.$relativeLineNumbers)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n },\n initialValue: true\n },\n relativeLineNumbers: {\n set: function(value) {\n if (this.$showLineNumbers && value)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n }\n },\n placeholder: {\n set: function(message) {\n if (!this.$updatePlaceholder) {\n this.$updatePlaceholder = function() {\n var value = this.session && (this.renderer.$composition || this.getValue());\n if (value && this.renderer.placeholderNode) {\n this.renderer.off(\"afterRender\", this.$updatePlaceholder);\n dom.removeCssClass(this.container, \"ace_hasPlaceholder\");\n this.renderer.placeholderNode.remove();\n this.renderer.placeholderNode = null;\n } else if (!value && !this.renderer.placeholderNode) {\n this.renderer.on(\"afterRender\", this.$updatePlaceholder);\n dom.addCssClass(this.container, \"ace_hasPlaceholder\");\n var el = dom.createElement(\"div\");\n el.className = \"ace_placeholder\";\n el.textContent = this.$placeholder || \"\";\n this.renderer.placeholderNode = el;\n this.renderer.content.appendChild(this.renderer.placeholderNode);\n } else if (!value && this.renderer.placeholderNode) {\n this.renderer.placeholderNode.textContent = this.$placeholder || \"\";\n }\n }.bind(this);\n this.on(\"input\", this.$updatePlaceholder);\n }\n this.$updatePlaceholder();\n }\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n displayIndentGuides: \"renderer\",\n showGutter: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n hasCssTransforms: \"renderer\",\n maxPixelHeight: \"renderer\",\n useTextareaForIME: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimeout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n navigateWithinSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\n\nvar relativeNumberRenderer = {\n getText: function(session, row) {\n return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? \"\\xb7\" : \"\"))) + \"\";\n },\n getWidth: function(session, lastLineNumber, config) {\n return Math.max(\n lastLineNumber.toString().length,\n (config.lastRow + 1).toString().length,\n 2\n ) * config.characterWidth;\n },\n update: function(e, editor) {\n editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);\n },\n attach: function(editor) {\n editor.renderer.$gutterLayer.$renderer = this;\n editor.on(\"changeSelection\", this.update);\n this.update(null, editor);\n },\n detach: function(editor) {\n if (editor.renderer.$gutterLayer.$renderer == this)\n editor.renderer.$gutterLayer.$renderer = null;\n editor.off(\"changeSelection\", this.update);\n this.update(null, editor);\n }\n};\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.$maxRev = 0;\n this.$fromUndo = false;\n this.reset();\n};\n\n(function() {\n \n this.addSession = function(session) {\n this.$session = session;\n };\n this.add = function(delta, allowMerge, session) {\n if (this.$fromUndo) return;\n if (delta == this.$lastDelta) return;\n if (!this.$keepRedoStack) this.$redoStack.length = 0;\n if (allowMerge === false || !this.lastDeltas) {\n this.lastDeltas = [];\n this.$undoStack.push(this.lastDeltas);\n delta.id = this.$rev = ++this.$maxRev;\n }\n if (delta.action == \"remove\" || delta.action == \"insert\")\n this.$lastDelta = delta;\n this.lastDeltas.push(delta);\n };\n \n this.addSelection = function(selection, rev) {\n this.selections.push({\n value: selection,\n rev: rev || this.$rev\n });\n };\n \n this.startNewGroup = function() {\n this.lastDeltas = null;\n return this.$rev;\n };\n \n this.markIgnored = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id <= from)\n break;\n if (delta.id < to)\n delta.ignore = true;\n }\n this.lastDeltas = null;\n };\n \n this.getSelection = function(rev, after) {\n var stack = this.selections;\n for (var i = stack.length; i--;) {\n var selection = stack[i];\n if (selection.rev < rev) {\n if (after)\n selection = stack[i + 1];\n return selection;\n }\n }\n };\n \n this.getRevision = function() {\n return this.$rev;\n };\n \n this.getDeltas = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n var end = null, start = 0;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id < to && !end)\n end = i+1;\n if (delta.id <= from) {\n start = i + 1;\n break;\n }\n }\n return stack.slice(start, end);\n };\n \n this.getChangedRanges = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n \n this.getChangedLines = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n this.undo = function(session, dontSelect) {\n this.lastDeltas = null;\n var stack = this.$undoStack;\n \n if (!rearrangeUndoStack(stack, stack.length))\n return;\n \n if (!session)\n session = this.$session;\n \n if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length)\n this.$redoStack = [];\n \n this.$fromUndo = true;\n \n var deltaSet = stack.pop();\n var undoSelectionRange = null;\n if (deltaSet) {\n undoSelectionRange = session.undoChanges(deltaSet, dontSelect);\n this.$redoStack.push(deltaSet);\n this.$syncRev();\n }\n \n this.$fromUndo = false;\n\n return undoSelectionRange;\n };\n this.redo = function(session, dontSelect) {\n this.lastDeltas = null;\n \n if (!session)\n session = this.$session;\n \n this.$fromUndo = true;\n if (this.$redoStackBaseRev != this.$rev) {\n var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1);\n rebaseRedoStack(this.$redoStack, diff);\n this.$redoStackBaseRev = this.$rev;\n this.$redoStack.forEach(function(x) {\n x[0].id = ++this.$maxRev;\n }, this);\n }\n var deltaSet = this.$redoStack.pop();\n var redoSelectionRange = null;\n \n if (deltaSet) {\n redoSelectionRange = session.redoChanges(deltaSet, dontSelect);\n this.$undoStack.push(deltaSet);\n this.$syncRev();\n }\n this.$fromUndo = false;\n \n return redoSelectionRange;\n };\n \n this.$syncRev = function() {\n var stack = this.$undoStack;\n var nextDelta = stack[stack.length - 1];\n var id = nextDelta && nextDelta[0].id || 0;\n this.$redoStackBaseRev = id;\n this.$rev = id;\n };\n this.reset = function() {\n this.lastDeltas = null;\n this.$lastDelta = null;\n this.$undoStack = [];\n this.$redoStack = [];\n this.$rev = 0;\n this.mark = 0;\n this.$redoStackBaseRev = this.$rev;\n this.selections = [];\n };\n this.canUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.canRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.bookmark = function(rev) {\n if (rev == undefined)\n rev = this.$rev;\n this.mark = rev;\n };\n this.isAtBookmark = function() {\n return this.$rev === this.mark;\n };\n \n this.toJSON = function() {\n \n };\n \n this.fromJSON = function() {\n \n };\n \n this.hasUndo = this.canUndo;\n this.hasRedo = this.canRedo;\n this.isClean = this.isAtBookmark;\n this.markClean = this.bookmark;\n \n this.$prettyPrint = function(delta) {\n if (delta) return stringifyDelta(delta);\n return stringifyDelta(this.$undoStack) + \"\\n---\\n\" + stringifyDelta(this.$redoStack);\n };\n}).call(UndoManager.prototype);\n\nfunction rearrangeUndoStack(stack, pos) {\n for (var i = pos; i--; ) {\n var deltaSet = stack[i];\n if (deltaSet && !deltaSet[0].ignore) {\n while(i < pos - 1) {\n var swapped = swapGroups(stack[i], stack[i + 1]);\n stack[i] = swapped[0];\n stack[i + 1] = swapped[1];\n i++;\n }\n return true;\n }\n }\n}\n\nvar Range = require(\"./range\").Range;\nvar cmp = Range.comparePoints;\nvar comparePoints = Range.comparePoints;\n\nfunction $updateMarkers(delta) {\n var isInsert = delta.action == \"insert\";\n var start = delta.start;\n var end = delta.end;\n var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n if (isInsert) end = start;\n\n for (var i in this.marks) {\n var point = this.marks[i];\n var cmp = comparePoints(point, start);\n if (cmp < 0) {\n continue; // delta starts after the range\n }\n if (cmp === 0) {\n if (isInsert) {\n if (point.bias == 1) {\n cmp = 1;\n }\n else {\n point.bias == -1;\n continue;\n }\n }\n }\n var cmp2 = isInsert ? cmp : comparePoints(point, end);\n if (cmp2 > 0) {\n point.row += rowShift;\n point.column += point.row == end.row ? colShift : 0;\n continue;\n }\n if (!isInsert && cmp2 <= 0) {\n point.row = start.row;\n point.column = start.column;\n if (cmp2 === 0)\n point.bias = 1;\n }\n }\n}\n\n\n\nfunction clonePos(pos) {\n return {row: pos.row,column: pos.column};\n}\nfunction cloneDelta(d) {\n return {\n start: clonePos(d.start),\n end: clonePos(d.end),\n action: d.action,\n lines: d.lines.slice()\n };\n}\nfunction stringifyDelta(d) {\n d = d || this;\n if (Array.isArray(d)) {\n return d.map(stringifyDelta).join(\"\\n\");\n }\n var type = \"\";\n if (d.action) {\n type = d.action == \"insert\" ? \"+\" : \"-\";\n type += \"[\" + d.lines + \"]\";\n } else if (d.value) {\n if (Array.isArray(d.value)) {\n type = d.value.map(stringifyRange).join(\"\\n\");\n } else {\n type = stringifyRange(d.value);\n }\n }\n if (d.start) {\n type += stringifyRange(d);\n }\n if (d.id || d.rev) {\n type += \"\\t(\" + (d.id || d.rev) + \")\";\n }\n return type;\n}\nfunction stringifyRange(r) {\n return r.start.row + \":\" + r.start.column \n + \"=>\" + r.end.row + \":\" + r.end.column;\n}\n\nfunction swap(d1, d2) {\n var i1 = d1.action == \"insert\";\n var i2 = d2.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (i1 && !i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n } else if (!i1 && i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (!i1 && !i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n }\n return [d2, d1];\n}\nfunction swapGroups(ds1, ds2) {\n for (var i = ds1.length; i--; ) {\n for (var j = 0; j < ds2.length; j++) {\n if (!swap(ds1[i], ds2[j])) {\n while (i < ds1.length) {\n while (j--) {\n swap(ds2[j], ds1[i]);\n }\n j = ds2.length;\n i++;\n } \n return [ds1, ds2];\n }\n }\n }\n ds1.selectionBefore = ds2.selectionBefore = \n ds1.selectionAfter = ds2.selectionAfter = null;\n return [ds2, ds1];\n}\nfunction xform(d1, c1) {\n var i1 = d1.action == \"insert\";\n var i2 = c1.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d1.start, c1.start) < 0) {\n shift(c1, d1, 1);\n } else {\n shift(d1, c1, 1);\n }\n } else if (i1 && !i2) {\n if (cmp(d1.start, c1.end) >= 0) {\n shift(d1, c1, -1);\n } else if (cmp(d1.start, c1.start) <= 0) {\n shift(c1, d1, +1);\n } else {\n shift(d1, Range.fromPoints(c1.start, d1.start), -1);\n shift(c1, d1, +1);\n }\n } else if (!i1 && i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.start, d1.start) <= 0) {\n shift(d1, c1, +1);\n } else {\n shift(c1, Range.fromPoints(d1.start, c1.start), -1);\n shift(d1, c1, +1);\n }\n } else if (!i1 && !i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.end, d1.start) <= 0) {\n shift(d1, c1, -1);\n } else {\n var before, after;\n if (cmp(d1.start, c1.start) < 0) {\n before = d1;\n d1 = splitDelta(d1, c1.start);\n }\n if (cmp(d1.end, c1.end) > 0) {\n after = splitDelta(d1, c1.end);\n }\n\n shiftPos(c1.end, d1.start, d1.end, -1);\n if (after && !before) {\n d1.lines = after.lines;\n d1.start = after.start;\n d1.end = after.end;\n after = d1;\n }\n\n return [c1, before, after].filter(Boolean);\n }\n }\n return [c1, d1];\n}\n \nfunction shift(d1, d2, dir) {\n shiftPos(d1.start, d2.start, d2.end, dir);\n shiftPos(d1.end, d2.start, d2.end, dir);\n}\nfunction shiftPos(pos, start, end, dir) {\n if (pos.row == (dir == 1 ? start : end).row) {\n pos.column += dir * (end.column - start.column);\n }\n pos.row += dir * (end.row - start.row);\n}\nfunction splitDelta(c, pos) {\n var lines = c.lines;\n var end = c.end;\n c.end = clonePos(pos); \n var rowsBefore = c.end.row - c.start.row;\n var otherLines = lines.splice(rowsBefore, lines.length);\n \n var col = rowsBefore ? pos.column : pos.column - c.start.column;\n lines.push(otherLines[0].substring(0, col));\n otherLines[0] = otherLines[0].substr(col) ; \n var rest = {\n start: clonePos(pos),\n end: end,\n lines: otherLines,\n action: c.action\n };\n return rest;\n}\n\nfunction moveDeltasByOne(redoStack, d) {\n d = cloneDelta(d);\n for (var j = redoStack.length; j--;) {\n var deltaSet = redoStack[j];\n for (var i = 0; i < deltaSet.length; i++) {\n var x = deltaSet[i];\n var xformed = xform(x, d);\n d = xformed[0];\n if (xformed.length != 2) {\n if (xformed[2]) {\n deltaSet.splice(i + 1, 1, xformed[1], xformed[2]);\n i++;\n } else if (!xformed[1]) {\n deltaSet.splice(i, 1);\n i--;\n }\n }\n }\n if (!deltaSet.length) {\n redoStack.splice(j, 1); \n }\n }\n return redoStack;\n}\nfunction rebaseRedoStack(redoStack, deltaSets) {\n for (var i = 0; i < deltaSets.length; i++) {\n var deltas = deltaSets[i];\n for (var j = 0; j < deltas.length; j++) {\n moveDeltasByOne(redoStack, deltas[j]);\n }\n }\n}\n\nexports.UndoManager = UndoManager;\n\n});\n\nace.define(\"ace/layer/lines\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Lines = function(element, canvasHeight) {\n this.element = element;\n this.canvasHeight = canvasHeight || 500000;\n this.element.style.height = (this.canvasHeight * 2) + \"px\";\n \n this.cells = [];\n this.cellCache = [];\n this.$offsetCoefficient = 0;\n};\n\n(function() {\n \n this.moveContainer = function(config) {\n dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient);\n }; \n \n this.pageChanged = function(oldConfig, newConfig) {\n return (\n Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !==\n Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)\n );\n };\n \n this.computeLineTop = function(row, config, session) {\n var screenTop = config.firstRowScreen * config.lineHeight;\n var screenPage = Math.floor(screenTop / this.canvasHeight);\n var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight;\n return lineTop - (screenPage * this.canvasHeight);\n };\n \n this.computeLineHeight = function(row, config, session) {\n return config.lineHeight * session.getRowLineCount(row);\n };\n \n this.getLength = function() {\n return this.cells.length;\n };\n \n this.get = function(index) {\n return this.cells[index];\n };\n \n this.shift = function() {\n this.$cacheCell(this.cells.shift());\n };\n \n this.pop = function() {\n this.$cacheCell(this.cells.pop());\n };\n \n this.push = function(cell) {\n if (Array.isArray(cell)) {\n this.cells.push.apply(this.cells, cell);\n var fragment = dom.createFragment(this.element);\n for (var i=0; i foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$lines.getLength() > index + 1)\n this.$lines.pop();\n \n break;\n }\n\n cell = this.$lines.get(++index);\n if (cell) {\n cell.row = row;\n } else {\n cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$lines.push(cell);\n }\n\n this.$renderCell(cell, config, fold, row);\n row++;\n }\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$updateGutterWidth = function(config) {\n var session = this.session;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n \n var firstLineNumber = session.$firstLineNumber;\n var lastLineText = this.$lines.last() ? this.$lines.last().text : \"\";\n \n if (this.$fixedWidth || session.$useWrapMode)\n lastLineText = session.getLength() + firstLineNumber - 1;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineText, config)\n : lastLineText.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.parentNode.style.width = \n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._signal(\"changeGutterWidth\", gutterWidth);\n }\n };\n \n this.$updateCursorRow = function() {\n if (!this.$highlightGutterLine)\n return;\n \n var position = this.session.selection.getCursor();\n if (this.$cursorRow === position.row)\n return;\n \n this.$cursorRow = position.row;\n };\n \n this.updateLineHighlight = function() {\n if (!this.$highlightGutterLine)\n return;\n var row = this.session.selection.cursor.row;\n this.$cursorRow = row;\n\n if (this.$cursorCell && this.$cursorCell.row == row)\n return;\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n var cells = this.$lines.cells;\n this.$cursorCell = null;\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n if (cell.row >= this.$cursorRow) {\n if (cell.row > this.$cursorRow) {\n var fold = this.session.getFoldLine(this.$cursorRow);\n if (i > 0 && fold && fold.start.row == cells[i - 1].row)\n cell = cells[i - 1];\n else\n break;\n }\n cell.element.className = \"ace_gutter-active-line \" + cell.element.className;\n this.$cursorCell = cell;\n break;\n }\n }\n };\n \n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n \n this.$updateCursorRow();\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n this.session.getLength() - 1);\n var oldLastRow = this.oldLastRow;\n this.oldLastRow = lastRow;\n \n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldLastRow > lastRow)\n for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (lastRow > oldLastRow) {\n this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow));\n }\n \n this.updateLineHighlight();\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$renderLines = function(config, firstRow, lastRow) {\n var fragment = [];\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$renderCell(cell, config, foldLine, row);\n fragment.push(cell);\n\n row++;\n }\n return fragment;\n };\n \n this.$renderCell = function(cell, config, fold, row) {\n var element = cell.element;\n \n var session = this.session;\n \n var textNode = element.childNodes[0];\n var foldWidget = element.childNodes[1];\n\n var firstLineNumber = session.$firstLineNumber;\n \n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var gutterRenderer = session.gutterRenderer || this.$renderer;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var foldStart = fold ? fold.start.row : Number.MAX_VALUE;\n \n var className = \"ace_gutter-cell \";\n if (this.$highlightGutterLine) {\n if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) {\n className += \"ace_gutter-active-line \";\n if (this.$cursorCell != cell) {\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n this.$cursorCell = cell;\n }\n }\n }\n \n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (element.className != className)\n element.className = className;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (foldWidget.className != className)\n foldWidget.className = className;\n\n var foldHeight = config.lineHeight + \"px\";\n dom.setStyle(foldWidget.style, \"height\", foldHeight);\n dom.setStyle(foldWidget.style, \"display\", \"inline-block\");\n } else {\n if (foldWidget) {\n dom.setStyle(foldWidget.style, \"display\", \"none\");\n }\n }\n \n var text = (gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber).toString();\n \n if (text !== textNode.data) {\n textNode.data = text;\n }\n \n dom.setStyle(cell.element.style, \"height\", this.$lines.computeLineHeight(row, config, session) + \"px\");\n dom.setStyle(cell.element.style, \"top\", this.$lines.computeLineTop(row, config, session) + \"px\");\n \n cell.text = text;\n return cell;\n };\n\n this.$fixedWidth = false;\n \n this.$highlightGutterLine = true;\n this.$renderer = \"\";\n this.setHighlightGutterLine = function(highlightGutterLine) {\n this.$highlightGutterLine = highlightGutterLine;\n };\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return 0;},\n getText: function() {return \"\";}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = (parseInt(style.borderLeftWidth) || 0)\n + (parseInt(style.paddingLeft) || 0) + 1;\n this.$padding.right = (parseInt(style.borderRightWidth) || 0)\n + (parseInt(style.paddingRight) || 0);\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nfunction onCreateCell(element) {\n var textNode = document.createTextNode('');\n element.appendChild(textNode);\n \n var foldWidget = dom.createElement(\"span\");\n element.appendChild(foldWidget);\n \n return element;\n}\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n \n this.elt = function(className, css) {\n var x = this.i != -1 && this.element.childNodes[this.i];\n if (!x) {\n x = document.createElement(\"div\");\n this.element.appendChild(x);\n this.i = -1;\n } else {\n this.i++;\n }\n x.style.cssText = css;\n x.className = className;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n this.i = 0;\n var html;\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n }\n }\n if (this.i !=-1) {\n while (this.i < this.element.childElementCount)\n this.element.removeChild(this.element.lastChild);\n }\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n this.drawSingleLineMarker(stringBuilder, lineRange, \n clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n layerConfig, row == end ? 0 : 1, extraStyle);\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height = config.lineHeight;\n var top = this.$getTop(range.start.row, config);\n var left = padding + range.start.column * config.characterWidth;\n extraStyle = extraStyle || \"\";\n\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n this.elt(\n clazz + \" ace_br1 ace_start\",\n \"height:\"+ height+ \"px;\"+ \"right:0;\"+ \"top:\"+top+ \"px;left:\"+ left+ \"px;\" + (extraStyle || \"\")\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n top = this.$getTop(range.end.row, config);\n var width = range.end.column * config.characterWidth;\n\n this.elt(\n clazz + \" ace_br12\",\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n }\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height <= 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n \n var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n this.elt(\n clazz + (radiusClass ? \" ace_br\" + radiusClass : \"\"),\n \"height:\"+ height+ \"px;\"+\n \"right:0;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n if (this.session.$bidiHandler.isBidiRow(range.start.row))\n return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle);\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ left+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n this.elt(\n clazz,\n \"height:\" + height + \"px;\" +\n \"width:\" + selection.width + (extraLength || 0) + \"px;\" +\n \"top:\" + top + \"px;\" +\n \"left:\" + (padding + selection.left) + \"px;\" + (extraStyle || \"\")\n );\n }, this);\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/layer/lines\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar Lines = require(\"./lines\").Lines;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.dom = dom; \n this.element = this.dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n this.$lines = new Lines(this.element);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n this.MAX_LINE_LENGTH = 10000;\n\n this.$updateEolChar = function() {\n var doc = this.session.doc;\n var unixMode = doc.getNewLineCharacter() == \"\\n\" && doc.getNewLineMode() != \"windows\";\n var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n };\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.margin = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n };\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.showSpaces = false;\n this.showTabs = false;\n this.showEOL = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n if (typeof showInvisibles == \"string\") {\n this.showSpaces = /tab/i.test(showInvisibles);\n this.showTabs = /space/i.test(showInvisibles);\n this.showEOL = /eol/i.test(showInvisibles);\n } else {\n this.showSpaces = this.showTabs = this.showEOL = showInvisibles;\n }\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showTabs) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_tab\";\n span.textContent = lang.stringRepeat(this.TAB_CHAR, i);\n tabStr.push(span);\n } else {\n tabStr.push(this.dom.createTextNode(lang.stringRepeat(\" \", i), this.element));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = this.showSpaces ? \" ace_invisible ace_invisible_space\" : \"\";\n var spaceContent = this.showSpaces\n ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize)\n : lang.stringRepeat(\" \", this.tabSize);\n\n var tabClass = this.showTabs ? \" ace_invisible ace_invisible_tab\" : \"\";\n var tabContent = this.showTabs \n ? lang.stringRepeat(this.TAB_CHAR, this.tabSize)\n : spaceContent;\n\n var span = this.dom.createElement(\"span\");\n span.className = className + spaceClass;\n span.textContent = spaceContent;\n this.$tabStrings[\" \"] = span;\n \n var span = this.dom.createElement(\"span\");\n span.className = className + tabClass;\n span.textContent = tabContent;\n this.$tabStrings[\"\\t\"] = span;\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n return this.update(config);\n }\n \n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var heightChanged = false;\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n this.dom.removeChildren(lineElement);\n this.$renderLine(\n lineElement, row, row == foldStart ? foldLine : false\n );\n\n if (heightChanged)\n lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + \"px\";\n\n var height = (config.lineHeight * this.session.getRowLength(row)) + \"px\";\n if (lineElement.style.height != height) {\n heightChanged = true;\n lineElement.style.height = height;\n }\n }\n row++;\n }\n if (heightChanged) {\n while (lineElementsIdx < this.$lines.cells.length) {\n var cell = this.$lines.cells[lineElementsIdx++];\n cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + \"px\";\n }\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n \n var lastRow = config.lastRow;\n var oldLastRow = oldConfig ? oldConfig.lastRow : -1;\n\n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow));\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = [];\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var line = this.$lines.createCell(row, config, this.session);\n \n var lineEl = line.element;\n this.dom.removeChildren(lineEl);\n dom.setStyle(lineEl.style, \"height\", this.$lines.computeLineHeight(row, config, this.session) + \"px\");\n dom.setStyle(lineEl.style, \"top\", this.$lines.computeLineTop(row, config, this.session) + \"px\");\n this.$renderLine(lineEl, row, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups()) {\n lineEl.className = \"ace_line_group\";\n } else {\n lineEl.className = \"ace_line\";\n }\n fragment.push(line);\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.$lines.moveContainer(config);\n \n this.config = config;\n\n var firstRow = config.firstRow;\n var lastRow = config.lastRow;\n\n var lines = this.$lines;\n while (lines.getLength())\n lines.pop();\n \n lines.push(this.$renderLinesFragment(config, firstRow, lastRow));\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(parent, screenColumn, token, value) {\n var self = this;\n var re = /(\\t)|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\uFEFF\\uFFF9-\\uFFFC]+)|(\\u3000)|([\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3001-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n \n var valueFragment = this.dom.createFragment(this.element);\n\n var m;\n var i = 0;\n while (m = re.exec(value)) {\n var tab = m[1];\n var simpleSpace = m[2];\n var controlCharacter = m[3];\n var cjkSpace = m[4];\n var cjk = m[5];\n \n if (!self.showSpaces && simpleSpace)\n continue;\n\n var before = i != m.index ? value.slice(i, m.index) : \"\";\n\n i = m.index + m[0].length;\n \n if (before) {\n valueFragment.appendChild(this.dom.createTextNode(before, this.element));\n }\n \n if (tab) {\n var tabSize = self.session.getScreenTabSize(screenColumn + m.index);\n valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true));\n screenColumn += tabSize - 1;\n } else if (simpleSpace) {\n if (self.showSpaces) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length);\n valueFragment.appendChild(span);\n } else {\n valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element));\n }\n } else if (controlCharacter) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space ace_invalid\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length);\n valueFragment.appendChild(span);\n } else if (cjkSpace) {\n screenColumn += 1;\n \n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = self.showSpaces ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace;\n valueFragment.appendChild(span);\n } else if (cjk) {\n screenColumn += 1;\n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = \"ace_cjk\";\n span.textContent = cjk;\n valueFragment.appendChild(span);\n }\n }\n \n valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element));\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var span = this.dom.createElement(\"span\");\n if (token.type == \"fold\")\n span.style.width = (token.value.length * this.config.characterWidth) + \"px\";\n \n span.className = classes;\n span.appendChild(valueFragment);\n \n parent.appendChild(span);\n }\n else {\n parent.appendChild(valueFragment);\n }\n \n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(parent, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n var count = cols/this.tabSize;\n for (var i=0; i= splitChars) {\n screenColumn = this.$renderToken(\n lineEl, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n lineEl = this.$createLineElement();\n parent.appendChild(lineEl);\n\n lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat(\"\\xa0\", splits.indent), this.element));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n lineEl, screenColumn, token, value\n );\n }\n }\n }\n \n if (splits[splits.length - 1] > this.MAX_LINE_LENGTH)\n this.$renderOverflowMessage(lineEl, screenColumn, null, \"\", true);\n };\n\n this.$renderSimpleLine = function(parent, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(parent, value);\n if (value)\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n if (screenColumn + value.length > this.MAX_LINE_LENGTH)\n return this.$renderOverflowMessage(parent, screenColumn, token, value);\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n }\n };\n \n this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) {\n token && this.$renderToken(parent, screenColumn, token,\n value.slice(0, this.MAX_LINE_LENGTH - screenColumn));\n \n var overflowEl = this.dom.createElement(\"span\");\n overflowEl.className = \"ace_inline_button ace_keyword ace_toggle_wrap\";\n overflowEl.textContent = hide ? \"\" : \"\";\n \n parent.appendChild(overflowEl); \n };\n this.$renderLine = function(parent, row, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n var lastLineEl = parent;\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length) {\n this.$renderWrappedLine(parent, tokens, splits);\n var lastLineEl = parent.lastChild;\n } else {\n var lastLineEl = parent;\n if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n this.$renderSimpleLine(lastLineEl, tokens);\n }\n } else if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n\n if (this.showEOL && lastLineEl) {\n if (foldLine)\n row = foldLine.end.row;\n\n var invisibleEl = this.dom.createElement(\"span\");\n invisibleEl.className = \"ace_invisible ace_invisible_eol\";\n invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR;\n \n lastLineEl.appendChild(invisibleEl);\n }\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {};\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = this.$updateOpacity.bind(this);\n};\n\n(function() {\n \n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n dom.setStyle(cursors[i].style, \"opacity\", val ? \"\" : \"0\");\n };\n\n this.$startCssAnimation = function() {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.animationDuration = this.blinkInterval + \"ms\";\n\n this.$isAnimating = true;\n setTimeout(function() {\n if (this.$isAnimating) {\n dom.addCssClass(this.element, \"ace_animate-blinking\");\n }\n }.bind(this));\n };\n \n this.$stopCssAnimation = function() {\n this.$isAnimating = false;\n dom.removeCssClass(this.element, \"ace_animate-blinking\");\n };\n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking) {\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval) {\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n this.$stopCssAnimation();\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = false;\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible) {\n this.$stopCssAnimation();\n return;\n }\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = true;\n setTimeout(function() {\n if (this.$isSmoothBlinking) {\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }\n }.bind(this));\n }\n \n if (dom.HAS_CSS_ANIMATION) {\n this.$startCssAnimation();\n } else {\n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n \n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n blink();\n }\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.isCursorInView = function(pixelPos, config) {\n return pixelPos.top >= 0 && pixelPos.top < config.maxHeight;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var element = this.cursors[cursorIndex++] || this.addCursor();\n var style = element.style;\n \n if (!this.drawCursor) {\n if (!this.isCursorInView(pixelPos, config)) {\n dom.setStyle(style, \"display\", \"none\");\n } else {\n dom.setStyle(style, \"display\", \"block\");\n dom.translate(element, pixelPos.left, pixelPos.top);\n dom.setStyle(style, \"width\", Math.round(config.characterWidth) + \"px\");\n dom.setStyle(style, \"height\", config.lineHeight + \"px\");\n }\n } else {\n this.drawCursor(element, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.inner.textContent = \"\\xa0\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight = \n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.$recursionLimit = 2;\n this.window = win || window;\n var _self = this;\n this._flush = function(ts) {\n _self.pending = false;\n var changes = _self.changes;\n\n if (changes) {\n event.blockIdle(100);\n _self.changes = 0;\n _self.onRender(changes);\n }\n \n if (_self.changes) {\n if (_self.$recursionLimit-- < 0) return;\n _self.schedule();\n } else {\n _self.$recursionLimit = 2;\n }\n };\n};\n\n(function() {\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (this.changes && !this.pending) {\n event.nextFrame(this._flush);\n this.pending = true;\n }\n };\n\n this.clear = function(change) {\n var changes = this.changes;\n this.changes = 0;\n return changes;\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 256;\nvar USE_OBSERVER = typeof ResizeObserver == \"function\";\nvar L = 200;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n \n \n if (USE_OBSERVER)\n this.$addObserver();\n else\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function(size) {\n if (size === undefined)\n size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n \n this.$addObserver = function() {\n var self = this;\n this.$observer = new window.ResizeObserver(function(e) {\n self.checkForSizeChanges();\n });\n this.$observer.observe(this.$measureNode);\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer || this.$observer)\n return this.$pollSizeChangesTimer;\n var self = this;\n \n return this.$pollSizeChangesTimer = event.onIdle(function cb() {\n self.checkForSizeChanges();\n event.onIdle(cb, 500);\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function(node) {\n var size = {\n height: (node || this.$measureNode).clientHeight,\n width: (node || this.$measureNode).clientWidth / CHAR_COUNT\n };\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$observer)\n this.$observer.disconnect();\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n \n this.$getZoom = function getZoom(element) {\n if (!element || !element.parentElement) return 1;\n return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement);\n };\n this.$initTransformMeasureNodes = function() {\n var t = function(t, l) {\n return [\"div\", {\n style: \"position: absolute;top:\" + t + \"px;left:\" + l + \"px;\"\n }];\n };\n this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el);\n };\n this.transformCoordinates = function(clientPos, elPos) {\n if (clientPos) {\n var zoom = this.$getZoom(this.el);\n clientPos = mul(1 / zoom, clientPos);\n }\n function solve(l1, l2, r) {\n var det = l1[1] * l2[0] - l1[0] * l2[1];\n return [\n (-l2[1] * r[0] + l2[0] * r[1]) / det,\n (+l1[1] * r[0] - l1[0] * r[1]) / det\n ];\n }\n function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }\n function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; }\n function mul(a, b) { return [a * b[0], a * b[1]]; }\n\n if (!this.els)\n this.$initTransformMeasureNodes();\n \n function p(el) {\n var r = el.getBoundingClientRect();\n return [r.left, r.top];\n }\n\n var a = p(this.els[0]);\n var b = p(this.els[1]);\n var c = p(this.els[2]);\n var d = p(this.els[3]);\n\n var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a)));\n\n var m1 = mul(1 + h[0], sub(b, a));\n var m2 = mul(1 + h[1], sub(c, a));\n \n if (elPos) {\n var x = elPos;\n var k = h[0] * x[0] / L + h[1] * x[1] / L + 1;\n var ut = add(mul(x[0], m1), mul(x[1], m2));\n return add(mul(1 / k / L, ut), a);\n }\n var u = sub(clientPos, a);\n var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u);\n return mul(L, f);\n };\n \n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar config = require(\"./config\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar HScrollBar = require(\"./scrollbar\").HScrollBar;\nvar VScrollBar = require(\"./scrollbar\").VScrollBar;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar FontMetrics = require(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \"\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\npadding: 0;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\ncontain: style size layout;\\\nfont-variant-ligatures: no-common-ligatures;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncontain: style size layout;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\ncontain: strict;\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ncontain: strict;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: transparent;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\n}\\\n.ace_composition_placeholder { color: transparent }\\\n.ace_composition_marker { \\\nborder-bottom: 1px solid;\\\nposition: absolute;\\\nborder-radius: 0;\\\nmargin-top: 1px;\\\n}\\\n[ace_nocontext=true] {\\\ntransform: none!important;\\\nfilter: none!important;\\\nclip-path: none!important;\\\nmask : none!important;\\\ncontain: none!important;\\\nperspective: none!important;\\\nmix-blend-mode: initial!important;\\\nz-index: auto;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\nheight: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\nposition: absolute;\\\nheight: 1000000px;\\\nwidth: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\\\ncontain: style size layout;\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_hidpi .ace_text-layer,\\\n.ace_hidpi .ace_gutter-layer,\\\n.ace_hidpi .ace_content,\\\n.ace_hidpi .ace_gutter {\\\ncontain: strict;\\\nwill-change: transform;\\\n}\\\n.ace_hidpi .ace_text-layer > .ace_line, \\\n.ace_hidpi .ace_text-layer > .ace_line_group {\\\ncontain: strict;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\\\nopacity: 0;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_animate-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: step-end;\\\nanimation-name: blink-ace-animate;\\\nanimation-iteration-count: infinite;\\\n}\\\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: ease-in-out;\\\nanimation-name: blink-ace-animate-smooth;\\\n}\\\n@keyframes blink-ace-animate {\\\nfrom, to { opacity: 1; }\\\n60% { opacity: 0; }\\\n}\\\n@keyframes blink-ace-animate-smooth {\\\nfrom, to { opacity: 1; }\\\n45% { opacity: 1; }\\\n60% { opacity: 0; }\\\n85% { opacity: 0; }\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_error_bracket {\\\nposition: absolute;\\\nborder-bottom: 1px solid #DE5555;\\\nborder-radius: 0;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_inline_button {\\\nborder: 1px solid lightgray;\\\ndisplay: inline-block;\\\nmargin: -1px 8px;\\\npadding: 0 5px;\\\npointer-events: auto;\\\ncursor: pointer;\\\n}\\\n.ace_inline_button:hover {\\\nborder-color: gray;\\\nbackground: rgba(200,200,200,0.2);\\\ndisplay: inline-block;\\\npointer-events: auto;\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_mobile-menu {\\\nposition: absolute;\\\nline-height: 1.5;\\\nborder-radius: 4px;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\nbackground: white;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #dcdcdc;\\\ncolor: black;\\\n}\\\n.ace_dark > .ace_mobile-menu {\\\nbackground: #333;\\\ncolor: #ccc;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #444;\\\n}\\\n.ace_mobile-button {\\\npadding: 2px;\\\ncursor: pointer;\\\noverflow: hidden;\\\n}\\\n.ace_mobile-button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_mobile-button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_placeholder {\\\nfont-family: arial;\\\ntransform: scale(0.9);\\\ntransform-origin: left;\\\nwhite-space: pre;\\\nopacity: 0.7;\\\nmargin: 0 10px;\\\n}\";\n\nvar useragent = require(\"./lib/useragent\");\nvar HIDE_TEXTAREA = useragent.isIE;\n\ndom.importCssString(editorCss, \"ace_editor.css\", false);\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n\n dom.addCssClass(this.container, \"ace_editor\");\n if (dom.HI_DPI) dom.addCssClass(this.container, \"ace_hidpi\");\n\n this.setTheme(theme);\n if (config.get(\"useStrictCSP\") == null) \n config.set(\"useStrictCSP\", false);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n \n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.on(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.margin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.$keepTextAreaAtCursor = !useragent.isIOS;\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._signal(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n dom.setStyle(this.scroller.style, \"line-height\", this.lineHeight + \"px\");\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n dom.setStyle(this.scrollBarH.element.style, \"left\", gutterWidth + \"px\");\n dom.setStyle(this.scroller.style, \"left\", gutterWidth + this.margin.left + \"px\");\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h);\n dom.setStyle(this.$gutter.style, \"left\", this.margin.left + \"px\");\n \n var right = this.scrollBarV.getWidth() + \"px\";\n dom.setStyle(this.scrollBarH.element.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"bottom\", this.scrollBarH.getHeight());\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) {\n changes |= this.CHANGE_FULL;\n }\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function(width) {\n var gutterWidth = this.$showGutter ? width : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (this.$isMousePressed) return;\n var style = this.textarea.style;\n var composition = this.$composition;\n if (!this.$keepTextAreaAtCursor && !composition) {\n dom.translate(this.textarea, -100, 0);\n return;\n }\n var pixelPos = this.$cursorLayer.$pixelPos;\n if (!pixelPos)\n return;\n if (composition && composition.markerRange)\n pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true);\n \n var config = this.layerConfig;\n var posTop = pixelPos.top;\n var posLeft = pixelPos.left;\n posTop -= config.offset;\n\n var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1;\n if (posTop < 0 || posTop > config.height - h) {\n dom.translate(this.textarea, 0, 0);\n return;\n }\n\n var w = 1;\n var maxTop = this.$size.height - h;\n if (!composition) {\n posTop += this.lineHeight;\n }\n else {\n if (composition.useTextareaForIME) {\n var val = this.textarea.value;\n w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]);\n }\n else {\n posTop += this.lineHeight + 2;\n }\n }\n \n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth + this.margin.left;\n\n dom.setStyle(style, \"height\", h + \"px\");\n dom.setStyle(style, \"width\", w + \"px\");\n dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop));\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n \n this.setMargin = function(top, bottom, left, right) {\n var sm = this.margin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\", changes);\n \n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig() | this.$loop.clear();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig() | this.$loop.clear();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n \n dom.translate(this.content, -this.scrollLeft, -config.offset);\n \n var width = config.width + 2 * this.$padding + \"px\";\n var height = config.minHeight + \"px\";\n \n dom.setStyle(this.content.style, \"width\", width);\n dom.setStyle(this.content.style, \"height\", height);\n }\n if (changes & this.CHANGE_H_SCROLL) {\n dom.translate(this.content, -this.scrollLeft, -config.offset);\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$changedLines = null;\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n this.$changedLines = null;\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter) {\n if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES)\n this.$gutterLayer.update(config);\n else\n this.$gutterLayer.scrollLines(config);\n }\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$changedLines = null;\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_CURSOR) {\n if (this.$highlightGutterLine)\n this.$gutterLayer.updateLineHighlight(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\", changes);\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight, \n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n \n var hideScrollbars = desiredHeight <= 2 * this.lineHeight;\n var vScroll = !hideScrollbars && height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var offset = this.scrollTop % this.lineHeight;\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine || hScrollChanged) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n if (this.session.$bidiHandler)\n this.session.$bidiHandler.setContentWidth(longestLine - this.$padding);\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n \n if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH)\n charCount = this.$textLayer.MAX_LINE_LENGTH + 30;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight + bottomMargin - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (!_self.session) \n return clearInterval(_self.$timer);\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(x);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n \n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n \n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(composition) {\n this.$composition = composition;\n if (!composition.cssText) {\n composition.cssText = this.textarea.style.cssText;\n }\n if (composition.useTextareaForIME == undefined)\n composition.useTextareaForIME = this.$useTextareaForIME;\n \n if (this.$useTextareaForIME) {\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n this.$cursorLayer.element.style.display = \"none\";\n }\n else {\n composition.markerId = this.session.addMarker(composition.markerRange, \"ace_composition_marker\", \"text\");\n }\n };\n this.setCompositionText = function(text) {\n var cursor = this.session.selection.cursor;\n this.addToken(text, \"composition_placeholder\", cursor.row, cursor.column);\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n \n if (this.$composition.markerId)\n this.session.removeMarker(this.$composition.markerId);\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = this.$composition.cssText;\n var cursor = this.session.selection.cursor;\n this.removeExtraToken(cursor.row, cursor.column);\n this.$composition = null;\n this.$cursorLayer.element.style.display = \"\";\n };\n \n this.addToken = function(text, type, row, column) {\n var session = this.session;\n session.bgTokenizer.lines[row] = null;\n var newToken = {type: type, value: text};\n var tokens = session.getTokens(row);\n if (column == null) {\n tokens.push(newToken);\n } else {\n var l = 0;\n for (var i =0; i < tokens.length; i++) {\n var token = tokens[i];\n l += token.value.length;\n if (column <= l) {\n var diff = token.value.length - (l - column);\n var before = token.value.slice(0, diff);\n var after = token.value.slice(diff);\n \n tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after});\n break;\n }\n }\n }\n this.updateLines(row, row);\n };\n\n this.removeExtraToken = function(row, column) {\n this.updateLines(row, row);\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n if (module.$id)\n _self.$themeId = module.$id;\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n dom.setStyle(this.scroller.style, \"cursor\", style);\n };\n this.setMouseCursor = function(cursorStyle) {\n dom.setStyle(this.scroller.style, \"cursor\", cursorStyle);\n };\n \n this.attachToShadowRoot = function() {\n dom.importCssString(editorCss, \"ace_editor.css\", this.container);\n };\n this.destroy = function() {\n this.freeze();\n this.$fontMetrics.destroy();\n this.$cursorLayer.destroy();\n this.removeAllListeners();\n this.container.textContent = \"\";\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {\n this.$gutterLayer.setShowFoldWidgets(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n this.$gutterLayer.setHighlightGutterLine(shouldHighlight);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n if (!(this.$minLines < 0x1ffffffffffff))\n this.$minLines = 0;\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n },\n hasCssTransforms: {\n },\n useTextareaForIME: {\n initialValue: !useragent.isMobile && !useragent.isIE\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar net = require(\"../lib/net\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nfunction $workerBlob(workerUrl) {\n var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl) {\n if (typeof Worker == \"undefined\")\n return { postMessage: function() {}, terminate: function() {} };\n if (config.get(\"loadWorkerFromBlob\")) {\n var blob = $workerBlob(workerUrl);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n }\n return new Worker(workerUrl);\n}\n\nvar WorkerClient = function(worker) {\n if (!worker.postMessage)\n worker = this.$createWorkerFromOldConfig.apply(this, arguments);\n\n this.$worker = worker;\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n if (require.nameToUrl && !require.toUrl)\n require.toUrl = require.nameToUrl;\n\n if (config.get(\"packaged\") || !require.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod,\n classname : classname\n });\n return this.$worker;\n };\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n if (data.data && data.data.err)\n data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code};\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n\n var messageBuffer = [];\n var workerClient = new WorkerClient({\n messageBuffer: messageBuffer,\n terminate: function() {},\n postMessage: function(e) {\n messageBuffer.push(e);\n if (!main) return;\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n });\n\n workerClient.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n workerClient.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (messageBuffer.length)\n processNext();\n });\n\n return workerClient;\n};\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.off(\"change\", this.$onUpdate);\n this.session.selection.off(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(this.session, true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n };\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n blockSelect();\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(require, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n description: \"Add cursor above\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n description: \"Add cursor below\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n description: \"Add cursor above (skip current)\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n description: \"Add cursor below (skip current)\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n description: \"Select more before\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n description: \"Select more after\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n description: \"Select next before\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n description: \"Select next after\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"toggleSplitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) {\n if (editor.multiSelect.rangeCount > 1)\n editor.multiSelect.joinSelections();\n else\n editor.multiSelect.splitIntoLines();\n },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"splitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n readOnly: true\n}, {\n name: \"alignCursors\",\n description: \"Align cursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n description: \"Find all\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n description: \"Single selection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n this.splitIntoLines = function () {\n var ranges = this.ranges.length ? this.ranges : [this.getRange()];\n var newRanges = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n var row = range.start.row;\n var endRow = range.end.row;\n if (row === endRow) {\n newRanges.push(range.clone());\n } else {\n newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length));\n while (++row < endRow)\n newRanges.push(this.getLineRange(row, true));\n newRanges.push(new Range(endRow, 0, endRow, range.end.column));\n }\n if (i == 0 && !this.isBackwards())\n newRanges = newRanges.reverse();\n }\n this.toSingleRange();\n for (var i = newRanges.length; i--;)\n this.addRange(newRanges[i]);\n };\n \n this.joinSelections = function () {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.cursor);\n var anchor = this.session.documentToScreenPosition(this.anchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n var docEnd;\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = require(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n if (selection.ranges[0])\n selection.fromOrientedRange(selection.ranges[0]);\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n else\n this.multiSelect.mergeOverlappingRanges();\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n sel.fromOrientedRange(sel.ranges[0]);\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n if (!editor.textInput) return;\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n }, editor);\n\n event.addListener(el, \"keyup\", reset, editor);\n event.addListener(el, \"blur\", reset, editor);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel) {\n var token = session.getTokenAt(row, 0);\n if (!token || token.type !== \"string\")\n break;\n }\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\nexports.$id = \"ace/theme/textmate\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass, false);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"./lib/dom\");\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == \"remove\") {\n var removed = lineWidgets.splice(startRow + 1, len);\n if (!lineWidgets[startRow] && removed[removed.length - 1]) {\n lineWidgets[startRow] = removed.pop();\n }\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n if (lineWidgets[startRow] && lineWidgets[startRow].column != null) {\n if (delta.start.column > lineWidgets[startRow].column)\n startRow++;\n }\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.$registerLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n return w;\n };\n \n this.addLineWidget = function(w) {\n this.$registerLineWidget(w);\n w.session = this.session;\n \n if (!this.editor) return w;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar LineWidgets = require(\"../line_widgets\").LineWidgets;\nvar dom = require(\"../lib/dom\");\nvar Range = require(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"error_marker.css\", false);\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/range\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Range = require(\"./range\").Range;\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./multi_select\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el, options) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = el.textContent;\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el), doc, options);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.Range = Range;\nexports.Editor = Editor;\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.VirtualRenderer = Renderer;\nexports.version = exports.config.version;\n}); (function() {\n ace.require([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n window.ace[\"default\"] = window.ace;\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = window.ace;\n }\n });\n })();\n ","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions = [\n \"minLines\",\n \"maxLines\",\n \"readOnly\",\n \"highlightActiveLine\",\n \"tabSize\",\n \"enableBasicAutocompletion\",\n \"enableLiveAutocompletion\",\n \"enableSnippets\"\n];\nexports.editorOptions = editorOptions;\nvar editorEvents = [\n \"onChange\",\n \"onFocus\",\n \"onInput\",\n \"onBlur\",\n \"onCopy\",\n \"onPaste\",\n \"onSelectionChange\",\n \"onCursorChange\",\n \"onScroll\",\n \"handleOptions\",\n \"updateRef\"\n];\nexports.editorEvents = editorEvents;\nvar getAceInstance = function () {\n var ace;\n // Fallback for ace.require when vanilla ACE is hosted over a CDN\n if (window.ace) {\n ace = window.ace;\n ace.acequire = window.ace.require || window.ace.acequire;\n }\n else {\n ace = require(\"ace-builds\");\n }\n return ace;\n};\nexports.getAceInstance = getAceInstance;\nvar debounce = function (fn, delay) {\n var timer = null;\n return function () {\n var context = this;\n var args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n};\nexports.debounce = debounce;\n//# sourceMappingURL=editorOptions.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar Range = ace.require(\"ace/range\").Range;\nvar ReactAce = /** @class */ (function (_super) {\n __extends(ReactAce, _super);\n function ReactAce(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n ReactAce.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, onValidate = _a.onValidate, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, placeholder = _a.placeholder;\n this.editor = ace.edit(this.refEditor);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n for (var i = 0; i < editorProps.length; i++) {\n this.editor[editorProps[i]] = this.props.editorProps[editorProps[i]];\n }\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n this.editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n this.editor.getSession().setMode(\"ace/mode/\" + mode);\n this.editor.setTheme(\"ace/theme/\" + theme);\n this.editor.setFontSize(fontSize);\n this.editor\n .getSession()\n .setValue(!defaultValue ? value : defaultValue, cursorStart);\n if (this.props.navigateToFileEnd) {\n this.editor.navigateFileEnd();\n }\n this.editor.renderer.setShowGutter(showGutter);\n this.editor.getSession().setUseWrapMode(wrapEnabled);\n this.editor.setShowPrintMargin(showPrintMargin);\n this.editor.on(\"focus\", this.onFocus);\n this.editor.on(\"blur\", this.onBlur);\n this.editor.on(\"copy\", this.onCopy);\n this.editor.on(\"paste\", this.onPaste);\n this.editor.on(\"change\", this.onChange);\n this.editor.on(\"input\", this.onInput);\n if (placeholder) {\n this.updatePlaceholder();\n }\n this.editor\n .getSession()\n .selection.on(\"changeSelection\", this.onSelectionChange);\n this.editor.getSession().selection.on(\"changeCursor\", this.onCursorChange);\n if (onValidate) {\n this.editor.getSession().on(\"changeAnnotation\", function () {\n // tslint:disable-next-line:no-shadowed-variable\n var annotations = _this.editor.getSession().getAnnotations();\n _this.props.onValidate(annotations);\n });\n }\n this.editor.session.on(\"changeScrollTop\", this.onScroll);\n this.editor.getSession().setAnnotations(annotations || []);\n if (markers && markers.length > 0) {\n this.handleMarkers(markers);\n }\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.editor.$options;\n editorOptions_1.editorOptions.forEach(function (option) {\n if (availableOptions.hasOwnProperty(option)) {\n _this.editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReactAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n });\n this.handleOptions(this.props);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n _this.editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n _this.editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (onLoad) {\n onLoad(this.editor);\n }\n this.editor.resize();\n if (focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.componentDidUpdate = function (prevProps) {\n var oldProps = prevProps;\n var nextProps = this.props;\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n this.editor.setOption(option, nextProps[option]);\n }\n }\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n // First process editor value, as it may create a new session (see issue #300)\n if (this.editor && this.editor.getValue() !== nextProps.value) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n this.silent = true;\n var pos = this.editor.session.selection.toJSON();\n this.editor.setValue(nextProps.value, nextProps.cursorStart);\n this.editor.session.selection.fromJSON(pos);\n this.silent = false;\n }\n if (nextProps.placeholder !== oldProps.placeholder) {\n this.updatePlaceholder();\n }\n if (nextProps.mode !== oldProps.mode) {\n this.editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.theme !== oldProps.theme) {\n this.editor.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n this.editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n this.editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n this.editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n this.editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n this.editor.renderer.setShowGutter(nextProps.showGutter);\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n this.handleOptions(nextProps);\n }\n if (!isEqual(nextProps.annotations, oldProps.annotations)) {\n this.editor.getSession().setAnnotations(nextProps.annotations || []);\n }\n if (!isEqual(nextProps.markers, oldProps.markers) &&\n Array.isArray(nextProps.markers)) {\n this.handleMarkers(nextProps.markers);\n }\n // this doesn't look like it works at all....\n if (!isEqual(nextProps.scrollMargin, oldProps.scrollMargin)) {\n this.handleScrollMargins(nextProps.scrollMargin);\n }\n if (prevProps.height !== this.props.height ||\n prevProps.width !== this.props.width) {\n this.editor.resize();\n }\n if (this.props.focus && !prevProps.focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.handleScrollMargins = function (margins) {\n if (margins === void 0) { margins = [0, 0, 0, 0]; }\n this.editor.renderer.setScrollMargins(margins[0], margins[1], margins[2], margins[3]);\n };\n ReactAce.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n ReactAce.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value = this.editor.getValue();\n this.props.onChange(value, event);\n }\n };\n ReactAce.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value = this.editor.getSelection();\n this.props.onSelectionChange(value, event);\n }\n };\n ReactAce.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value = this.editor.getSelection();\n this.props.onCursorChange(value, event);\n }\n };\n ReactAce.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n if (this.props.placeholder) {\n this.updatePlaceholder();\n }\n };\n ReactAce.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event, this.editor);\n }\n };\n ReactAce.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event, this.editor);\n }\n };\n ReactAce.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n ReactAce.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n ReactAce.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n ReactAce.prototype.handleOptions = function (props) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n this.editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n ReactAce.prototype.handleMarkers = function (markers) {\n var _this = this;\n // remove foreground markers\n var currentMarkers = this.editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers except active line marker and selected word marker\n currentMarkers = this.editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i) &&\n currentMarkers[i].clazz !== \"ace_active-line\" &&\n currentMarkers[i].clazz !== \"ace_selected-word\") {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new Range(startRow, startCol, endRow, endCol);\n _this.editor.getSession().addMarker(range, className, type, inFront);\n });\n };\n ReactAce.prototype.updatePlaceholder = function () {\n // Adapted from https://stackoverflow.com/questions/26695708/how-can-i-add-placeholder-text-when-the-editor-is-empty\n var editor = this.editor;\n var placeholder = this.props.placeholder;\n var showPlaceholder = !editor.session.getValue().length;\n var node = editor.renderer.placeholderNode;\n if (!showPlaceholder && node) {\n editor.renderer.scroller.removeChild(editor.renderer.placeholderNode);\n editor.renderer.placeholderNode = null;\n }\n else if (showPlaceholder && !node) {\n node = editor.renderer.placeholderNode = document.createElement(\"div\");\n node.textContent = placeholder || \"\";\n node.className = \"ace_comment ace_placeholder\";\n node.style.padding = \"0 9px\";\n node.style.position = \"absolute\";\n node.style.zIndex = \"3\";\n editor.renderer.scroller.appendChild(node);\n }\n else if (showPlaceholder && node) {\n node.textContent = placeholder;\n }\n };\n ReactAce.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n ReactAce.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n ReactAce.propTypes = {\n mode: PropTypes.string,\n focus: PropTypes.bool,\n theme: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n height: PropTypes.string,\n width: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n showGutter: PropTypes.bool,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onPaste: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onBlur: PropTypes.func,\n onScroll: PropTypes.func,\n value: PropTypes.string,\n defaultValue: PropTypes.string,\n onLoad: PropTypes.func,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n onValidate: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n debounceChangePeriod: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableSnippets: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n navigateToFileEnd: PropTypes.bool,\n commands: PropTypes.array,\n placeholder: PropTypes.string\n };\n ReactAce.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: \"\",\n fontSize: 12,\n enableSnippets: false,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n placeholder: null,\n navigateToFileEnd: true\n };\n return ReactAce;\n}(React.Component));\nexports.default = ReactAce;\n//# sourceMappingURL=ace.js.map","ace.define(\"ace/split\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/editor\",\"ace/virtual_renderer\",\"ace/edit_session\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Editor = require(\"./editor\").Editor;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar EditSession = require(\"./edit_session\").EditSession;\n\n\nvar Split = function(container, theme, splits) {\n this.BELOW = 1;\n this.BESIDE = 0;\n\n this.$container = container;\n this.$theme = theme;\n this.$splits = 0;\n this.$editorCSS = \"\";\n this.$editors = [];\n this.$orientation = this.BESIDE;\n\n this.setSplits(splits || 1);\n this.$cEditor = this.$editors[0];\n\n\n this.on(\"focus\", function(editor) {\n this.$cEditor = editor;\n }.bind(this));\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$createEditor = function() {\n var el = document.createElement(\"div\");\n el.className = this.$editorCSS;\n el.style.cssText = \"position: absolute; top:0px; bottom:0px\";\n this.$container.appendChild(el);\n var editor = new Editor(new Renderer(el, this.$theme));\n\n editor.on(\"focus\", function() {\n this._emit(\"focus\", editor);\n }.bind(this));\n\n this.$editors.push(editor);\n editor.setFontSize(this.$fontSize);\n return editor;\n };\n\n this.setSplits = function(splits) {\n var editor;\n if (splits < 1) {\n throw \"The number of splits have to be > 0!\";\n }\n\n if (splits == this.$splits) {\n return;\n } else if (splits > this.$splits) {\n while (this.$splits < this.$editors.length && this.$splits < splits) {\n editor = this.$editors[this.$splits];\n this.$container.appendChild(editor.container);\n editor.setFontSize(this.$fontSize);\n this.$splits ++;\n }\n while (this.$splits < splits) {\n this.$createEditor();\n this.$splits ++;\n }\n } else {\n while (this.$splits > splits) {\n editor = this.$editors[this.$splits - 1];\n this.$container.removeChild(editor.container);\n this.$splits --;\n }\n }\n this.resize();\n };\n this.getSplits = function() {\n return this.$splits;\n };\n this.getEditor = function(idx) {\n return this.$editors[idx];\n };\n this.getCurrentEditor = function() {\n return this.$cEditor;\n };\n this.focus = function() {\n this.$cEditor.focus();\n };\n this.blur = function() {\n this.$cEditor.blur();\n };\n this.setTheme = function(theme) {\n this.$editors.forEach(function(editor) {\n editor.setTheme(theme);\n });\n };\n this.setKeyboardHandler = function(keybinding) {\n this.$editors.forEach(function(editor) {\n editor.setKeyboardHandler(keybinding);\n });\n };\n this.forEach = function(callback, scope) {\n this.$editors.forEach(callback, scope);\n };\n\n\n this.$fontSize = \"\";\n this.setFontSize = function(size) {\n this.$fontSize = size;\n this.forEach(function(editor) {\n editor.setFontSize(size);\n });\n };\n\n this.$cloneSession = function(session) {\n var s = new EditSession(session.getDocument(), session.getMode());\n\n var undoManager = session.getUndoManager();\n s.setUndoManager(undoManager);\n s.setTabSize(session.getTabSize());\n s.setUseSoftTabs(session.getUseSoftTabs());\n s.setOverwrite(session.getOverwrite());\n s.setBreakpoints(session.getBreakpoints());\n s.setUseWrapMode(session.getUseWrapMode());\n s.setUseWorker(session.getUseWorker());\n s.setWrapLimitRange(session.$wrapLimitRange.min,\n session.$wrapLimitRange.max);\n s.$foldData = session.$cloneFoldData();\n\n return s;\n };\n this.setSession = function(session, idx) {\n var editor;\n if (idx == null) {\n editor = this.$cEditor;\n } else {\n editor = this.$editors[idx];\n }\n var isUsed = this.$editors.some(function(editor) {\n return editor.session === session;\n });\n\n if (isUsed) {\n session = this.$cloneSession(session);\n }\n editor.setSession(session);\n return session;\n };\n this.getOrientation = function() {\n return this.$orientation;\n };\n this.setOrientation = function(orientation) {\n if (this.$orientation == orientation) {\n return;\n }\n this.$orientation = orientation;\n this.resize();\n };\n this.resize = function() {\n var width = this.$container.clientWidth;\n var height = this.$container.clientHeight;\n var editor;\n\n if (this.$orientation == this.BESIDE) {\n var editorWidth = width / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = editorWidth + \"px\";\n editor.container.style.top = \"0px\";\n editor.container.style.left = i * editorWidth + \"px\";\n editor.container.style.height = height + \"px\";\n editor.resize();\n }\n } else {\n var editorHeight = height / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = width + \"px\";\n editor.container.style.top = i * editorHeight + \"px\";\n editor.container.style.left = \"0px\";\n editor.container.style.height = editorHeight + \"px\";\n editor.resize();\n }\n }\n };\n\n}).call(Split.prototype);\n\nexports.Split = Split;\n});\n\nace.define(\"ace/ext/split\",[\"require\",\"exports\",\"module\",\"ace/split\"], function(require, exports, module) {\n\"use strict\";\nmodule.exports = require(\"../split\");\n\n}); (function() {\n ace.require([\"ace/ext/split\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar ace_builds_1 = require(\"ace-builds\");\nvar ext_split_1 = require(\"ace-builds/src-noconflict/ext-split\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar get = require(\"lodash.get\");\nvar SplitComponent = /** @class */ (function (_super) {\n __extends(SplitComponent, _super);\n function SplitComponent(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n SplitComponent.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, splits = _a.splits;\n this.editor = ace.edit(this.refEditor);\n this.editor.setTheme(\"ace/theme/\" + theme);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n var split = new ext_split_1.Split(this.editor.container, \"ace/theme/\" + theme, splits);\n this.editor.env.split = split;\n this.splitEditor = split.getEditor(0);\n this.split = split;\n // in a split scenario we don't want a print margin for the entire application\n this.editor.setShowPrintMargin(false);\n this.editor.renderer.setShowGutter(false);\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.splitEditor.$options;\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n split.forEach(function (editor, index) {\n for (var i = 0; i < editorProps.length; i++) {\n editor[editorProps[i]] = _this.props.editorProps[editorProps[i]];\n }\n var defaultValueForEditor = get(defaultValue, index);\n var valueForEditor = get(value, index, \"\");\n editor.session.setUndoManager(new ace.UndoManager());\n editor.setTheme(\"ace/theme/\" + theme);\n editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n editor.getSession().setMode(\"ace/mode/\" + mode);\n editor.setFontSize(fontSize);\n editor.renderer.setShowGutter(showGutter);\n editor.getSession().setUseWrapMode(wrapEnabled);\n editor.setShowPrintMargin(showPrintMargin);\n editor.on(\"focus\", _this.onFocus);\n editor.on(\"blur\", _this.onBlur);\n editor.on(\"input\", _this.onInput);\n editor.on(\"copy\", _this.onCopy);\n editor.on(\"paste\", _this.onPaste);\n editor.on(\"change\", _this.onChange);\n editor\n .getSession()\n .selection.on(\"changeSelection\", _this.onSelectionChange);\n editor.getSession().selection.on(\"changeCursor\", _this.onCursorChange);\n editor.session.on(\"changeScrollTop\", _this.onScroll);\n editor.setValue(defaultValueForEditor === undefined\n ? valueForEditor\n : defaultValueForEditor, cursorStart);\n var newAnnotations = get(annotations, index, []);\n var newMarkers = get(markers, index, []);\n editor.getSession().setAnnotations(newAnnotations);\n if (newMarkers && newMarkers.length > 0) {\n _this.handleMarkers(newMarkers, editor);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (availableOptions.hasOwnProperty(option)) {\n editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReaceAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n }\n _this.handleOptions(_this.props, editor);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n });\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (focus) {\n this.splitEditor.focus();\n }\n var sp = this.editor.env.split;\n sp.setOrientation(this.props.orientation === \"below\" ? sp.BELOW : sp.BESIDE);\n sp.resize(true);\n if (onLoad) {\n onLoad(sp);\n }\n };\n SplitComponent.prototype.componentDidUpdate = function (prevProps) {\n var _this = this;\n var oldProps = prevProps;\n var nextProps = this.props;\n var split = this.editor.env.split;\n if (nextProps.splits !== oldProps.splits) {\n split.setSplits(nextProps.splits);\n }\n if (nextProps.orientation !== oldProps.orientation) {\n split.setOrientation(nextProps.orientation === \"below\" ? split.BELOW : split.BESIDE);\n }\n split.forEach(function (editor, index) {\n if (nextProps.mode !== oldProps.mode) {\n editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n editor.renderer.setShowGutter(nextProps.showGutter);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n editor.setOption(option, nextProps[option]);\n }\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n _this.handleOptions(nextProps, editor);\n }\n var nextValue = get(nextProps.value, index, \"\");\n if (editor.getValue() !== nextValue) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n _this.silent = true;\n var pos = editor.session.selection.toJSON();\n editor.setValue(nextValue, nextProps.cursorStart);\n editor.session.selection.fromJSON(pos);\n _this.silent = false;\n }\n var newAnnotations = get(nextProps.annotations, index, []);\n var oldAnnotations = get(oldProps.annotations, index, []);\n if (!isEqual(newAnnotations, oldAnnotations)) {\n editor.getSession().setAnnotations(newAnnotations);\n }\n var newMarkers = get(nextProps.markers, index, []);\n var oldMarkers = get(oldProps.markers, index, []);\n if (!isEqual(newMarkers, oldMarkers) && Array.isArray(newMarkers)) {\n _this.handleMarkers(newMarkers, editor);\n }\n });\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n if (nextProps.theme !== oldProps.theme) {\n split.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.focus && !oldProps.focus) {\n this.splitEditor.focus();\n }\n if (nextProps.height !== this.props.height ||\n nextProps.width !== this.props.width) {\n this.editor.resize();\n }\n };\n SplitComponent.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n SplitComponent.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value_1 = [];\n this.editor.env.split.forEach(function (editor) {\n value_1.push(editor.getValue());\n });\n this.props.onChange(value_1, event);\n }\n };\n SplitComponent.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value_2 = [];\n this.editor.env.split.forEach(function (editor) {\n value_2.push(editor.getSelection());\n });\n this.props.onSelectionChange(value_2, event);\n }\n };\n SplitComponent.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value_3 = [];\n this.editor.env.split.forEach(function (editor) {\n value_3.push(editor.getSelection());\n });\n this.props.onCursorChange(value_3, event);\n }\n };\n SplitComponent.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n SplitComponent.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n };\n SplitComponent.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event);\n }\n };\n SplitComponent.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n SplitComponent.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n SplitComponent.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n SplitComponent.prototype.handleOptions = function (props, editor) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n SplitComponent.prototype.handleMarkers = function (markers, editor) {\n // remove foreground markers\n var currentMarkers = editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers\n currentMarkers = editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n editor\n .getSession()\n .addMarker(range, className, type, inFront);\n });\n };\n SplitComponent.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n SplitComponent.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n SplitComponent.propTypes = {\n className: PropTypes.string,\n debounceChangePeriod: PropTypes.number,\n defaultValue: PropTypes.arrayOf(PropTypes.string),\n focus: PropTypes.bool,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n height: PropTypes.string,\n mode: PropTypes.string,\n name: PropTypes.string,\n onBlur: PropTypes.func,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n orientation: PropTypes.string,\n showGutter: PropTypes.bool,\n splits: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.arrayOf(PropTypes.string),\n width: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n commands: PropTypes.array\n };\n SplitComponent.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n orientation: \"beside\",\n splits: 2,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: [],\n fontSize: 12,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false\n };\n return SplitComponent;\n}(React.Component));\nexports.default = SplitComponent;\n//# sourceMappingURL=split.js.map","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.} diffs Array of diff tuples.\n * @param {!Array.} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: abcxxxxxxdef\n // -> abcxxxdef\n // e.g: xxxabcdefxxx\n // -> defxxxabc\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The cat came. -> The cat came.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * ABXYCD\n * AXCD\n * ABXC\n * AXCD\n * ABXC\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = //g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')\n .replace(pattern_gt, '>').replace(pattern_para, '¶
');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '' + text + '';\n break;\n case DIFF_DELETE:\n html[x] = '' + text + '';\n break;\n case DIFF_EQUAL:\n html[x] = '' + text + '';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.} patches Array of Patch objects.\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar split_1 = require(\"./split\");\nvar DiffMatchPatch = require(\"diff-match-patch\");\nvar DiffComponent = /** @class */ (function (_super) {\n __extends(DiffComponent, _super);\n function DiffComponent(props) {\n var _this = _super.call(this, props) || this;\n _this.state = {\n value: _this.props.value\n };\n _this.onChange = _this.onChange.bind(_this);\n _this.diff = _this.diff.bind(_this);\n return _this;\n }\n DiffComponent.prototype.componentDidUpdate = function () {\n var value = this.props.value;\n if (value !== this.state.value) {\n this.setState({ value: value });\n }\n };\n DiffComponent.prototype.onChange = function (value) {\n this.setState({\n value: value\n });\n if (this.props.onChange) {\n this.props.onChange(value);\n }\n };\n DiffComponent.prototype.diff = function () {\n var dmp = new DiffMatchPatch();\n var lhString = this.state.value[0];\n var rhString = this.state.value[1];\n if (lhString.length === 0 && rhString.length === 0) {\n return [];\n }\n var diff = dmp.diff_main(lhString, rhString);\n dmp.diff_cleanupSemantic(diff);\n var diffedLines = this.generateDiffedLines(diff);\n var codeEditorSettings = this.setCodeMarkers(diffedLines);\n return codeEditorSettings;\n };\n DiffComponent.prototype.generateDiffedLines = function (diff) {\n var C = {\n DIFF_EQUAL: 0,\n DIFF_DELETE: -1,\n DIFF_INSERT: 1\n };\n var diffedLines = {\n left: [],\n right: []\n };\n var cursor = {\n left: 1,\n right: 1\n };\n diff.forEach(function (chunk) {\n var chunkType = chunk[0];\n var text = chunk[1];\n var lines = text.split(\"\\n\").length - 1;\n // diff-match-patch sometimes returns empty strings at random\n if (text.length === 0) {\n return;\n }\n var firstChar = text[0];\n var lastChar = text[text.length - 1];\n var linesToHighlight = 0;\n switch (chunkType) {\n case C.DIFF_EQUAL:\n cursor.left += lines;\n cursor.right += lines;\n break;\n case C.DIFF_DELETE:\n // If the deletion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.left++;\n lines--;\n }\n linesToHighlight = lines;\n // If the deletion does not include a newline, highlight the same line on the right\n if (linesToHighlight === 0) {\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left + linesToHighlight\n });\n cursor.left += lines;\n break;\n case C.DIFF_INSERT:\n // If the insertion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.right++;\n lines--;\n }\n linesToHighlight = lines;\n // If the insertion does not include a newline, highlight the same line on the left\n if (linesToHighlight === 0) {\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right + linesToHighlight\n });\n cursor.right += lines;\n break;\n default:\n throw new Error(\"Diff type was not defined.\");\n }\n });\n return diffedLines;\n };\n // Receives a collection of line numbers and iterates through them to highlight appropriately\n // Returns an object that tells the render() method how to display the code editors\n DiffComponent.prototype.setCodeMarkers = function (diffedLines) {\n if (diffedLines === void 0) { diffedLines = { left: [], right: [] }; }\n var codeEditorSettings = [];\n var newMarkerSet = {\n left: [],\n right: []\n };\n for (var i = 0; i < diffedLines.left.length; i++) {\n var markerObj = {\n startRow: diffedLines.left[i].startLine - 1,\n endRow: diffedLines.left[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.left.push(markerObj);\n }\n for (var i = 0; i < diffedLines.right.length; i++) {\n var markerObj = {\n startRow: diffedLines.right[i].startLine - 1,\n endRow: diffedLines.right[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.right.push(markerObj);\n }\n codeEditorSettings[0] = newMarkerSet.left;\n codeEditorSettings[1] = newMarkerSet.right;\n return codeEditorSettings;\n };\n DiffComponent.prototype.render = function () {\n var markers = this.diff();\n return (React.createElement(split_1.default, { name: this.props.name, className: this.props.className, focus: this.props.focus, orientation: this.props.orientation, splits: this.props.splits, mode: this.props.mode, theme: this.props.theme, height: this.props.height, width: this.props.width, fontSize: this.props.fontSize, showGutter: this.props.showGutter, onChange: this.onChange, onPaste: this.props.onPaste, onLoad: this.props.onLoad, onScroll: this.props.onScroll, minLines: this.props.minLines, maxLines: this.props.maxLines, readOnly: this.props.readOnly, highlightActiveLine: this.props.highlightActiveLine, showPrintMargin: this.props.showPrintMargin, tabSize: this.props.tabSize, cursorStart: this.props.cursorStart, editorProps: this.props.editorProps, style: this.props.style, scrollMargin: this.props.scrollMargin, setOptions: this.props.setOptions, wrapEnabled: this.props.wrapEnabled, enableBasicAutocompletion: this.props.enableBasicAutocompletion, enableLiveAutocompletion: this.props.enableLiveAutocompletion, value: this.state.value, markers: markers }));\n };\n DiffComponent.propTypes = {\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n enableBasicAutocompletion: PropTypes.bool,\n enableLiveAutocompletion: PropTypes.bool,\n focus: PropTypes.bool,\n fontSize: PropTypes.number,\n height: PropTypes.string,\n highlightActiveLine: PropTypes.bool,\n maxLines: PropTypes.number,\n minLines: PropTypes.number,\n mode: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n onChange: PropTypes.func,\n orientation: PropTypes.string,\n readOnly: PropTypes.bool,\n scrollMargin: PropTypes.array,\n setOptions: PropTypes.object,\n showGutter: PropTypes.bool,\n showPrintMargin: PropTypes.bool,\n splits: PropTypes.number,\n style: PropTypes.object,\n tabSize: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.array,\n width: PropTypes.string,\n wrapEnabled: PropTypes.bool\n };\n DiffComponent.defaultProps = {\n cursorStart: 1,\n editorProps: {},\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n focus: false,\n fontSize: 12,\n height: \"500px\",\n highlightActiveLine: true,\n maxLines: null,\n minLines: null,\n mode: \"\",\n name: \"ace-editor\",\n onLoad: null,\n onScroll: null,\n onPaste: null,\n onChange: null,\n orientation: \"beside\",\n readOnly: false,\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n showGutter: true,\n showPrintMargin: true,\n splits: 2,\n style: {},\n tabSize: 4,\n theme: \"github\",\n value: [\"\", \"\"],\n width: \"500px\",\n wrapEnabled: true\n };\n return DiffComponent;\n}(React.Component));\nexports.default = DiffComponent;\n//# sourceMappingURL=diff.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ace_1 = require(\"./ace\");\nvar diff_1 = require(\"./diff\");\nexports.diff = diff_1.default;\nvar split_1 = require(\"./split\");\nexports.split = split_1.default;\nexports.default = ace_1.default;\n//# sourceMappingURL=index.js.map"],"names":["ACE_NAMESPACE","global","define","module","deps","payload","_require","parentId","callback","lookup","params","i","l","dep","require","packagedModule","normalizeModule","moduleName","chunks","base","previous","exports","mod","req","returnValue","exportAce","ns","root","_navigator","os","ua","appName","useragent","XHTML_NS","buildDom","arr","parent","refs","txt","els","ch","el","options","childIndex","n","val","doc","tag","element","textContent","name","classes","index","add","node","className","include","id","sheets","strictCSP","cssCache","value","insertPendingStyles","cache","item","importCssString","cssText","target","container","style","uri","document","inner","outer","body","noScrollbar","withScrollbar","styles","property","div","tx","ty","ctor","superCtor","obj","mixin","key","proto","oop","Keys","ret","mods","x","keyCode","keyString","keys","pressedKeys","ts","activeListenerOptions","detectListenerOptionsSupport","e","getListenerOptions","EventListener","elem","type","removeListener","addListener","destroyer","eventHandler","releaseCaptureHandler","ownerDocument","onMouseUp","factor","elements","timeouts","callbackName","clicks","startX","startY","timer","eventNames","onMousedown","isNewClick","getModifierHash","normalizeCommandKeys","hashId","location","dt","lastKeyDownKeyCode","lastDefaultPrevented","result","resetPressedKeys","postMessageId","win","messageName","listener","cb","timeout","handler","delay","comparePoints","p1","p2","Range","startRow","startColumn","endRow","endColumn","range","row","column","cmp","end","start","p","firstRow","lastRow","session","screenPosStart","screenPosEnd","a","string","count","trimBeginRegexp","trimEndRegexp","copy","array","deepCopy","map","props","str","regExp","matches","fcn","deferred","defaultTimeout","_self","$cancelT","event","dom","lang","clipboard","BROKEN_SETDATA","USE_IE_MIME_TYPE","HAS_FOCUS_ARGS","MAX_LINE_LENGTH","KEYS","MODS","isIOS","valueResetRegex","isMobile","TextInput","parentNode","host","text","copied","pasted","inComposition","sendingText","tempStyle","commandMode","ignoreFocusEvents","lastValue","lastSelectionStart","lastSelectionEnd","lastRestoreEnd","isFocused","resetSelection","top","isTransformed","ancestors","t","curOp","commandName","isUserAction","onCompositionEnd","newValue","selectionStart","selectionEnd","afterContextMenu","line","selection","prevLine","nextLine","isAllSelected","onSelect","inputHandler","sendText","fromInput","extendLeft","extendRight","inserted","restoreStart","restoreEnd","endIndex","shouldReset","onInput","onCompositionUpdate","data","handleClipboardData","forceIEMime","clipboardData","mime","doCopy","isCut","onCut","onCopy","onPaste","onCompositionStart","cancelComposition","syncComposition","onKeyup","readOnly","bringToFront","rect","left","maxTop","move","closeTimeout","onContextMenuClose","onContextMenu","addIosSelectionHandler","typingResetTimeout","typing","detectArrowKeys","modifier","command","_isMobile","_isIOS","DRAG_OFFSET","SCROLL_COOLDOWN_T","DefaultHandlers","mouseHandler","editor","ev","inSelection","pos","button","selectionRange","selectionEmpty","waitForClickSelection","anchor","cursor","orientedRange","calcRangeOrientation","unitName","cmpStart","cmpEnd","distance","calcDistance","time","prevScroll","vx","vy","direction","canScroll","isSlower","ax","ay","bx","by","Tooltip","html","y","GutterHandler","gutter","tooltip","GutterTooltip","gutterRegion","tooltipTimeout","mouseEvent","tooltipAnnotation","showTooltip","annotation","hideTooltip","maxRow","screenRow","moveTooltip","gutterElement","windowWidth","windowHeight","width","height","MouseEvent","domEvent","AUTOSCROLL_DELAY","SCROLL_CURSOR_DELAY","SCROLL_CURSOR_HYSTERESIS","DragdropHandler","dragImage","mouseTarget","dragSelectionMarker","timerId","dragCursor","counter","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","self","dataTransfer","dropEffect","canAccept","addDragMarker","getDropEffect","onMouseMoveTimer","clearDragMarker","dropData","scrollCursorIntoView","prevCursor","now","vMovement","hMovement","autoScroll","lineHeight","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","onDragInterval","onMouseMove","types","copyAllowed","moveAllowed","copyModifierState","effectAllowed","interval","cursorStyle","clickCount","eventTarget","mode","touchStartT","lastT","longTouchTimer","animationTimer","animationSteps","vX","vY","pressed","contextMenu","createContextMenu","isOpen","updateMenu","selected","hasUndo","handleClick","action","showContextMenu","pagePos","leftOffset","scrollLeft","hideContextMenu","handleLongTap","switchToSelectionMode","textarea","touches","h","w","touchObj","cursorPos","anchorPos","offsetTop","offsetLeft","weightedDistance","diff1","diff2","animate","wheelX","wheelY","oldScrollTop","url","xhr","path","head","s","_","isAbort","EventEmitter","stopPropagation","preventDefault","eventName","listeners","defaultHandler","newCallback","resolve","handlers","old","disabled","capturing","optionsProvider","optList","optionNames","opt","warn","message","reportError","msg","AppConfig","opts","optionHash","net","component","parts","sep","re","subst","onLoad","moduleType","afterLoad","reportErrorIfPathIsNotConfigured","init","packaged","scriptOptions","scriptUrl","currentScript","currentDocument","scripts","script","src","attributes","j","attr","deHyphenate","m","m1","DefaultGutterHandler","addTouchListeners","config","MouseHandler","focusEditor","windowBlurred","gutterEl","character","renderer","state","mouseMoveHandler","onCaptureEnd","onOperationEnd","onCaptureInterval","stop","FoldHandler","position","fold","keyUtil","KeyBinding","kb","toExecute","success","commands","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","LTR","RTL","L","R","EN","AN","ON","B","S","AL","WS","CS","ES","ET","NSM","LRE","RLE","PDF","LRO","RLO","BN","UnicodeTBL00","UnicodeTBL20","_computeLevels","chars","levels","len","charTypes","impTab","prevState","newClass","newLevel","newState","cond","condPos","ix","_getCharacterType","_getCharClass","_invertLevel","lev","_array","lo","hi","tmp","cType","wType","nType","c","rtlCandidate","uc","textCharTypes","isRtl","logicalFromVisual","bidiLevels","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","docRow","splitIndex","delta","rowCache","currentIndex","prevIndex","isLastRow","endOfLine","splits","shift","size","fontMetrics","bidiCharWidth","showInvisibles","eolChar","isRtlDir","col","leftBoundary","logicalIdx","visualIdx","startCol","endCol","level","selections","offset","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","posX","charWidth","Selection","lead","reverse","anchorRow","anchorColumn","cursorRow","cursorColumn","wasEmpty","wasMultiselect","mover","excludeLastChar","rowStart","rowEnd","foldLine","tabSize","firstColumnPosition","beforeCursor","leadingSpace","lineEnd","textEnd","rightOfCursor","leftOfCursor","whitespaceRe","tokenRe","rows","screenPos","offsetX","widget","docPos","keepDesiredColumn","r","func","r1","MAX_TOKEN_COUNT","Tokenizer","rules","ruleRegExps","matchTotal","mapping","flag","splitterRurles","rule","adjustedregex","matchcount","match","digit","values","tokens","stack","inChClass","lastCapture","esc","parenOpen","parenClose","square","startState","currentState","lastIndex","matchAttempts","token","skipped","TextHighlightRules","prefix","HighlightRules","escapeRules","states","append","embedRules","addRules","pushState","popState","processState","toInsert","next","stateName","includeName","args","defaultToken","ignoreCase","splitChar","keywords","list","word","Behaviour","behaviours","filter","TokenIterator","initialRow","initialColumn","rowCount","rowTokens","tokenIndex","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","context","contextCache","defaultQuotes","initContext","getWrapped","opening","closing","rowDiff","CstyleBehaviour","rightChar","matching","openBracePos","next_indent","indent","quotes","quote","leftChar","rightToken","stringBefore","stringAfter","pair","wordRe","isWordBefore","isWordAfter","charBefore","iterator","iterator2","bracket","wordChars","code","unicode","Mode","ignoreBlankLines","shouldRemove","minIndent","insertAtTabStop","regexpStart","lineCommentStart","uncomment","shouldInsertSpace","commentWithSpace","comment","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","fun","minEmptyLength","initialRange","colDiff","startRange","endRange","tab","input","delegations","scope","functionName","method","language","split","param","completionKeywords","ruleItr","aLength","docLines","doNotValidate","lines","Anchor","point","$getTransformedPoint","$pointsInOrder","point1","point2","equalPointsInOrder","bColIsAfter","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","noClip","applyDelta","Document","textOrLines","newLineMode","length","deleteFirstNewLine","deleteLastNewLine","deletedLines","deltas","isInsert","docLength","MAX","from","to","chunk","newlineLength","BackgroundTokenizer","tokenizer","workerStart","currentLine","endLine","startLine","processedLines","SearchHighlight","clazz","markerLayer","ranges","FoldLine","foldData","folds","last","b","lastEnd","isNewRow","foldBefore","newFoldLine","foldLineNext","idx","lastFoldEndColumn","RangeList","excludeEdges","startIndex","removed","clipped","lineDif","Fold","placeholder","subFold","consumeRange","afterStart","firstConsumed","consumedFolds","k","restoreRange","consumePoint","restorePoint","Folding","side","foldLines","foundFolds","trim","lastFold","startFoldLine","first","added","startFold","endFold","cloneFolds","expandInner","outermostFolds","startFoldRow","textLine","lastColumn","fd","tryToUnfold","bracketPos","depth","test","foldWidgets","foldMode","ignoreCurrent","fw","firstRange","toggleParent","BracketMatch","chr","charBeforeCursor","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","cacheArray","low","mid","removedFolds","undoManager","navigateWithinSoftTabs","overwrite","inFront","marker","markerId","markers","highlight","annotations","inToken","wordRange","useWorker","$isPlaceholder","oldMode","onReloadTokenizer","scrollTop","force","longestScreenLine","foldIndex","foldStart","dontSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentString","rowRange","deleteRange","diff","useWrapMode","min","max","desiredLimit","$printMargin","limits","wrapLimit","limit","foldLineBefore","wrapData","walkTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","CHAR","CHAR_EXT","PUNCTUATION","SPACE","TAB","TAB_SPACE","displayLength","lastSplit","lastDocSplit","isCode","indentedSoftWrap","maxIndent","getWrapIndent","indentation","addSplit","minSplit","isFullWidth","maxScreenColumn","screenColumn","docColumn","rowLength","doCache","wrapIndent","foldStartRow","wrapRow","screenRowOffset","screenRows","fm","Search","sr","sc","er","ec","prevRange","replacement","$disableFakeMultiline","needle","addWordBoundary","backwards","skipCurrent","forEach","forEachInLine","wordBoundary","KEY_MODS","HashHandler","platform","MultiHashHandler","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","binding","getPosition","other","otherPos","keyList","CommandManager","bindKey","mac","cutLine","isBackwards","firstLineEndCol","selectedText","selectedCount","insertLine","curLine","newRanges","defaultCommands","Editor","commandEvent","scrollIntoView","sel","prev","mergeableCommands","shouldMerge","keyboardHandler","oldSession","theme","markerType","currentTag","prevToken","stepCount","tmpToken","sbm","wrap","wordWithBoundary","nl","copyLine","lineMode","isFullLine","transform","d","lineState","shouldOutdent","lineIndent","selectedRange","prevLineState","currIndent","composition","applyComposition","speed","dragDelay","shouldHighlight","shouldAnimate","display","showPrintMargin","enabled","show","fade","new_range","swap","originalRange","_numberRx","number","amount","charRange","nr","fp","decimals","nnr","replaceRange","currWordStart","wordParts","curLength","itLength","that","wordPairs","reg","negate","firstCondition","secondCondition","res","endPoint","moved","totalDiff","rangeIndex","subRows","compositionState","select","center","expand","matchType","found","bracketType","brackets","lineNumber","times","replaced","newRange","shouldScroll","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","cursorLayer","relativeNumberRenderer","lastLineNumber","UndoManager","allowMerge","rev","rearrangeUndoStack","deltaSet","undoSelectionRange","rebaseRedoStack","redoSelectionRange","nextDelta","stringifyDelta","swapped","swapGroups","clonePos","cloneDelta","stringifyRange","d1","d2","i1","i2","ds1","ds2","xform","c1","splitDelta","shiftPos","rowsBefore","otherLines","rest","moveDeltasByOne","redoStack","xformed","deltaSets","Lines","canvasHeight","oldConfig","newConfig","screenTop","screenPage","lineTop","cell","fragment","initElement","Gutter","parentEl","rowInfo","annoText","onCreateCell","gutterRenderer","firstLineNumber","lastLineText","gutterWidth","padding","cells","oldLastRow","textNode","foldWidget","breakpoints","decorations","foldHeight","highlightGutterLine","Marker","css","layerConfig","getBorderClass","tl","tr","br","bl","stringBuilder","extraStyle","curr","lineRange","range1","radiusClass","extraLength","Text","unixMode","EOL_CHAR","measure","tabStr","span","spaceClass","spaceContent","tabClass","tabContent","lineElements","lineElementsIdx","heightChanged","lineElement","lineEl","valueFragment","simpleSpace","controlCharacter","cjkSpace","cjk","cols","splitChars","hide","overflowEl","lastLineEl","invisibleEl","renderTokens","addTokens","Cursor","cursors","blinking","blinkInterval","smoothBlinking","update","blink","onScreen","cursorLeft","cursorTop","pixelPos","cursorIndex","MAX_SCROLL_H","ScrollBar","isVisible","VScrollBar","HScrollBar","RenderLoop","onRender","changes","change","CHAR_COUNT","USE_OBSERVER","FontMetrics","isRoot","boldSize","getZoom","clientPos","elPos","zoom","mul","solve","l1","l2","det","sub","m2","ut","u","f","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","HIDE_TEXTAREA","VirtualRenderer","textLayer","oldSize","right","availableWidth","containerEl","posTop","posLeft","bottom","sm","alwaysVisible","scrollHeight","scrollerHeight","st","maxHeight","desiredHeight","hideScrollbars","screenLines","longestLine","horizScroll","hScrollChanged","vScrollBefore","minHeight","scrollPastEnd","vScrollChanged","lineCount","firstRowScreen","firstRowHeight","charCount","$viewMargin","topMargin","bottomMargin","alignment","fromValue","toValue","steps","x_min","dx","initialScroll","oldSteps","deltaX","deltaY","canvasPos","newToken","$workerBlob","workerUrl","BlobBuilder","blobBuilder","createWorker","blob","URL","blobURL","WorkerClient","worker","topLevelNamespaces","classname","importScripts","normalizePath","tlns","err","cmd","ex","q","UIWorkerClient","main","emitSync","sender","messageBuffer","workerClient","processNext","callbackId","Main","PlaceHolder","others","mainClass","othersClass","undoStack","lengthDiff","inMainRange","distanceFromStart","newPos","updateMarker","undosRequired","isSamePoint","onMouseDown","alt","ctrl","accel","isMultiSelect","mouseX","mouseY","onMouseSelection","screenAnchor","screenCursor","selectionMode","oldRange","tmpSel","rectSel","blockSelect","newCursor","onMouseSelectionEnd","onSelectionInterval","search","find","$blockChangeEvents","lastRange","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","yBackwards","docEnd","markerList","keepOrder","$byLines","rangeList","cmdResult","anim","buf","additive","skip","screenLead","toRemove","all","words","stopAtFirst","sameRowRanges","fr","lr","guessRange","maxCol","minSpace","spaceOffsets","spaceOffset","forceLeft","isLeftAligned","isRightAligned","startW","textW","endW","alignLeft","alignRight","unAlign","MultiSelect","addAltCursorListeners","altCursor","altDown","reset","FoldMode","foldStyle","startLevel","LineWidgets","lineWidgets","noWidgets","w1","changedWidgets","binarySearch","comparator","findAnnotations","matched","oldWidget","gutterAnno","arrow","Renderer","_id","oldNode","env","editorOptions_1","editorOptions","editorEvents","getAceInstance","ace","require$$0","debounce","fn","__extends","this","extendStatics","__","__assign","ace_1","PropTypes","React","require$$1","isEqual","require$$2","require$$3","ReactAce","_super","_this","_a","onBeforeLoad","onValidate","focus","fontSize","defaultValue","cursorStart","showGutter","wrapEnabled","_b","scrollMargin","editorProps","availableOptions","option","prevProps","oldProps","nextProps","appliedClasses","appliedClassesArray_1","oldClassesArray","oldClass","margins","setOptions","currentMarkers","showPlaceholder","divStyle","Split","keybinding","isUsed","orientation","editorWidth","editorHeight","FUNC_ERROR_TEXT","HASH_UNDEFINED","INFINITY","funcTag","genTag","symbolTag","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reRegExpChar","reEscapeChar","reIsHostCtor","freeGlobal","freeSelf","getValue","object","isHostObject","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","uid","funcToString","hasOwnProperty","objectToString","reIsNative","Symbol","splice","Map","getNative","nativeCreate","symbolProto","symbolToString","Hash","entries","entry","hashClear","hashDelete","hashGet","hashHas","hashSet","ListCache","listCacheClear","listCacheDelete","assocIndexOf","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","eq","baseGet","isKey","castPath","toKey","baseIsNative","isObject","isMasked","pattern","isFunction","toSource","baseToString","isSymbol","isArray","stringToPath","isKeyable","memoize","toString","resolver","memoized","isObjectLike","get","lodash_get","ace_builds_1","ext_split_1","require$$4","require$$5","require$$6","SplitComponent","defaultValueForEditor","valueForEditor","newAnnotations","newMarkers","sp","nextValue","oldAnnotations","oldMarkers","value_1","value_2","value_3","diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","lineStart","lineArrayLength","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","pattern_amp","pattern_lt","pattern_gt","pattern_para","levenshtein","insertions","deletions","diffsLength","match_bitapScore_","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","finish","rd","charMatch","patch","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","paddingLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","sign","coords1","coords2","split_1","DiffMatchPatch","DiffComponent","lhString","rhString","diffedLines","codeEditorSettings","C","chunkType","firstChar","lastChar","linesToHighlight","newMarkerSet","markerObj","lib","diff_1","_default"],"mappings":"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,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,GAAG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"}